首页/开发/CI/CD 与发布速查/K8s 滚动更新(RollingUpdate)
发布策略60 条

K8s 滚动更新(RollingUpdate)

Kubernetes Deployment 的默认发布策略:控制器新建 ReplicaSet 逐步扩容新版本 Pod、缩容旧版本 Pod,过程中两版本共存,发布节奏由 maxSurge 与 maxUnavailable 控制。

CI/CD 与发布速查开发更新于 2026-10-13

滚动更新是干什么的

Kubernetes Deployment 的默认发布策略:控制器新建一个 ReplicaSet 逐步扩容新版本 Pod、同时缩容旧版本 Pod,过程中两个版本并存,服务不中断。发布节奏由 maxSurge(多建多少)与 maxUnavailable(可少多少)控制,新 Pod 通过就绪探针后才加入 Service 后端承接流量。与 Recreate 的差别:Recreate 先停全部旧 Pod 再起新 Pod,会有明确停机窗口,适合无法两版本共存的应用;滚动更新则假设两版本可以同时对外服务。滚动过程按批次推进:每批新 Pod 就绪后缩掉一批旧 Pod,直到新 ReplicaSet 满员、旧 ReplicaSet 缩到零;progressDeadlineSeconds 控制多久没有进展视为失败。

基本信息

默认策略Deployment 未指定 strategy 时即 RollingUpdate
节奏字段maxSurge 与 maxUnavailable,默认均为 25%
超时兜底progressDeadlineSeconds 默认 600 秒,未收敛会标记 ProgressDeadlineExceeded
修订历史每次模板改动生成修订,revisionHistoryLimit 控制保留数(默认 10)
暂停恢复kubectl rollout pause / resume 控制发布节奏
回滚入口kubectl rollout undo,可加 --to-revision 指定目标
流量切换新 Pod 就绪(readinessProbe 通过)后才进入 Service 后端

典型使用场景

  • 常态发布:多数无状态服务的默认选择,逐步替换不中断对外服务。
  • 容量敏感服务:maxSurge=1 配 maxUnavailable=0,先扩后缩,更新期间容量不下降。
  • 版本无法共存的场景:应改用 Recreate 或蓝绿式整体切换,而不是硬套滚动更新。
  • 需要中途干预:kubectl rollout pause 暂停、调整后再 resume,用于复杂发布的节奏控制。
  • CI 收敛判断:部署作业里等待 rollout status 返回成功才算部署完成,失败可见。
  • 快速回退:发布后错误率升高,rollout undo 回到上一修订。
  • 大副本服务提速:副本足够多时可放宽 maxUnavailable,让替换并行度更高。
  • 镜像回滚演练:定期在预发用 rollout undo 验证回退通道可用,而不是等故障时第一次使用。
  • 配置变更发布:环境变量、探针参数等模板改动同样走滚动更新,同样受节奏字段约束。

发起并跟踪更新

发起并跟踪更新
kubectl set image deployment/web web=registry.example.com/web:1.9.0  # 触发滚动
kubectl rollout status deployment/web --timeout=300s  # 等待收敛再判定部署结果
kubectl rollout pause deployment/web   # 需要时暂停发布
kubectl rollout resume deployment/web  # 确认后继续
kubectl rollout history deployment/web  # 查看修订历史
kubectl rollout undo deployment/web  # 回到上一修订
kubectl rollout undo deployment/web --to-revision=3  # 或指定回退点

过程信号排查

现象含义处理
新旧 Pod 逐步替换正常过程跟踪 rollout status
新 Pod 长期 Pending配额或调度问题查 describe 事件
新 Pod CrashLoopBackOff应用启动失败看日志查镜像
ProgressDeadlineExceeded超时未收敛查探针与容量
流量错误率突升旧实例缩容过快调小 maxUnavailable

发布检查清单

  • 更新前确认新镜像已推送且可拉取(私有仓库凭据有效)。
  • 核对探针参数与真实启动时间匹配,避免慢启动被误判为失败。
  • 确认容量余量:多建 Pod 需要节点资源或集群扩容支持。
  • 部署后核对业务指标,而不只看 Pod 是否 Ready。
滚动期间新旧 Pod 同时在 Service 后端:接口、消息格式与共享存储都要保持两版本兼容。
更新卡住不会自动回滚:Kubernetes 不会因新版本不健康自动退回旧版本,需要在 CI 检查 rollout 结果或人工执行 undo。
副本数很少(1 到 2 个)的服务对滚动最敏感:默认 25% 取整后可能一次就损失过多容量,这类服务优先 maxUnavailable 为 0。revisionHistoryLimit 默认保留 10 个修订,频繁发布的服务确认历史未被清空。
kubectl rollout restart 是对现有模板做滚动重启(换 Pod 不换版本),用于重载配置类场景,不等于发布新版本。

易错点

  • 两版本共存期改动了不兼容行为:旧 Pod 还没退完,调用方仍会命中旧版本,接口与消息格式必须向前兼容。
  • 新 Pod 因配额或镜像拉取长期 Pending:更新卡在中间态,需要监控 rollout 超时并告警,否则问题静默停留。
  • 发布节奏过快导致容量不足:maxUnavailable 默认 25% 在小副本数下会一次放掉过多实例,容量敏感服务要显式调小。
  • 只改镜像不跟踪结果:CI 必须等待 rollout status 成功才算部署完成,否则失败被静默。
  • 未配置就绪探针:Pod 一运行就可能接流量,半启动实例会造成大量 5xx。
  • 把滚动更新当零风险:数据库结构变更、外部依赖升级不在滚动能力范围内,需要单独的兼容性设计。

数据来源与参考

  • Kubernetes 文档《Deployments》
  • Kubernetes 文档《Performing a Rolling Update》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌