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
,且 REVISION
为 1
。
随着时间推移,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 提供的单命令回滚机制,可以在关键时刻快速恢复服务,大大提升了部署的可靠性。