回滚是什么
回滚把工作负载的模板恢复到上一个或指定的历史修订,回退过程同样以滚动方式执行,不影响理解「当前有几个实例可用」。对无状态负载来说,历史修订对应不同的副本集,回滚就是把副本切回旧的那一个,因此速度取决于新实例的启动与就绪时间。
回滚能还原什么
它只还原对象模板,也就是镜像、副本数、探针这类定义层面的内容。数据库结构变更、外部配置、密钥内容、存储里的数据都不在其中。因此「发布了数据库迁移加应用升级」这种组合,单靠回滚应用往往不能恢复可用性,需要在发布流程里预先设计好兼容策略。
基本信息
| 适用环境 | 任何 Kubernetes 发行版,支持工作负载类资源 |
|---|---|
| 语法 | kubectl rollout undo <资源>/<名称> [--to-revision=...] |
| 默认行为 | 回退到上一个修订版本 |
| 历史依赖 | 受历史保留数量限制,超出保留范围的目标不可回滚 |
| 结果形态 | 生成一个新的修订,编号继续增长 |
| 不含内容 | 外部系统状态、数据变更、配置对象的内容 |
典型使用场景
- 发布后立即发现问题:新版本报错率高,尽快恢复到上一个版本
- 定位到具体版本:明确知道某个较早的修订稳定,直接指定回退
- 验证流程:演练回滚过程,确认历史保留与回滚时间满足要求
- 灰度失败:小范围验证不通过,把该负载切回旧版本
- 误操作修正:镜像被改成错误版本后快速恢复
- 逐步排查:在多个版本之间切换,定位是哪次改动引入问题
常用示例
常用示例
kubectl rollout undo deploy/web # 回退到上一个修订
kubectl rollout undo deploy/web --to-revision=2 # 指定目标修订
kubectl rollout undo sts/db --to-revision=5 -n prod # 有状态负载回滚
kubectl rollout status deploy/web --timeout=180s # 观察回滚进度
kubectl get rs -l app=web # 看新旧副本集比例变化回滚前要确认的事
| 确认项 | 为什么 | 怎么做 |
|---|---|---|
| 历史修订范围 | 目标修订可能已被清理 | 查看历史列表,确认目标存在 |
| 外部状态 | 数据与配置不随回滚变化 | 确认变更是否可逆 |
| 回滚耗时 | 按滚动方式执行需要时间 | 评估故障容忍窗口 |
| 镜像可用性 | 旧镜像可能已从仓库清理 | 确认仓库中仍可拉取 |
回滚会生成一个新的修订编号,历史记录不会被删除,连续回滚会在多个版本之间来回切换。
历史保留数量设置过小时,需要回滚的目标修订可能已经不存在,此时只能重新提交旧版本的清单。