如何使用 HPA 和 Cluster Autoscaler 对 GKE 节点的资源利用率进行碎片整理

How to defrag resource utilization of GKE node with HPA and Cluster Autoscaler

在 GKE 上使用 HPA(Horizo​​ntal Pod Autoscaler)和 Cluster Autoscaler,pods 和节点按预期扩展。然而,当需求减少时,pods 似乎从随机节点中删除。它会导致较少使用的节点。性价比不高...

编辑:HPA 基于 targetCPUUtilizationPercentage 单一指标。未使用 VPA。

这是用于部署和 HPA 的简化 yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: foo
spec:
  replicas: 1
  templates:
    spec:
      containers:
      - name: c1
        resources:                                                                                                             
          requests:                                                                                                            
            cpu: 200m                                                                                                          
            memory: 1.2G                                                                                                       
      - name: C2
        resources:                                                                                                             
          requests:                                                                                                            
            cpu: 10m                                                                                                           
        volumeMounts:                                                                                                          
        - name: log-share                                                                                                      
          mountPath: /mnt/log-share                                                                                            
      - name: C3
        resources:
          requests:
            cpu: 10m
          limits:
            cpu: 100m
        - name: log-share                                                                                                      
          mountPath: /mnt/log-share                                                                                            
      volumes:
      - name: log-share
        emptyDir: {}

---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: foo
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: foo
  minReplicas: 1
  maxReplicas: 60
  targetCPUUtilizationPercentage: 80
...

EDIT2:添加一个 emptyDir 卷作为有效示例。

如何改善这种情况?

有一些想法,但是 none 完全解决了问题...

抱歉,我没有提到 emptyDir 的使用(在问题中编辑了 yaml)。

当我自己评论这个问题时,我发现 What types of pods can prevent CA from removing a node? 在 Autoscaler FAQ 中。

Pods with local storage. *

emptyDir 卷是本地存储,因此我需要在部署的 pod 模板中添加以下注释,以标记 pod 可以安全地从利用率较低的节点中逐出。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: foo
spec:
  selector:
    matchLabels:
      app: foo
  template:
    metadata:
      labels:
        app: foo
      annotations:
        cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
    spec:
      ...

指定注解后,GKE节点池的GCE实例组大小比之前小了。我认为它有效!

感谢大家在问题中的评论!