命令定位
kubectl rollout history 列出工作负载的历史修订版本(revision),用于回答「上次发布改了什么、能不能退回去」。适用范围是 Deployment、StatefulSet、DaemonSet 这些带 rollout 语义的工作负载。Deployment 的每一版对应一个 ReplicaSet,StatefulSet 的历史由 ControllerRevision 对象保存。回滚前先用它确认目标 revision,再配合 rollout undo 才不会退错版本。
基本信息
| 适用平台 | Kubernetes(Deployment / StatefulSet / DaemonSet) |
|---|---|
| 权限要求 | 对工作负载的 get/list 权限;查看模板快照还需能读 ReplicaSet 或 ControllerRevision |
| 修订来源 | Deployment 对应 ReplicaSet,StatefulSet/DaemonSet 对应 ControllerRevision |
| 保留数量 | 由 spec.revisionHistoryLimit 控制,Deployment 默认保留 10 个旧版本 |
典型使用场景
- 发布出问题准备回滚:先看历史确认上一版的 revision 编号与时间,再执行 rollout undo
- 核对某次发布改了什么:用 --revision 展开 Pod 模板快照,对比镜像与配置差异
- 排查「为什么这次发布没生效」:确认修订号是否真的递增了一次
- 多环境对照:把预发与生产的修订历史放在一起比发布时间与变更说明
- 发布前留痕:给 revision 补 change-cause 注解,让历史列表自带业务语境
常用示例
常用示例
kubectl rollout history deploy/web -n prod # 列出修订号与变更说明
kubectl rollout history deploy/web --revision=3 # 展开第 3 版的 Pod 模板快照
kubectl annotate deploy/web kubernetes.io/change-cause="release 2026.10.13 hotfix" # 给本次修订写说明
kubectl rollout undo deploy/web --to-revision=2 # 明确回退到指定版本
kubectl get rs -l app=web -o wide # 每个 ReplicaSet 对应一个修订,可交叉核对输出逐列读法
| 列 | 含义 | 使用注意 |
|---|---|---|
| REVISION | 修订序号,每次 Pod 模板变更递增 | 编号只增不回收,回滚也会产生新编号 |
| CHANGE-CAUSE | 来自 kubernetes.io/change-cause 注解 | 不写注解就显示 <none>,旧版 --record 已弃用 |
| 镜像与副本快照 | --revision 展开后的模板内容 | 据判断两版之间到底改了什么 |
| ControllerRevision | StatefulSet 场景的历史载体 | 名字形如 sts-<名称>-<哈希> |
回滚本质是把目标 revision 的 Pod 模板重新提交一次,会再生成一个新修订号,历史记录不会被回写覆盖。
revisionHistoryLimit 之外的旧版本会被清理,超过保留窗口的版本无法再回滚,重要发布节点要么调大该值,要么在流水线里留好旧清单。