Deployment 镜像用 latest,执行 kubectl rollout undo 回到上一版,拉起来的还是最新镜像。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
kubectl rollout history deploy/api kubectl set image deploy/api api=registry.example.com/api:20261114-1 kubectl rollout undo deploy/api --to-revision=3
ReplicaSet 里记录的是 image:latest 这个字符串,undo 只换回旧模板,节点重新拉取时 latest 仍指向仓库最新层。镜像内容变了,清单看不出来。这一点先确认清楚,后面就不用反复试。
碰到「latest 标签回滚」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
具体做法是,发布时用 commit sha 或日期做 tag 禁止 latest 进生产;回滚前用 rollout history 确认 revision 对应镜像;需要精确回滚时直接 set image 到指定 digest;把 revisionHistoryLimit 调到能覆盖最近十次发布。
改完照着核一遍,rollout undo 后 kubectl get pod 里的 image 是旧的固定 tag 不是 latest。
