全部场景Scene 04

发布回滚坏镜像与 rollout undo

新版本卡在 ImagePullBackOff,Deployment READY 开始残缺。你将用 status、history 与 Events 确认坏镜像 revision,执行 rollout undo,并验证服务恢复。

中阶阶段 · 10 min · 6 步 · apply · set image · rollout status/history/undo

演练前检查

环境
本地实验集群;examples/minimal-loop/ 已建立 READY 2/2 的健康基线。
初始故障
故意设置不存在的镜像 tag 后,新 Pod 进入 ImagePullBackOff,rollout status 无法完成。
成功标准
坏镜像出现 ImagePullBackOff 后,rollout undo 能恢复 READY,history 可见 revision 变化
清理
确认 undo 恢复后执行 kubectl delete -f examples/minimal-loop/。

场景判断

Deployment 默认策略是 RollingUpdate:控制器按 maxUnavailable / maxSurge 逐步用新 Pod 替换旧 Pod。你真正提交的不是「一次 docker 重启」,而是一次 revision——Pod 模板(尤其是 container image)一变,ReplicaSet 世代推进,rollout history 里多一条可回退的记录。理解这点后,kubectl set image 与改 YAML 再 apply 是同一条路上的两种写法:前者适合应急改镜像,后者适合清单入库与评审。

本场景建立在 examples/minimal-loop/ 之上,不引入 Ingress 或 Helm。先保证 web 健康,再故意 set 一个不存在的 tag,让新副本卡在 ImagePullBackOff;此时 rollout status 会长时间不成功,get pods 能看到旧副本与坏副本并存或 READY 残缺。应急动作不是 delete 整个 Deployment,而是 kubectl rollout undo,让控制器把 Pod 模板拨回上一 revision。history 让你看见「回得到哪里」,status 让你确认「已经回到可用」。

复现步骤

本机勾选备忘(localStorage),不代表你已在集群里跑过,也不连接任何 API。只是帮你对照步骤,别当成「学会了」的勋章。

— / 6本机勾选

  1. 01
  2. 02
  3. 03
  4. 04
  5. 05
  6. 06

关键配置

SHELLbash
# 健康基线
kubectl apply -f examples/minimal-loop/
kubectl rollout status deploy/web

# 故意坏镜像
kubectl set image deploy/web nginx=nginx:does-not-exist-xyz
kubectl get pods -l app=web
kubectl describe pod -l app=web | grep -A5 -i 'Failed\|pull\|BackOff'

# 回滚并确认
kubectl rollout undo deploy/web
kubectl rollout status deploy/web
kubectl rollout history deploy/web

读 status 输出时,关注的是「新 ReplicaSet 是否可用」,不是某一次 curl 碰巧成功。坏镜像场景里,旧 Pod 可能仍在服务流量,表面上「网站还开着」,但副本数与期望已经偏离,下一次节点抖动或缩容就可能把最后一点健康副本打穿。undo 的价值是把期望状态整体拨回已知好版本,而不是手动删掉几个 ErrImagePull 的 Pod 碰运气——删了坏 Pod,控制器仍会按当前(错误的)模板再拉同样坏的副本。

回滚不是认输,而是把「服务恢复」排在「根因分析」前面——revision 就是你买下的后悔药。

做完坏镜像 → undo 之后,你可以加一刀可选练习:kubectl scale deploy/web --replicas=3,在滚动过程中盯 READY 变化,体会 maxUnavailable 对容量的影响。中阶验收标准很具体:能独立完成一次「错误发版的可观测失败 + 一条命令恢复」,并能向同事口述 status / history / undo 各自回答什么问题。

现场记录

先写自己的证据,再看参考答案。输入只留在当前页面,本站不会读取或验证你的集群。

发布回滚:坏镜像与 rollout undo

Evidence Receipt · 执行凭证

只填写你实际运行过的环境;stdout / Events 请脱敏后写入下方证据句。

这是你的手动确认,不代表本站已检测命令执行结果。

关联命令

跳转图鉴并展开对应条目(可复制示例)。

对应路径课节

Kubernetes 图鉴 · 场景剧本 · rollout-undo