Kubernetes Deployment 滚动更新 (Rolling Update) 总结
基本概念
滚动更新是 Deployment 默认的更新策略,它允许逐步用新版本的 Pod 替换旧版本的 Pod,确保应用在更新期间不中断服务。
核心机制
- 逐步替换:新 Pod 被创建并达到就绪状态后,旧 Pod 才会被终止
- 零停机:确保在更新过程中始终有可用的 Pod 处理请求
- 版本控制:通过 ReplicaSet 管理不同版本的 Pod
关键参数
在 Deployment 的 spec.strategy
中配置:
spec:
strategy:
type: RollingUpdate # 默认值,可不显式声明
rollingUpdate:
maxSurge: 25% # 更新期间允许超过期望副本数的最大比例/数量
maxUnavailable: 25% # 更新期间允许不可用 Pod 的最大比例/数量
更新流程
- 创建新的 ReplicaSet(记录新版本模板)
- 逐步扩展新 ReplicaSet 的 Pod 数量(按 maxSurge 限制)
- 逐步缩减旧 ReplicaSet 的 Pod 数量(按 maxUnavailable 限制)
- 直到所有旧 Pod 被替换为新 Pod
触发更新的方式
-
修改 Pod 模板(最常见):
kubectl set image deployment/<deployment-name> <container-name>=<new-image>
或
kubectl edit deployment <deployment-name>
-
直接替换 YAML 文件:
kubectl apply -f deployment.yaml
更新状态监控
-
查看更新状态:
kubectl rollout status deployment/<deployment-name>
-
查看更新历史:
kubectl rollout history deployment/<deployment-name>
-
查看特定修订版本的详情:
kubectl rollout history deployment/<deployment-name> --revision=<revision-number>
回滚操作
-
回滚到上一版本:
kubectl rollout undo deployment/<deployment-name>
-
回滚到特定版本:
kubectl rollout undo deployment/<deployment-name> --to-revision=<revision-number>
高级特性
-
暂停与恢复更新:
kubectl rollout pause deployment/<deployment-name> kubectl rollout resume deployment/<deployment-name>
-
就绪探针(Readiness Probe)依赖:
- 只有通过就绪检查的新 Pod 才会被视为可用
- 确保只有真正准备好的 Pod 才会接收流量
-
进度期限:
- 可通过
spec.progressDeadlineSeconds
设置(默认600秒) - 超过此时限未完成更新将被视为失败
- 可通过
[!NOTE]
备注:
- 合理设置
maxSurge
和maxUnavailable
值(生产环境建议保守设置)- 确保应用正确处理终止信号(实现优雅终止)
- 使用就绪探针确保新 Pod 真正可用
- 在 CI/CD 流程中集成滚动更新状态检查
- 对重要部署保留足够的修订历史(通过
spec.revisionHistoryLimit
配置)
评论需开启科学上网!