Kubernetes Deployment 回滚机制
回滚核心概念
回滚是将 Deployment 恢复到之前的某个修订版本(Revision)的操作,是 Kubernetes 提供的安全机制,用于应对更新后出现的各种问题。
回滚原理
- 修订版本记录:Deployment 控制器通过 ReplicaSet 记录每个更新版本
- 版本切换:回滚实际上是重新激活旧版本的 ReplicaSet 并缩容新版本
- 无缝切换:回滚过程同样遵循滚动更新策略,保证服务连续性
回滚前关键准备
-
确保修订历史可用:
spec: revisionHistoryLimit: 10 # 默认保留10个历史版本
- 建议生产环境保留足够的历史版本(但会占用 etcd 存储空间)
-
查看历史版本:
kubectl rollout history deployment/<deployment-name> # 输出示例 REVISION CHANGE-CAUSE 1 kubectl apply --filename=deployment.yaml --record=true 2 kubectl set image deployment/nginx nginx=nginx:1.16
-
查看版本详情:
kubectl rollout history deployment/<deployment-name> --revision=<revision-number>
回滚操作命令
1. 快速回滚到上一版本
kubectl rollout undo deployment/<deployment-name>
2. 回滚到特定版本
kubectl rollout undo deployment/<deployment-name> --to-revision=<revision-number>
3. 回滚时查看状态
kubectl rollout status deployment/<deployment-name>
回滚过程详解
- 识别目标 ReplicaSet:找到对应 revision 的 ReplicaSet
- 缩放操作:
- 逐步扩展目标 ReplicaSet 的副本数
- 逐步缩减当前 ReplicaSet 的副本数
- 完成条件:所有 Pod 都切换到目标版本
回滚触发条件
- 手动触发:明确执行回滚命令
- 自动触发:当更新失败且超过
progressDeadlineSeconds
(默认600秒)
高级回滚技巧
-
回滚预览(dry-run):
kubectl rollout undo deployment/<deployment-name> --dry-run=client
-
回滚到特定配置:
kubectl apply -f deployment-previous.yaml
-
结合事件监控:
kubectl get events --sort-by=.metadata.creationTimestamp
生产环境最佳实践
-
始终记录变更原因:
kubectl apply -f deployment.yaml --record
-
重要更新前创建快照:
kubectl get deployment <deployment-name> -o yaml > backup.yaml
-
蓝绿部署替代方案:对于关键服务,考虑使用两个独立 Deployment 切换
-
金丝雀发布策略:先更新小部分 Pod 验证后再全量更新
-
自动化回滚:在 CI/CD 管道中集成健康检查,异常时自动触发回滚
[!NOTE]
备注:
- ConfigMap/Secret 变更:回滚不会自动回滚这些关联资源
- PV/PVC 问题:有状态应用的存储可能需要特殊处理
- 资源依赖:确保旧版本所需的资源(如镜像)仍然可用
- 回滚后的版本号:回滚会创建新的 revision 记录
回滚场景示例
# 1. 执行更新
kubectl set image deployment/nginx nginx=nginx:1.99
# 2. 发现新版本有问题
kubectl get pods -w
# 3. 查看更新历史
kubectl rollout history deployment/nginx
# 4. 执行回滚
kubectl rollout undo deployment/nginx
# 5. 确认回滚状态
kubectl rollout status deployment/nginx
评论需开启科学上网!