本文基于 GitHub 项目 helm/helm 的源码结构、官方文档及最新发布信息,全面剖析 Helm 的核心概念、架构设计、版本演进、实战用法及生态定位。截至撰写时,Helm 最新稳定版为v4.2.3(2026 年 7 月发布),累计获得超过30,100 个 GitHub Star和7,700 个 Fork。
一、引言:为什么 Kubernetes 需要 Helm
在 Kubernetes 生态中,部署一个真实应用通常涉及 Deployment、Service、ConfigMap、Secret、Ingress 等多种资源类型的 YAML 清单。当应用规模从单个微服务扩展到包含数据库、缓存、消息队列的复合系统时,手写和维护这些 YAML 文件会迅速变成一场管理噩梦。
Helm 的诞生正是为了解决这一痛点。它将自身定位为“Kubernetes 的包管理器”,类似于 Linux 世界中的apt、yum或homebrew。通过将一组 Kubernetes 资源打包成可版本化、可分发、可依赖管理的单元(Chart),Helm 实现了:
- 一键安装复杂应用(如 Prometheus、Redis、MySQL 等)
- 版本管理与一键回滚
- 配置参数化,同一 Chart 适配多环境
- 依赖管理,自动拉取子 Chart
- 仓库分发,通过 HTTP(S) 或 OCI 注册表共享
二、项目概览
| 维度 | 信息 |
|---|---|
| 仓库地址 | https://github.com/helm/helm |
| 官网 | https://helm.sh |
| 开源协议 | Apache-2.0 |
| 编程语言 | Go |
| 所属组织 | CNCF(云原生计算基金会) |
| GitHub Star | 30,100+ |
| 当前稳定版 | v4.2.3(2026-07-09) |
| v3 支持状态 | Bug 修复至 2026-07-08,安全修复至 2026-11-11 |
源码目录结构
helm/ ├── cmd/helm/ # CLI 入口,helm 命令行工具的 main 包 ├── internal/ # 内部实现,不对外暴露的包 ├── pkg/ # 公共包,SDK API 对外暴露的核心库 ├── scripts/ # 构建、安装等辅助脚本 ├── testdata/ # 测试数据 ├── Makefile # 构建入口 ├── go.mod / go.sum # Go 模块依赖声明 ├── .goreleaser.yaml # 发布配置(GoReleaser) ├── .golangci.yml # 代码检查配置 └── ADOPTERS.md # 采纳者列表这一结构遵循了 Go 项目的经典布局:cmd/放命令入口,pkg/放可复用的公共库,internal/放私有实现。Helm 的 SDK 使用者可以直接引用pkg/下的包来在代码中调用 Helm 功能。
三、核心概念
Helm 围绕四个核心概念构建其包管理体系:
1. Chart(图表)
Chart 是 Helm 的打包单元,是一组 Kubernetes 资源描述文件的集合。一个 Chart 的典型目录结构如下:
myapp/ ├── Chart.yaml # Chart 元数据(名称、版本、描述等) ├── values.yaml # 默认配置值 ├── charts/ # 子 Chart 依赖(打包时会被一起归档) ├── templates/ # Go 模板文件目录 │ ├── deployment.yaml │ ├── service.yaml │ ├── configmap.yaml │ └── _helpers.tpl # 模板辅助函数 ├── crds/ # 自定义资源定义(可选) └── README.md # 说明文档Chart 使用SemVer 2(语义化版本)规范进行版本管理。Chart.yaml中必须包含apiVersion(当前主流为v2)和version字段。
2. Config(配置)
Config 是一组可合并到 Chart 中的配置信息。最常见的形式是values.yaml文件,它为模板中的变量提供默认值。用户可以在安装时通过--set或-f参数覆盖这些默认值,从而实现同一 Chart 在不同环境(开发、测试、生产)下的差异化部署。
3. Release(发布)
Release 是 Chart 与特定 Config 结合后,在 Kubernetes 集群中运行的实例。每次helm install都会创建一个新的 Release,并分配一个唯一的 Release 名称。Release 支持升级(helm upgrade)、回滚(helm rollback)和卸载(helm uninstall),形成完整的生命周期管理。
4. Repository(仓库)
Chart Repository 是存储和共享 Chart 的远程服务。它本质上是一个 HTTP(S) 服务器,提供一个index.yaml文件列出所有可用 Chart 及其版本。Helm v3 起原生支持OCI 注册表(如 Docker Registry)作为 Chart 仓库,v4 进一步增强了 OCI 支持,允许基于 digest 的安装方式:
helminstallmyapp oci://registry.example.com/charts/app@sha256:abc123...digest 不匹配时将阻止安装,显著提升了供应链安全。
四、架构演进:从 v2 到 v3 再到 v4
Helm 的架构经历了三次重大变革,每一次都深刻影响了其使用方式和安全模型。
Helm v2:Client + Tiller 的双组件架构
Helm v2 采用客户端-服务端架构:
┌──────────────┐ gRPC ┌──────────────┐ REST/JSON ┌──────────────┐ │ Helm Client │ ◄──────────────► │ Tiller Server│ ◄───────────────► │ K8s API │ │ (用户终端) │ │ (集群内 Pod) │ │ Server │ └──────────────┘ └──────────────┘ └──────────────┘- Helm Client:运行在用户本地或 CI/CD 中,负责本地 Chart 开发、仓库管理、发送指令给 Tiller。
- Tiller Server:运行在 Kubernetes 集群内部的 Pod 中,接收 Client 的 gRPC 请求,将 Chart 与 Config 合并生成 Release,然后通过 Kubernetes API 进行实际的资源创建、更新和删除。
Tiller 带来的问题:
- Tiller 通常以高权限 ServiceAccount 运行,在多租户集群中构成安全隐患
- RBAC 配置复杂,权限边界模糊
- 增加了集群内的攻击面
Helm v3:Tillerless 架构(2019 年 11 月)
Helm v3 的最大变化是彻底移除了 Tiller:
┌──────────────┐ kubeconfig ┌──────────────┐ │ Helm Client │ ◄────────────────► │ K8s API │ │ (用户终端) │ REST/JSON │ Server │ └──────────────┘ └──────────────┘v3 的 Helm 客户端直接读取kubeconfig配置文件(通常位于$HOME/.kube/config),像kubectl一样直接与 Kubernetes API Server 通信。这一改变带来了:
- 安全性提升:不再需要集群内的特权 Pod,权限完全由用户的 kubeconfig 和 Kubernetes RBAC 控制
- 部署简化:无需
helm init初始化 Tiller,下载二进制即可使用 - Release 存储变更:Release 记录从 Tiller 的内存/ConfigMap 迁移到集群内的 Secret(v3 默认),按 Namespace 隔离
Helm v4:现代化重构(2025 年 11 月)
Helm v4.0.0 于2025 年 11 月 12 日正式发布,这是继 v3 之后的首次主版本升级。v4 在保持 v3 Tillerless 架构的基础上,进行了全面的现代化改造:
┌────────────────────────────────────────────────┐ │ Helm v4 Client │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │ │ Template │ │ Plugin │ │ OCI / │ │ kubeconfig │ │ Engine │ │ System │ │ Repository │ │ ◄──────────────► K8s API Server │ │(Go+Sprig) │ │(CLI+WASM)│ │ Client │ │ │ └──────────┘ └──────────┘ └──────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ kstatus Resource Monitor │ │ │ │ (Server-Side Apply Support) │ │ │ └──────────────────────────────────────────┘ │ └────────────────────────────────────────────────┘v4 核心新特性:
全新插件系统:引入可选的WebAssembly(WASM)插件运行时,支持 CLI 插件、Getter 插件和 Post-renderer 插件三种类型,为安全沙箱化扩展创造了空间。现有插件仍可向后兼容使用。
Server-Side Apply 支持:解决多工具(如 Operator、Flux、ArgoCD)同时管理同一资源时的冲突问题。Server-Side Apply 允许 Kubernetes 跟踪字段所有权,避免 Helm 与其他控制器的写入冲突。
kstatus 资源监控:引入基于 kstatus 的资源状态计算引擎,使 Helm 能更准确地判断部署是否就绪,在处理复杂应用(如有就绪条件的 CRD)时表现更好。
Post-renderer 插件化:
--post-renderer不再允许直接传入可执行文件路径,必须指定已注册的插件名称。这是 v4 的破坏性变更之一。增强的 OCI 支持:支持基于 digest 的安装,digest 不匹配将阻止安装,提升供应链安全。
可复现构建:相同的 Chart 输入产生完全一致的归档包,增强供应链一致性。
slog 日志集成:使用 Go 1.21+ 引入的
slog包实现结构化日志。多文档 values 文件:values 文件可由多个 YAML 文档构成,适合复杂多配置场景。
自定义模板函数:可通过插件扩展 Helm 模板函数库。
CLI 旗标重命名:
--atomic→--rollback-on-failure,--force→--force-replace(旧旗标暂时兼容但会打印弃用警告)。
兼容性:ChartapiVersion v2继续受支持,现有 Chart 在 v4 中可正常安装和升级。
五、实战指南
5.1 安装 Helm
# macOSbrewinstallhelm# WindowswingetinstallHelm.Helm# 或chocoinstallkubernetes-helm# Linux (脚本安装)curl-fsSL-oget_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4chmod700get_helm.sh ./get_helm.sh5.2 添加仓库并安装 Chart
# 添加 Bitnami 仓库helm repoaddbitnami https://charts.bitnami.com/bitnami helm repo update# 搜索 Redis Charthelm search repo redis# 安装 Redishelminstallmy-redis bitnami/redis\--setauth.password="my-secret-password"\--setreplica.replicaCount=3\--namespacecache --create-namespace# 查看 Release 状态helm status my-redis-ncache# 列出所有 Releasehelm list-A5.3 创建自定义 Chart
helm create my-app生成的values.yaml核心字段:
# values.yamlreplicaCount:1image:repository:nginxpullPolicy:IfNotPresenttag:"1.27"service:type:ClusterIPport:80ingress:enabled:falseclassName:""hosts:-host:chart-example.localpaths:-path:/pathType:ImplementationSpecificresources:limits:cpu:500mmemory:256Mirequests:cpu:250mmemory:128Mitemplates/deployment.yaml中的 Go 模板示例:
apiVersion:apps/v1kind:Deploymentmetadata:name:{{.Release.Name}}-deploymentlabels:app:{{.Chart.Name}}spec:replicas:{{.Values.replicaCount}}selector:matchLabels:app:{{.Chart.Name}}template:metadata:labels:app:{{.Chart.Name}}spec:containers:-name:{{.Chart.Name}}image:"{{ .Values.image.repository }}:{{ .Values.image.tag }}"ports:-containerPort:{{.Values.service.port}}{{-if .Values.resources}}resources:{{-toYaml .Values.resources|nindent 12}}{{-end}}模板中可使用的内置对象包括:
| 对象 | 说明 |
|---|---|
.Release | Release 实例信息(名称、命名空间、版本等) |
.Values | values.yaml 中的值(可被--set/-f覆盖) |
.Chart | Chart.yaml 中的元数据 |
.Files | Chart 中的文件内容 |
.Capabilities | Kubernetes 集群能力信息(API 版本等) |
.Template | 当前模板的元信息 |
5.4 升级、回滚与卸载
# 升级 Release(修改 values 或 Chart 版本)helm upgrade my-redis bitnami/redis\--setreplica.replicaCount=5\-ncache# 查看历史版本helmhistorymy-redis-ncache# 回滚到上一个版本helm rollback my-redis1-ncache# 卸载helm uninstall my-redis-ncache5.5 打包与分发
# 语法检查helm lint my-app/# 打包为 tgz 归档helm package my-app/# 推送到 OCI 注册表helm push my-app-0.1.0.tgz oci://registry.example.com/charts六、Helm 在云原生生态中的定位
Helm 不是孤立存在的工具,它深度嵌入在云原生生态的多个关键环节:
GitOps 工具链
ArgoCD和Flux等 GitOps 控制器原生支持 Helm Chart 作为应用源。开发者将values.yaml提交到 Git 仓库,GitOps 控制器自动拉取 Chart 并同步到集群,实现声明式持续部署。
CI/CD 流水线
在 Jenkins、GitHub Actions、GitLab CI 等流水线中,Helm 常被用于部署阶段:
# GitHub Actions 示例-name:Deploy to Kubernetesrun:|helm upgrade --install my-app ./my-app-chart \ --values values-prod.yaml \ --namespace production \ --atomic --timeout 5m生态仓库
Artifact Hub 是 CNCF 支持的云原生包发现平台,收录了数千个 Helm Chart,涵盖数据库(MySQL、PostgreSQL、Redis)、监控(Prometheus、Grafana)、服务网格(Istio)、消息队列(Kafka、RabbitMQ)等几乎所有主流云原生组件。
Kubernetes 发行版与平台
几乎所有主流 Kubernetes 平台(EKS、GKE、AKS、Rancher、OpenShift)都以某种方式集成或推荐使用 Helm 进行应用部署。Azure Defender for Containers 的传感器甚至通过 Helm 进行部署。
七、Helm vs Kustomize:如何选择
Kustomize 是 Kubernetes 生态中另一个流行的配置管理工具,已于 Kubernetes 1.14 起内置到kubectl。两者在设计哲学上有根本性差异:
| 维度 | Helm | Kustomize |
|---|---|---|
| 核心定位 | 包管理器(类似 apt/yum) | 声明式配置叠加器 |
| 工作原理 | Go 模板渲染 + 变量注入 | Base + Overlay 的 YAML 补丁覆盖 |
| 配置控制 | 强管控(仅允许修改预定义变量) | 弱管控(自由修改任意字段) |
| 模板引擎 | Go 模板(条件、循环、函数) | 无模板(纯 YAML 合并) |
| 版本管理 | 内置 Release 版本与回滚 | 需依赖 Git 等外部工具 |
| 依赖管理 | 内置子 Chart 依赖机制 | 无原生支持 |
| 包分发 | Chart 仓库(HTTP/OCI) | 无仓库概念 |
| 多环境适配 | 多份 values.yaml | 原生 Overlay 目录结构 |
| kubectl 集成 | 需独立安装 | 内置(kubectl apply -k) |
| 学习曲线 | 中等(需掌握模板语法) | 较低(仅需 YAML 基础) |
选择建议:
- 选 Helm:需要打包分发标准化应用(如 MySQL、Prometheus);需要版本控制与回滚;跨团队共享 Chart;使用 GitOps 工具链。
- 选 Kustomize:需要快速修改已有 YAML 的少量字段(如镜像版本、副本数);遗留系统迁移,不想引入模板化;轻量级需求,零额外安装成本。
- 两者结合:实践中常见先用 Helm 部署标准化组件,再用 Kustomize 对特定环境做微调覆盖(社区有
helm-convert等插件辅助转换)。
八、版本路线图与社区
当前版本状态
- Helm v4(
main分支):当前稳定版,最新 v4.2.3(2026-07-09),后续 v4.3.0 计划于 2026 年 9 月发布 - Helm v3(
dev-v3分支):维护模式,Bug 修复截止 2026-07-08,安全修复截止 2026-11-11。v3.22.0 将是最后一个 v3 功能版本
社区参与
| 渠道 | 链接/说明 |
|---|---|
| Kubernetes Slack | #helm-users、#helm-dev、#charts |
| 邮件列表 | cncf-helm@lists.cncf.io |
| 开发者会议 | 每周四 9:30-10:00 太平洋时间 |
| Chart 发现 | Artifact Hub |
| 贡献指南 | CONTRIBUTING.md |
从 v3 迁移到 v4 的关键注意事项
- Post-renderer:必须从直接可执行文件路径改为插件名称
- CLI 旗标:更新
--atomic→--rollback-on-failure,--force→--force-replace - 插件测试:全面测试 CLI、Getter、Post-renderer 三类插件
- Server-Side Apply:如启用,需测试与现有 Operator/控制器的兼容性
- SDK 使用者:v4 SDK API 已重构并稳定化,需重新验证
- CI/CD 脚本:检查所有 helm 命令中的旗标和参数
九、总结
Helm 自 2016 年作为 CNCF 孵化项目诞生以来,已经从最初的 Helm Classic → v2(Client+Tiller)→ v3(Tillerless)演进到今天的v4(现代化重构)。它始终围绕一个核心理念——让 Kubernetes 应用的打包、分发和管理像操作系统包管理器一样简单。
Helm v4 通过引入 WASM 插件运行时、Server-Side Apply、kstatus 资源监控、增强 OCI 支持和可复现构建等特性,在安全性、可扩展性和现代化体验上迈出了重要一步。同时,对 v2 Chart 格式的向后兼容确保了迁移成本可控。
对于任何在 Kubernetes 上运行复杂应用的团队,Helm 都是值得掌握的基础工具。无论你是使用现成的社区 Chart 快速部署基础设施,还是为自己的微服务编写自定义 Chart 实现标准化交付,Helm 都能显著降低 Kubernetes 应用管理的复杂度。
参考资料
- Helm GitHub 仓库: https://github.com/helm/helm
- Helm 官方文档: https://helm.sh/docs
- Helm v4.0.0 发布分析: https://cloud.tencent.com/developer/article/2604364
- Helm Releases 页面: https://github.com/helm/helm/releases
- Artifact Hub (Chart 搜索): https://artifacthub.io