3. Helm 升级流程回顾:工作原理、Revision 管理、Rollback 机制与升级钩子

在生产环境中执行 helm upgrade 是变更交付的核心操作。理解其底层工作原理、Revision 版本管理、回滚机制以及升级钩子,是进行故障域隔离与节点排空参数调优的前提。本节将系统梳理 Helm 升级的完整生命周期。

3.1 helm upgrade 工作原理

helm upgrade 并非简单的“替换”,而是一个三阶段原子操作:

  1. 计算 Diff(差异计算):Helm 将新 Chart 模板与当前 Release 的 Manifest 进行对比,生成补丁集。
  2. 构建新 Release:基于新 Chart 和用户提供的 Values,渲染出完整的 Kubernetes 资源清单。
  3. 执行 Apply(应用):通过 Kubernetes API Server 对资源进行创建、更新或删除操作。
关键行为:Helm 默认使用 --atomic 模式时,如果升级过程中任何资源应用失败,会自动触发回滚,确保集群状态不处于“半升级”的中间态。
Helm Upgrade 三阶段流程 Helm Upgrade 三阶段原子操作 阶段 1:计算 Diff 旧 Manifest vs 新 Chart 阶段 2:构建新 Release 渲染完整资源清单 阶段 3:Apply K8s API 创建/更新/删除 失败自动回滚 --atomic 模式触发 说明: 升级过程中,Helm 会锁定 Release,防止并发操作。 --atomic 模式下,任何阶段失败都会自动回滚到上一个稳定版本。

3.2 Revision 管理机制

Helm 使用 Revision(修订版本) 来追踪 Release 的每一次变更。每次 helm upgrade 或 helm install 都会生成一个新的 Revision 编号,从 1 开始递增。

Revision 编号 状态 描述 存储位置
1 SUPERSEDED 初始安装版本,已被后续升级覆盖 Secret (sh.helm.release.v1.<release>.v1)
2 DEPLOYED 当前活跃版本,正在集群中运行 Secret (sh.helm.release.v1.<release>.v2)
3 FAILED 升级失败版本,保留用于调试 Secret (sh.helm.release.v1.<release>.v3)
4 PENDING_UPGRADE 升级进行中,尚未完成 Secret (sh.helm.release.v1.<release>.v4)
最佳实践:默认 Helm 保留最近 10 个 Revision(可通过 --history-max 调整)。在故障域隔离演练中,建议将 --history-max 设置为 5,以减少 Secret 存储开销并加快回滚速度。

3.3 Rollback 回滚机制

helm rollback 允许将 Release 恢复到之前的任意 Revision。其工作原理如下:

  • 读取历史 Manifest:从目标 Revision 的 Secret 中提取完整的资源清单。
  • 计算差异:对比当前 DEPLOYED 版本与目标版本的差异。
  • 执行回滚 Apply:将资源状态恢复到目标 Revision 的期望状态。
  • 生成新 Revision:回滚操作本身会创建一个新的 Revision(编号递增),而不是覆盖历史。
注意:回滚不会删除当前 DEPLOYED 版本的 Secret,只是将其状态标记为 SUPERSEDED。这意味着你可以随时再次回滚到之前的任何版本。
Revision 生命周期与 Rollback 流程 Revision 生命周期与 Rollback 流程 Revision 1 SUPERSEDED Revision 2 DEPLOYED Revision 3 FAILED Revision 4 PENDING_UPGRADE helm rollback my-release 2 Rollback 关键行为: 1. 回滚到 Revision 2 后,会生成 Revision 5(状态为 DEPLOYED),Revision 2 变为 SUPERSEDED。 2. 回滚操作本身不会删除任何历史 Revision,所有历史数据保留在 Secret 中。

3.4 升级钩子(Hooks)

Helm 钩子允许在 Release 生命周期的特定节点执行自定义操作。升级相关的钩子按执行顺序如下:

钩子名称 触发时机 典型用途 失败影响
pre-upgrade 在渲染新 Manifest 之后、Apply 之前 数据库备份、配置校验、排空节点前检查 阻止升级继续
post-upgrade 在所有资源 Apply 成功之后 发送通知、更新外部 DNS、清理旧资源 仅记录警告,不触发回滚
pre-rollback 在回滚操作 Apply 之前 暂停流量、记录回滚原因 阻止回滚继续
post-rollback 在回滚操作 Apply 之后 恢复流量、清理临时资源 仅记录警告
节点排空场景关联:在故障域隔离演练中,pre-upgrade 钩子可用于执行节点排空前置检查(如确认 PodDisruptionBudget 是否就绪),post-upgrade 钩子可用于验证排空后节点状态并发送演练报告。

3.5 升级流程完整时序

以下是一个完整的 helm upgrade --atomic 时序流程:

1. 用户执行 helm upgrade my-release ./chart --atomic
2. Helm 读取当前 Release 的 DEPLOYED Revision(如 v2)
3. 渲染新 Chart 模板,生成新 Manifest
4. 执行 pre-upgrade 钩子(如果有)
   ├── 成功 → 继续
   └── 失败 → 终止升级,不创建新 Revision
5. 通过 K8s API 逐个 Apply 资源(创建/更新/删除)
   ├── 全部成功 → 创建新 Revision(v3),状态 DEPLOYED
   └── 任何失败 → 触发自动回滚
       ├── 读取 v2 Manifest
       ├── 执行 pre-rollback 钩子
       ├── 恢复资源到 v2 状态
       ├── 执行 post-rollback 钩子
       └── 创建新 Revision(v3),状态 FAILED
6. 执行 post-upgrade 钩子(即使回滚也会执行)
7. 输出升级结果
参数调优提示:在节点排空场景中,建议设置 --timeout 10m(默认 5 分钟),给排空操作留出充足时间。同时使用 --wait 确保所有 Pod 就绪后再标记升级完成。