Helm 是什么
Helm 是 Kubernetes 的包管理器,地位类似 Linux 上的 pacman / apt。apt 安装的单位是 deb 包,Helm 安装的单位是 chart。
# archlinux
pacman -S helm
# macOS
brew install helm
# curl
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
Chart 解决什么问题
在 K8s 里部署一个应用,需要的远不止一个镜像。以 Kong(API 网关 + Ingress Controller)为例,一次部署要创建这些资源:
- Deployment:跑 Kong 网关和 Ingress Controller 两个容器
- Service:proxy、admin、webhook 等多个
- ServiceAccount、ClusterRole、ClusterRoleBinding:Controller 要读集群里的 Ingress
- ValidatingWebhookConfiguration:校验用户提交的 Kong 资源
- Secret:webhook 用的 TLS 证书
- CRD:KongPlugin、KongConsumer 等自定义资源
手写这些 YAML 有几个问题:
- 量大,资源之间互相引用(Service 的 selector 要对上 Pod 的 label,webhook 的 caBundle 要对上 Secret),手写容易错。
- 每个用户的环境不一样:LoadBalancer IP、资源配额、是否开 TLS。直接改 YAML 的话,上游一更新就得重新合并一遍。
- 升级、回滚没有统一的单位,只能一个个资源去改。
Chart 就是针对这几个问题的打包方式:上游维护者把这套 YAML 写成模板,把需要用户决定的部分抽成参数(values),打上版本号发布。用户只关心自己那几个参数。
Chart 的结构
一个 chart 就是一个目录(发布时打成 .tgz):
kong/
├── Chart.yaml # name, version, appVersion, dependencies
├── values.yaml # default parameters
├── templates/ # Go templates that render to K8s manifests
│ ├── deployment.yaml
│ ├── service.yaml
│ └── ...
└── crds/ # CRDs, installed before templates
渲染过程是:templates/ + 默认 values.yaml + 用户的 values 覆盖 → 一组普通的 K8s YAML。可以用 helm template 直接看渲染结果,不需要连集群:
helm repo add kong https://charts.konghq.com
helm template kong kong/kong --version 3.4.1 -n kong -f my-values.yaml
用户的 values 通常只有几十行,比如:
proxy:
loadBalancerIP: 192.0.2.10
resources:
requests:
cpu: 100m
memory: 384Mi
Chart 和镜像的关系
一个常见的误解是 chart 把几个镜像打包在一起。实际上 chart 里不包含任何镜像,它只是一堆 YAML 模板,镜像在模板里以 image: 仓库:tag 的形式被引用,运行时由节点自己去镜像仓库拉。
所以 chart 和镜像是两个独立发布、独立版本号的东西。Chart.yaml 里有两个版本字段:
| 字段 | 含义 | 例子 |
|---|---|---|
version |
chart 本身的版本,模板或默认值改了就升 | 3.4.1 |
appVersion |
这个 chart 默认部署的应用版本,多数 chart 用它当默认镜像 tag | 3.9 |
几个推论:
- 升级 chart 不一定升级镜像。Kong chart 从 2.52.0 升到 3.4.1,跨了一个大版本,但渲染出来的镜像仍然是
kong:3.9和kong/kubernetes-ingress-controller:3.5,变化的只是模板写法和 webhook 配置。 - 反过来也成立:chart 的小版本升级可能只是把默认镜像换了。Loki chart 6.55.0 → 7.3.0 渲染结果的唯一实质差异是
grafana/loki:3.6.7→3.6.11。 - 镜像版本可以和 chart 解耦:大多数 chart 允许在 values 里覆盖
image.tag,锁定镜像而单独升级 chart,或者反过来。 - chart 的大版本号(major)表示模板或 values 有不兼容变化,不代表应用本身有大版本变化。升 major 前要看 chart 的 CHANGELOG / UPGRADE 文档,而不是应用的 release notes。
一个 chart 引用多个镜像很常见(Kong 引用两个,Loki 单机模式引用 Loki 本体和一个 sidecar)。chart 保证的是这几个镜像的版本组合经过上游测试、能配合工作;这也是一起升级省事的原因。但这个"组合"是写在模板里的引用关系,不是打包关系。
Release:安装后的实例
chart 是模板,release 是用某组 values 安装到集群里的一个实例。同一个 chart 可以在不同 namespace 装多个 release。
helm install kong kong/kong -n kong -f my-values.yaml
helm upgrade kong kong/kong -n kong --version 3.4.1 -f my-values.yaml
helm list -n kong
helm history kong -n kong
helm rollback kong 3 -n kong # back to revision 3
Helm 把每次安装或升级的渲染结果存成 namespace 里的一个 Secret(sh.helm.release.v1.<name>.v<N>),回滚就是把之前某个版本的渲染结果重新 apply。
与 Argo CD 搭配
用 Argo CD 部署 chart 时,Argo CD 只借用 Helm 的渲染能力:它内部执行相当于 helm template 的操作,把结果当普通 YAML 去同步,不会调用 helm install。因此:
helm list看不到这些应用,回滚走 Argo CD 或 git revert,而不是helm rollback。- chart 版本写在 Application 的
targetRevision,values 文件放在自己的 git 仓库里,两者都受版本控制。 - Renovate 这类工具可以监控
targetRevision,有新 chart 版本时自动开 PR。
sources:
- repoURL: https://charts.konghq.com
chart: kong
targetRevision: "3.4.1"
helm:
valueFiles:
- $values/k8s/kong/values.yaml
Chart 的维护者可以和应用不同
chart 是独立的发布物,维护者不一定是应用的开发者,也可能中途换人。一个例子是 Loki:2026 年 3 月起,面向开源用户的 Loki chart 从 grafana/helm-charts 迁到了社区维护的 grafana-community/helm-charts(从 chart 6.55.0 分叉),原仓库里的 grafana/loki chart 从 7.x 开始只为企业版 Grafana Enterprise Logs 维护。
这时 Loki 镜像本身仍然是同一个开源镜像,变化的只是"谁来维护模板"。如果继续跟着原仓库升级,渲染结果短期内可能没差别,但长期会偏向企业版的默认值。开源用户应当把 chart 来源(repoURL)换到社区仓库。
所以选 chart 时除了看版本,还要看 chart 仓库是谁在维护:应用官方、社区组织(如 grafana-community),还是个人。
升级 chart 前的检查
# list available chart versions
helm search repo grafana-community/loki --versions | head
# show default values of the target version
helm show values kong/kong --version 3.4.1
# render old and new with the same values, then diff
helm template kong kong/kong --version 2.52.0 -f values.yaml > old.yaml
helm template kong kong/kong --version 3.4.1 -f values.yaml > new.yaml
diff old.yaml new.yaml
diff 时重点看:
image:行,确认镜像有没有变- StatefulSet 的
selector、serviceName、volumeClaimTemplates,这些字段不可修改,变了就要先删 StatefulSet 再重建 - CRD 变化,很多 chart(如 Longhorn)要求手动先 apply CRD
- 新增或删除的资源
维护记录
| 时间 | 修改内容 | 原因 |
|---|---|---|
| 2026-10-03 | 标题改为 Helm Chart: Kubernetes 包管理;分类 Inbox → Cloud;补充 chart 结构、chart 与镜像的关系、release、Argo CD 搭配、chart 维护者变更、升级检查 |
原文只有安装命令,补充 chart 概念说明 |