滚动更新是干什么的
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 不换版本),用于重载配置类场景,不等于发布新版本。