滚动更新与回滚操作

如何安全地更新应用版本,出问题时如何快速回滚?

解决方案

标准滚动更新流程 推荐

# 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 控制更新速度,生产环境建议保守配置

相关命令