管理 Release:安装、升级、回滚与卸载
涵盖 release 整个生命周期的命令,以及修订历史如何使回滚成为可能。
一旦有了 chart,使用 Helm 的日常工作几乎全部围绕管理 release:安装它们,随着 chart 或其 values 的变化升级它们,偶尔回滚某一个。本指南从头到尾介绍这个生命周期。
核心命令
| 命令 | 作用 |
|---|---|
helm install NAME CHART | 从 chart 创建一个新的 release。 |
helm upgrade NAME CHART | 对现有 release 应用变更。 |
helm upgrade --install NAME CHART | 如果 release 尚不存在则安装,存在则升级。 |
helm list | 列出当前命名空间中的 release(-A 表示所有命名空间)。 |
helm status NAME | 显示 release 的当前状态,并再次显示其 NOTES.txt。 |
helm rollback NAME REVISION | 将 release 恢复到之前的某个修订版本。 |
helm uninstall NAME | 移除 release 及其资源。 |
helm upgrade --install 值得单独提一下:它几乎是每个 CI/CD 流水线实际使用的模式,因为它意味着”确保这个 release 以这个配置存在”,而脚本无需知道或检查这是第一次部署还是第一百次。
每次变更都是一个编号的修订版本
helm install web ./webapp
helm list
全新安装是修订版本 1。随后的每次 upgrade 添加下一个编号,rollback 也会增加一个编号,因为回滚不是时光机,而是一个内容恰好与较旧版本相同的新修订版本:
| 操作 | 产生的修订版本 |
|---|---|
helm install | 1 |
helm upgrade | 2 |
helm upgrade | 3 |
helm rollback web 1 | 4(内容与修订版本 1 匹配,但编号继续增长) |
helm history web
列出每个修订版本及其状态、chart 版本和应用版本,rollback 和下面的检查命令读取的就是它。
升级出错时回滚
helm rollback web 2
kubectl rollout status deployment/web
回滚到某个具体的修订版本号是通常的情形。不带编号的 helm rollback web 则回退到紧邻的前一个版本。因为回滚会创建一个新的修订版本,所以先回滚再回滚一次,会让你回到起点,而不会撤销回滚本身;请检查 helm history,以确保你确切地知道自己要回退到哪个修订版本。
在不更改任何东西的情况下检查 release
helm status web
helm get values web
helm get manifest web
helm diff upgrade web ./webapp -f values-prod.yaml # requires the helm-diff plugin
get values 显示实际为这个 release 提供的内容,当运行中的 release 与磁盘上的 values 文件所暗示的不符时很有用。get manifest 显示 Helm 应用的确切 Kubernetes YAML(模板化之后),当你在调试 chart 源码与实际运行内容之间的差异时,它是事实依据。helm diff 不是内置的,而是被广泛使用的社区插件(helm plugin install https://github.com/databus23/helm-diff),在你运行一次没有把握的升级之前值得拥有,因为它会准确显示什么将会变化,而不实际应用任何东西。
卸载,并选择保留或丢弃历史
helm uninstall web
helm uninstall web --keep-history
默认情况下,卸载会同时移除 release 的资源及其历史。--keep-history 移除资源但保留 release 的记录,所以之后 helm history web 和 helm rollback 仍然可用,以防你需要恢复它,或者只是想要一份曾经运行过什么的审计轨迹。除非加上 -a/--all,否则即使使用了 --keep-history,helm list 也不会显示已卸载的 release。
Helm 4 中有什么变化
如果你使用 Helm 4,请注意一个行为上的差异:新安装默认使用 Kubernetes 的 server-side apply,而不是 Helm 3 所用的 client-side apply,它能更可预测地处理字段所有权和工具之间的冲突。对在 Helm 3 下创建的 release 进行升级和回滚,除非你显式传入 --server-side,否则仍使用 client-side apply,所以混合版本的工作流不会在你不知情的情况下突然改变行为。这不会改变上面的任何命令,只改变最终清单的应用方式。