如何通过GitLab CI部署处于非工作状态的Stale Pod?
可行实现思路汇总
除了手动执行kubectl scale --replicas=0的命令式方案外,还有以下几种更适配Terraform IaC使用习惯的声明式实现思路:
1. 工作负载默认配置0副本
- 直接在Deployment/StatefulSet等工作负载的YAML定义中固定写入
spec.replicas: 0,应用部署完成后默认不会生成运行中的Pod - 配合Terraform的Kubernetes Provider/Helm Provider使用时,可以将replicas值定义为可动态调整的Terraform变量,需要启动应用时仅需修改该变量值为期望副本数后执行
terraform apply即可完成启动,全程都是声明式配置,无需调用额外命令行工具 - 优先推荐该方案,无需额外依赖K8s扩展组件,完全兼容原生K8s API,适配所有类型的工作负载资源
2. 开启Deployment的暂停部署特性
- 原生Deployment资源支持
spec.paused: true配置项,开启后即使spec.replicas设置为大于0的数值,Deployment控制器也不会创建对应的Pod实例,仅保留工作负载资源本身和关联的其他配置(如Service、ConfigMap、PV等) - 需要启动应用时,通过Terraform将
paused字段修改为false,同时调整replicas为期望数值即可,适合需要预创建全量应用关联配置、仅暂停工作负载实例创建的场景
3. 利用GitOps组件的同步暂停配置
如果你的集群已经部署了Argo Rollouts/FluxCD等GitOps交付组件,可以采用该方案:
- 给应用配置默认同步策略为手动同步,同时设置为默认暂停同步状态,工作负载资源创建后不会自动生成Pod实例
- 需要启动应用时,通过Terraform修改对应应用的同步策略配置,触发GitOps组件完成Pod创建即可,适合已经采用GitOps作为集群统一交付标准的场景
4. Knative Serving缩容到0特性(适配无状态HTTP服务)
如果部署的是无状态HTTP类服务,可以采用Knative Serving实现:
- 部署为Knative Service后,可配置自动缩容到0的阈值,没有流量时Pod会自动销毁到0副本,有请求时自动启动
- 不需要自动触发的场景下,也可以通过Terraform修改Knative Service的副本上下限、并发阈值等参数,手动控制是否允许创建Pod实例
注意:以上所有方案均无需额外调用Terraform的local-exec等资源执行本地kubectl命令,减少对执行环境的工具依赖,同时符合IaC的幂等性要求。
内容的提问来源于stack exchange,提问作者iamniki
相关产品推荐
相关产品推荐

