如何实现GKE集群在Pod停止后自动缩容至0节点?求解决方案
解决方案汇总
一、应用测试完成后停止Pod
Bash脚本方式
直接通过kubectl命令将目标应用的Deployment/StatefulSet缩容到0副本,或删除测试专用Pod:
# 方式1:缩容Deployment到0副本(保留资源配置) kubectl scale deployment <你的应用Deployment名称> --replicas=0 -n <命名空间> # 方式2:删除测试专用Pod(适合一次性测试Pod) kubectl delete pod -l app=<测试应用标签> -n <命名空间>
YAML配置方式(结合Job触发)
如果测试流程通过Job执行,可在测试完成后用清理Job停止应用Pod:
apiVersion: batch/v1 kind: Job metadata: name: test-cleanup-job spec: template: spec: containers: - name: cleanup image: google/cloud-sdk:latest command: ["kubectl", "scale", "deployment/<你的应用Deployment名称>", "--replicas=0", "-n=<命名空间>"] restartPolicy: OnFailure backoffLimit: 2
注意:需为该Job的ServiceAccount绑定Deployment的scale权限
二、GKE集群缩容至0节点
用gcloud命令调整节点池节点数到0,脚本如下:
# 缩容单区域集群的节点池到0 gcloud container clusters resize <集群名称> --node-pool <节点池名称> --num-nodes=0 --zone <集群所在区域> # 缩容多区域集群的节点池到0 gcloud container clusters resize <集群名称> --node-pool <节点池名称> --num-nodes=0 --region <集群所在区域>
提示:缩容前确保所有用户Pod已停止,避免强制驱逐导致数据丢失
三、是否需要使用CronJob?
- 若测试和清理是定时执行(比如每日凌晨自动执行),用CronJob最合适,示例配置:
apiVersion: batch/v1 kind: CronJob metadata: name: daily-test-cleanup spec: schedule: "0 2 * * *" # 每天凌晨2点执行 jobTemplate: spec: template: spec: containers: - name: cleanup image: google/cloud-sdk:latest command: ["bash", "-c", "kubectl scale deployment/<应用名称> --replicas=0 -n <命名空间> && gcloud container clusters resize <集群名> --node-pool <节点池> --num-nodes=0 --zone <区域>"] restartPolicy: OnFailure backoffLimit: 2
- 若为测试完成后立即触发的清理,无需CronJob,直接在测试脚本末尾追加清理命令,或用Kubernetes Job关联测试流程即可。
四、将系统Pod迁移到单个节点
步骤1:给目标节点打标签
选择一个节点作为系统Pod专属节点,添加标签:
kubectl label nodes <目标节点名称> node-role.kubernetes.io/system-pod=yes
步骤2:修改系统Pod部署配置
给kube-system下的Deployment/DaemonSet添加nodeSelector,指定到目标节点:
# 示例:修改kube-dns的Deployment kubectl edit deployment kube-dns -n kube-system
在spec.template.spec下追加:
nodeSelector: node-role.kubernetes.io/system-pod: yes
提示:对于DaemonSet类型的系统Pod(如kube-proxy),也可给非目标节点打污点,拒绝系统Pod调度:
# 给非目标节点打污点 kubectl taint nodes <非目标节点名称> node-role.kubernetes.io/system-pod:NoSchedule # 移除目标节点的对应污点(允许调度) kubectl taint nodes <目标节点名称> node-role.kubernetes.io/system-pod:NoSchedule-
批量修改脚本
若系统Pod较多,可批量添加nodeSelector:
#!/bin/bash TARGET_LABEL="node-role.kubernetes.io/system-pod=yes" # 批量修改kube-system下的Deployment for deploy in $(kubectl get deploy -n kube-system -o name); do kubectl patch $deploy -n kube-system --type merge -p '{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/system-pod":"yes"}}}}}' done # 批量修改kube-system下的DaemonSet for ds in $(kubectl get ds -n kube-system -o name); do kubectl patch $ds -n kube-system --type merge -p '{"spec":{"template":{"spec":{"nodeSelector":{"node-role.kubernetes.io/system-pod":"yes"}}}}}' done
内容的提问来源于stack exchange,提问作者Wiki
相关产品推荐
相关产品推荐

