本节摘要:Helm 是 Kubernetes 的包管理器:chart 把一整套清单(Deployment、Service、ConfigMap……)连同可变参数打包成"种子套装",values 文件按环境覆盖参数,install 与 upgrade 一条命令成套播种、成套升级,rollback 成套回退。本节用 Helm 给书屋打包与发布,并辨析它与我们手写清单的关系。
数一数书屋的家当:网页的 Deployment 与 Service、接口的 Deployment、Service、ConfigMap、Secret、数据库的 StatefulSet 加 headless Service、Ingress、HPA……十来份 YAML,开发田生产田各一套,参数还不同(株数、地址、口令)。手工 apply 尚可撑,可"改一处、同步两田"的心智负担与日俱增。更别提社区软件:想装个监控套装,人家有几十份清单,总不能逐份抄。
Helm 的解法与操作系统的包管理器同构:chart 是种子套装包(一整套清单加参数模板),values 是随包附的配置页(按环境改参数不改包),仓库是套装目录。装、升、卸、回退,全是一条命令的事。

先从"用别人的包"开始(这是 Helm 最常见的用法)。装一个数据库套装:
# 添加套装目录(业界共享包的仓库) helm repo add bitnami https://charts.bitnami.com/bitnami # "bitnami" has been added to your repositories # 检索并安装:起名 shelf-db 装进生产田 helm search repo bitnami/postgresql # NAME CHART VERSION APP VERSION # bitnami/postgresql 13.2.0 16.1.0 helm install shelf-db bitnami/postgresql -n greenlib-prod \ --set auth.username=greenlib_app --set auth.database=bookshelf # NAME: shelf-db # STATUS: deployed # REVISION: 1 # 套装装出来的是一整组对象 helm ls -n greenlib-prod # NAME CHART APP VERSION REVISION STATUS # shelf-db bitnami/postgresql 16.1.0 1 deployed
对比第六章手种的 StatefulSet:helm install 一条命令交付了 StatefulSet、Service、ConfigMap、Secret 一整套,参数用 --set 现场改。套装是把"一整套期望"整体版本化——第六章我们逐份交单,Helm 替我们把单据订成册。
自产套装同样简单,目录里两样东西:模板(就是全册写熟的那些清单,参数换成占位符)加 values(默认参数页)。看一份模板化后的 Deployment 长什么样:
# 套装模板里的 deployment 片段:参数化的全册老朋友 apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Values.web.name }} spec: replicas: {{ .Values.web.replicas }} # 占位 株数由 values 页定 selector: matchLabels: app: {{ .Values.web.name }} template: metadata: labels: app: {{ .Values.web.name }} spec: containers: - name: web image: "{{ .Values.web.image.repo }}:{{ .Values.web.image.tag }}"
# values-prod.yaml:生产田的参数页 web: name: greenlib-web replicas: 3 image: repo: greenlib/web tag: "1.0.0"
# 成套发布:按生产参数页装配 helm upgrade --install greenlib ./greenlib-chart -f values-prod.yaml -n greenlib-prod # Release "greenlib" has been upgraded. REVISION: 7 # 换田发布:同一包 开发参数页 helm upgrade --install greenlib ./greenlib-chart -f values-dev.yaml -n greenlib-dev # Release "greenlib" has been upgraded. REVISION: 2 # 成套回退:回到上一版装配 helm rollback greenlib 6 -n greenlib-prod # Rollback was a success
upgrade --install 这个组合动词值得记住:装过就升、没装就装,发布脚本里不用写分支。revision 号与 7.2 的 rollout history 神似——又是那套"历史账本"思想,只是记账单位从单个对象换成了整套。
要,而且你已经学了。Helm 的模板语法只是全册清单的参数化外壳,看不懂裸清单的人,套装出错时只能干瞪眼。合理的分工是:理解与排错靠手写清单的功底,批量交付与版本化靠 Helm。书屋的定稿工作流:新部件先手写清单验证,稳定后收编进 chart,两田发布只改 values 页。
⚠️ 常见坑:
--set传复杂参数(嵌套对象、逗号、长字符串)容易踩转义坑,参数一多就改用-f传 values 文件,可读可审。另一个坑是版本漂移:套装升级后 revision 涨了,但有人又绕过 Helm 手改过台账里的对象——下次 upgrade 手改即被覆盖。一套对象只有一个管家,要么全 Helm,要么全清单,别混。
helm install、upgrade --install、rollback:成套播种、成套升级、成套回退