非使用时段(夜间/周末)无损关停GKE集群的实现流程咨询
GKE集群非使用时段启停(无工作负载影响)已验证流程
核心思路:直接关停GKE集群会强制终止工作负载,因此采用缩容节点池至0节点的方式模拟“关停”,恢复时再扩容节点池,工作负载会自动调度回新节点,全程不影响数据与服务可用性。
一、前置准备
- 给所有业务工作负载配置PodDisruptionBudget(PDB),避免缩容时Pod被强制中断:
apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: my-app-pdb spec: minAvailable: 1 # 根据业务需求调整,比如核心服务设为总Pod数的50% selector: matchLabels: app: my-app
- 确认目标节点池支持缩容至0(GKE默认节点池均支持,无需额外配置)。
二、非使用时段缩容节点池至0
手动操作(gcloud命令行)
- 查看集群下的节点池列表:
gcloud container node-pools list --cluster=你的集群名 --zone=集群所在区域 - 逐个缩容节点池到0:
gcloud container node-pools resize 目标节点池名 --cluster=你的集群名 --zone=集群所在区域 --num-nodes=0
自动化操作(推荐,Cloud Scheduler+Cloud Function)
- 创建Cloud Function,封装缩容逻辑(Python示例):
import googleapiclient.discovery def resize_to_zero(event, context): container_client = googleapiclient.discovery.build('container', 'v1') project_id = '你的项目ID' zone = '集群所在区域' cluster_name = '你的集群名' node_pool_name = '目标节点池名' request = container_client.projects().zones().clusters().nodePools().resize( name=f'projects/{project_id}/zones/{zone}/clusters/{cluster_name}/nodePools/{node_pool_name}', body={'nodeCount': 0} ) response = request.execute() print(f"节点池已缩容至0: {response}")
- 在Cloud Scheduler中创建定时任务,比如:
- 工作日每晚22点触发:Cron表达式
0 22 * * 1-5 - 周末每晚22点触发:Cron表达式
0 22 * * 0,6
- 工作日每晚22点触发:Cron表达式
三、工作时段恢复节点池
手动操作(gcloud命令行)
扩容到原节点数量(比如3个节点):gcloud container node-pools resize 目标节点池名 --cluster=你的集群名 --zone=集群所在区域 --num-nodes=3
自动化操作
- 修改上述Cloud Function的
nodeCount为原节点数(比如3) - 创建Cloud Scheduler定时任务,比如工作日早8点触发:Cron表达式
0 8 * * 1-5
四、流程验证
- 缩容后检查节点状态:
kubectl get nodes,确认所有节点已被移除 - 检查Pod状态:
kubectl get pods,所有Pod会进入Pending状态,但不会被删除(受PDB保护) - 扩容后等待节点创建完成,再次查看Pod状态:
kubectl get pods,Pod会自动调度到新节点并恢复运行 - 访问业务接口,确认服务正常响应
关键注意事项
- GKE托管控制平面无法关停,但缩容节点池至0已能大幅节省计算资源成本
- 有状态应用需确保使用持久化存储(如GCE Persistent Disk),扩容后Pod可重新挂载PV,数据不会丢失
- 若配置了节点亲和性/污点容忍,需确保扩容后的节点符合Pod调度规则
内容的提问来源于stack exchange,提问作者Schatt
相关产品推荐
相关产品推荐

