You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:33:22