1. 简介

Helm 是 Kubernetes 的一个强大的包管理工具,它支持高级功能,如查找包及其特定版本、执行复杂安装和自定义部署。

在本教程中,我们将重点讲解 Helm 的 发布升级回滚机制。我们将依次演示如何升级一个已发布的 Helm Chart、查看其历史版本,并执行回滚操作。

本教程的代码在 Debian 12(Bookworm)系统上测试,使用 GNU Bash 5.2.15 和 Helm 3.14.2。除非特别说明,这些命令在大多数符合 POSIX 标准的环境中都应能正常运行。


2. 发布与升级

Helm Chart 在安装后就成为一个“发布(Release)”。我们可以使用如下命令安装一个 Chart:

$ helm install banzaicloud-stable/satellite --generate-name --version 0.0.3
NAME: satellite-1709766601
LAST DEPLOYED: Sun Mar  3 03:03:24 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

此时,banzaicloud-stable/satellite Chart 被安装为名为 satellite-1709766601 的发布:

$ helm list
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS        CHART          
satellite-1709766601    default         1               2024-03-03 03:03:24.286660388 -0500 EST deployed      satellite-0.0.3

可以看到,当前版本为 satellite-0.0.3,且 REVISION1

随着时间推移,Chart 可能会发布新版本。这时我们可以使用 upgrade 命令升级发布:

$ helm upgrade satellite-1709766601 banzaicloud-stable/satellite --version 0.0.4
Release "satellite-1709766601" has been upgraded. Happy Helming!
NAME: satellite-1709766601
LAST DEPLOYED: Wed Mar  3 10:00:00 2024
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None

此时,REVISION 已更新为 2,我们可以通过 helm list 验证版本是否升级成功:

$ helm list
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS        CHART          
satellite-1709766601    default         2               2024-03-03 10:00:00.881000667 -0500 EST deployed      satellite-0.0.4

至此,我们已经完成了一次升级操作,该发布目前有两个版本(revision)。


3. 历史记录与回滚

如果一个发布经历了至少一次升级,Helm 会为它保留历史记录。这些历史版本记录了不同版本的部署状态,主要用于以下场景:

  • 将发布恢复到最后一个正常状态 ✅
  • 测试旧版本的发布 ✅
  • 集成测试 ✅

3.1 查看历史记录

在回滚之前,我们通常使用 history 子命令查看当前发布的历史版本:

$ helm history satellite-1709766601
REVISION        UPDATED                         STATUS          CHART            DESCRIPTION
1               Sun Mar  3 03:03:24 2024        superseded      satellite-0.0.3  Install complete
2               Sun Mar  3 10:00:00 2024        deployed        satellite-0.0.4  Upgrade complete

每个版本都有编号、时间戳、状态、Chart 名称和操作描述。这样我们就能清楚地知道哪个版本是最新部署的,哪个是旧版本。

3.2 执行回滚

现在我们尝试将发布回滚到第一个版本:

$ helm rollback satellite-1709766601 1
Rollback was a success! Happy Helming!

该命令将 satellite-1709766601 回滚到 revision 1。如果不指定版本号,Helm 会默认回滚到上一个版本:

$ helm rollback satellite-1709766601

⚠️ 注意:如果发布不在默认命名空间,需要加上 --namespace 参数。

由于该部署是临时的,回滚过程没有问题。但在生产环境中,持久化卷(Persistent Volume)和 PVC 可能会导致回滚失败,需要特别注意。

3.3 回滚版本选择

如果你开启了 Helm 自动补全功能,可以在输入 helm rollback 后按 Tab 键查看可选的发布名称,输入发布名后再按 Tab 可查看其所有版本:

$ helm rollback satellite-1709766601 [Tab]
1  (App: , Chart: satellite-0.0.3)  3  (App: , Chart: satellite-0.0.3)
2  (App: , Chart: satellite-0.0.4)

此时我们看到共有三个版本。我们也可以通过 history 命令验证:

$ helm history satellite-1709766601
REVISION        UPDATED                         STATUS          CHART            DESCRIPTION
1               Sun Mar  3 03:03:24 2024        superseded      satellite-0.0.3  Install complete
2               Sun Mar  3 10:00:00 2024        superseded      satellite-0.0.4  Upgrade complete
3               Sun Mar  3 13:00:00 2024        deployed        satellite-0.0.3  Rollback to 1

✅ 可以看到,每次回滚也会生成一个新的 revision,因此 revision 3 的描述为 “Rollback to 1”。

3.4 最大历史记录数

默认情况下,Helm 保留最多 10 个版本 的历史记录。但可以通过 --history-max 参数修改该限制:

$ helm upgrade satellite-1709766601 banzaicloud-stable/satellite --version 0.0.4 --history-max 5

你也可以设置为 0,表示不限制历史记录数量:

--history-max 0

3.5 高级选项

install 类似,rollback 也支持一些高级参数:

参数 说明
--cleanup-on-fail 若回滚失败,清理残留资源(类似 install --atomic
--dry-run 模拟回滚,不实际执行
--no-hooks 不执行钩子(hook)脚本
--wait 等待所有资源就绪再返回

通过这些参数,我们可以更灵活地控制回滚行为。


4. 总结

本文介绍了 Helm 的发布升级和回滚机制。

✅ 升级发布只需使用 helm upgrade 命令即可,Helm 会自动记录每次变更的版本(revision)。

✅ 使用 helm history 可以查看发布的历史版本,便于定位问题或执行回滚。

✅ 回滚操作使用 helm rollback,支持指定版本号或默认回退至上一版本。

⚠️ 特别提醒:回滚时要留意持久化卷和 PVC 的兼容性问题,避免因数据结构不一致导致服务异常。

Kubernetes 的部署过程往往比较复杂,一次失败的升级可能带来严重后果。而 Helm 提供的单命令回滚机制,可以在关键时刻快速恢复服务,大大提升了部署的可靠性。


原始标题:Helm Release Upgrades and Rollbacks