kubernetes 中回滚部署需先用 kubectl rollout history 查看历史版本,再用 kubectl rollout undo 回滚至上一版或指定 revision;关键在于设置 revisionhistorylimit 并使用 --record 记录变更,最后通过 rollout status 和 get deploy -o yaml 验证生效。

在 Kubernetes 中,查看历史版本并回滚部署主要依赖 kubectl rollout 系列命令,核心对象是 Deployment(也适用于 DaemonSet、StatefulSet)。回滚本质是切换到之前保存的 ReplicaSet,前提是修订历史(revision)被保留且记录完整。
查看部署的历史版本
要回滚,必须先知道有哪些可用版本。使用以下命令列出所有修订记录:
-
kubectl rollout history deployment/<deployment-name></deployment-name>—— 显示 REVISION 和 CHANGE-CAUSE 列表 - 若未看到 CHANGE-CAUSE(如
kubectl set image ... --record或kubectl apply -f xxx.yaml --record),说明该次更新未被记录,对应 revision 会显示<none></none> - 想看某次 revision 的具体配置(比如用了哪个镜像),加
--revision=N:kubectl rollout history deployment/my-app --revision=3
确保历史版本可查的关键设置
默认只保留最近 10 个 revision,超出后旧记录会被自动清理。若需长期保留更多版本,需在 Deployment YAML 中显式设置:
-
spec.revisionHistoryLimit: 20(例如保留 20 个) - 部署或更新时务必加上
--record参数,否则 revision 缺少操作上下文,排查困难
执行回滚操作
回滚有两种常用方式:
- 回滚至上一个版本(最常用):
kubectl rollout undo deployment/my-app - 回滚至指定 revision:
kubectl rollout undo deployment/my-app --to-revision=5
执行后,Kubernetes 会将 Deployment 的 Pod 模板切回目标 revision 对应的 ReplicaSet,并触发滚动更新(新旧 Pod 逐步替换)。
验证回滚是否生效
回滚不是瞬时完成,需确认状态和配置已更新:
- 观察滚动进度:
kubectl rollout status deployment/my-app(直到显示 “successfully rolled out”) - 检查当前 Pod 使用的镜像:
kubectl get deploy/my-app -o yaml | grep image: - 确认最新 revision 已变更:
kubectl rollout history deployment/my-app(新 revision 号会递增) - 查看 Pod 实际运行版本(如环境变量或响应头)以交叉验证











