滚动更新与回滚操作
如何安全地更新应用版本,出问题时如何快速回滚?
解决方案
标准滚动更新流程 推荐
# 1. 更新镜像版本 kubectl set image deployment/web-app web=myapp:v2.0 # 2. 监控更新状态 kubectl rollout status deployment/web-app # 3. 验证新版本 kubectl get pods -l app=web-app kubectl logs -l app=web-app --tail=20 # 4. 如果有问题,立即回滚 kubectl rollout undo deployment/web-app # 5. 确认回滚成功 kubectl rollout status deployment/web-app
K8s 默认使用 RollingUpdate 策略,逐步替换旧 Pod。更新过程中如果新 Pod 无法就绪,会自动暂停。发现问题时 undo 可以秒级回滚。
适用场景:日常版本更新,需要零停机
通过修改 YAML 文件更新
# 修改 deployment.yaml 中的 image 版本 # 然后应用 kubectl apply -f deployment.yaml # 添加变更原因注解(方便 history 查看) kubectl annotate deployment/web-app kubernetes.io/change-cause="升级到 v2.0,修复登录 bug"
通过 YAML 文件管理更适合 GitOps 流程,变更有版本记录。annotate 添加变更原因让 rollout history 更有意义。
适用场景:生产环境,需要变更审计和版本控制
回滚到指定版本
# 查看历史版本 kubectl rollout history deployment/web-app # 查看指定版本详情 kubectl rollout history deployment/web-app --revision=2 # 回滚到指定版本 kubectl rollout undo deployment/web-app --to-revision=2 # 确认回滚 kubectl rollout status deployment/web-app
当需要回滚到更早的版本(不是上一个)时,先用 history 查看版本号,再指定 --to-revision 回滚。
适用场景:需要回滚到特定历史版本
注意事项
更新前确保 readinessProbe 配置正确,否则可能误判 Pod 就绪
回滚也是一次新的 rollout,会产生新的 revision
maxUnavailable 和 maxSurge 控制更新速度,生产环境建议保守配置