如何使用 HPA 和 Cluster Autoscaler 对 GKE 节点的资源利用率进行碎片整理
How to defrag resource utilization of GKE node with HPA and Cluster Autoscaler
在 GKE 上使用 HPA(Horizontal 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 完全解决了问题...
- 配置节点池机器类型和 pod 资源请求,以便一个节点上只能容纳一个 pod。如果通过HPA从一个节点删除一个pod,该节点会在一段时间后被删除,但它不适用于各种资源请求的部署。
- 尽可能使用抢占式节点...
抱歉,我没有提到 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实例组大小比之前小了。我认为它有效!
感谢大家在问题中的评论!
在 GKE 上使用 HPA(Horizontal 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 完全解决了问题...
- 配置节点池机器类型和 pod 资源请求,以便一个节点上只能容纳一个 pod。如果通过HPA从一个节点删除一个pod,该节点会在一段时间后被删除,但它不适用于各种资源请求的部署。
- 尽可能使用抢占式节点...
抱歉,我没有提到 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实例组大小比之前小了。我认为它有效!
感谢大家在问题中的评论!