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

GitLab CI部署K8s时,如何仅等待部分副本完成滚动发布?

优化GitLab CI部署Kubernetes的等待逻辑

问题背景

我们通过GitLab CI流水线部署应用到Kubernetes,执行的部署命令如下:

kubectl set image deployment/our-app-name new-image:new-tag
kubectl rollout status deployment/our-app-name

默认情况下,kubectl rollout status会等待全部5个新副本启动就绪、旧副本销毁完成,偶尔会因耗时过长触发超时,错误信息为:

error: deployment "our-app-name" exceeded its progress deadline

不想通过-timeout参数强制延长超时时间,希望优化为:仅等待2-3个新副本启动就绪、确认应用可正常部署后,就让流水线标记为成功,剩余副本的滚动更新由Kubernetes自行完成。

解决方案

方案1:精准等待指定数量的新副本就绪

通过kubectl wait结合Pod模板哈希,精准等待新版本的指定数量Pod就绪,满足条件后立即结束流水线,无需等待全部副本更新完成。

执行命令替换原有的kubectl rollout status:

# 触发应用镜像更新
kubectl set image deployment/our-app-name new-image:new-tag

# 获取新版本Pod的模板哈希(Kubernetes自动生成,用于区分不同版本的Pod)
NEW_POD_HASH=$(kubectl get deployment our-app-name -o jsonpath='{.status.updateRevision}')

# 等待至少2个新版本Pod进入就绪状态(可根据需求调整--count参数为3),超时时间设为5分钟(可按需调整)
kubectl wait --for=condition=ready pod -l pod-template-hash=$NEW_POD_HASH --timeout=5m --count=2

该方案的优势:无需修改Deployment的全局配置,仅在CI流水线中调整命令即可灵活控制等待的副本数量,流水线成功后,Kubernetes会自动完成剩余副本的滚动更新。

方案2:调整Deployment滚动更新策略(全局配置)

如果希望从Deployment层面优化滚动更新的推进速度,可修改其滚动更新参数,减少整体更新的等待压力:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: our-app-name
spec:
  strategy:
    rollingUpdate:
      maxSurge: 2        # 允许滚动更新时额外创建最多2个副本,加快新版本Pod的启动速度
      maxUnavailable: 0  # 不允许旧副本不可用(可根据业务容忍度调整为1或2)
    type: RollingUpdate
  progressDeadlineSeconds: 300  # 可选:延长进度截止时间,避免过早触发超时

修改后重新应用Deployment配置即可生效,该方案会影响所有后续的滚动更新操作。

内容的提问来源于stack exchange,提问作者craigmiller160

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:18:14