1. Helm 基础概念

Helm 是 Kubernetes 生态中最流行的包管理工具,常被称为“Kubernetes 的 apt-get 或 yum”。它通过将 Kubernetes 资源(Deployment、Service、ConfigMap 等)打包为可复用、可版本化的 Chart,解决了原生 YAML 管理中的重复编写、环境差异和版本追溯难题。本章从 Helm 的定义、架构演进和核心术语三个维度建立基础认知。

1.1 Helm 是什么

Helm 是一个由 CNCF 毕业的云原生项目,核心能力包括:

  • 包管理:将一组 Kubernetes 资源描述文件打包为 Chart,支持版本化、依赖管理和发布。
  • 模板化:使用 Go 模板引擎,通过 values.yaml 实现环境差异化配置,避免硬编码。
  • 生命周期管理:提供 install、upgrade、rollback、uninstall 等命令,管理应用的全生命周期。
  • 仓库分发:通过 Chart Repository 实现 Chart 的存储、索引和共享。
适用场景:微服务多环境部署、中间件标准化交付、CI/CD 流水线中的应用发布、Operator 或复杂应用的版本管理。

1.2 Helm 架构演进:Tiller vs Helm 3

Helm 架构经历了从 v2(Tiller 模式)到 v3(无 Tiller 模式)的重大变革。下表对比了两种架构的核心差异:

对比维度 Helm v2(Tiller) Helm v3(无 Tiller)
服务端组件 需在集群中部署 Tiller Pod 无服务端组件,仅客户端 CLI
权限模型 Tiller 拥有集群级权限,存在安全风险 使用当前 kubeconfig 的 RBAC 权限,更安全
Release 存储 存储在 ConfigMap 中(默认命名空间) 存储在 Secret 中(Release 所在命名空间)
CRD 处理 需手动管理 CRD 安装顺序 支持 crds/ 目录自动安装 CRD
Chart 依赖 依赖管理较复杂,需手动 update 依赖管理更清晰,支持 OCI 仓库
命名空间隔离 Release 名称全局唯一 Release 名称按命名空间隔离
迁移建议:Helm v2 已于 2020 年 11 月停止安全更新,所有新项目应直接使用 Helm v3。存量 v2 环境建议通过 helm-2to3 插件迁移。
Helm v2 vs Helm v3 架构对比 Helm v2(Tiller 模式) Helm CLI(客户端) Tiller(服务端 Pod) Kubernetes API ConfigMap(Release 存储) Helm v3(无 Tiller 模式) Helm CLI(客户端) Kubernetes API(直接调用) Secret(Release 存储) 无服务端组件,更安全

1.3 Helm 核心术语

理解 Helm 的三个核心术语是掌握 Helm 使用的基础:

1.3.1 Chart

Chart 是 Helm 的打包格式,本质是一个遵循特定目录结构的文件集合。一个 Chart 包含描述应用所需的所有 Kubernetes 资源模板和配置。

标准 Chart 目录结构:

mychart/
├── Chart.yaml          # Chart 元数据(名称、版本、描述等)
├── values.yaml         # 默认配置值
├── values.schema.json  # (可选)values 的 JSON Schema 校验
├── charts/             # (可选)子 Chart 依赖
├── crds/               # (可选)CRD 定义(Helm v3)
├── templates/          # 模板文件目录
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── _helpers.tpl    # 模板辅助函数
│   └── NOTES.txt       # 安装后提示信息
└── README.md           # (可选)使用说明
关键点:Chart 版本遵循 SemVer 2.0 规范(如 1.2.3),每次资源模板或默认值变更都应升级版本号。

1.3.2 Release

Release 是 Chart 在 Kubernetes 集群中的一次运行实例。每次执行 helm install 都会创建一个新的 Release,而 helm upgrade 则更新现有 Release。Release 名称在命名空间内唯一。

Release 生命周期状态:

状态 说明
pending-install 安装操作已发起,但尚未完成
deployed Release 已成功部署并运行
upgrading 升级操作正在进行中
failed 安装或升级操作失败
superseded Release 已被新版本替代(历史版本)
uninstalling 卸载操作正在进行中
uninstalled Release 已被卸载(保留历史记录)

1.3.3 Repository

Repository(仓库)是用于存储和分发 Chart 的 HTTP/HTTPS 服务器。仓库通过 index.yaml 索引文件管理 Chart 的版本列表。Helm 客户端通过 helm repo add 添加仓库后,即可搜索和安装其中的 Chart。

常见 Chart 仓库类型:

  • 公有仓库:如 Bitnami、Artifact Hub、Helm Stable。
  • 私有仓库:自建 ChartMuseum、Harbor 或使用 OCI 兼容的容器镜像仓库。
  • OCI 仓库:Helm v3 支持将 Chart 以 OCI 镜像格式存储在 Docker Registry 中。
Helm 核心术语关系 Repository Chart 存储与分发 helm fetch Chart 模板 + 配置 + 依赖 (打包后的应用定义) helm install Release 集群中的运行实例 (Chart + 配置 = 部署) 三者关系总结 1. Repository 是 Chart 的存储仓库,提供版本索引和下载。 2. Chart 是从仓库获取或本地打包的应用定义包。 3. Release 是将 Chart 部署到集群后产生的运行实例,每个 Release 有独立版本历史。 4. 一个 Chart 可以多次部署产生多个 Release(如 dev、staging、prod 环境)。

1.4 快速上手:Helm 安装与第一个 Release

以下命令演示了从添加仓库到创建 Release 的完整流程:

# 1. 安装 Helm v3(macOS 示例)
brew install helm

# 2. 验证版本
helm version --short
# 输出示例:v3.14.0+g3fc9f4b

# 3. 添加 Bitnami 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami

# 4. 更新仓库索引
helm repo update

# 5. 搜索 Chart
helm search repo bitnami/nginx

# 6. 安装一个 Release(命名为 my-nginx)
helm install my-nginx bitnami/nginx --namespace default --create-namespace

# 7. 查看 Release 列表
helm list

# 8. 查看 Release 状态
helm status my-nginx

# 9. 升级 Release(修改副本数)
helm upgrade my-nginx bitnami/nginx --set replicaCount=3

# 10. 查看 Release 历史
helm history my-nginx

# 11. 回滚到上一个版本
helm rollback my-nginx 1

# 12. 卸载 Release
helm uninstall my-nginx
最佳实践:生产环境中建议使用 --atomic 参数(如 helm upgrade --atomic),当升级失败时自动回滚,避免服务中断。

1.5 本章小结