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 插件迁移。
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 中。
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),当升级失败时自动回滚,避免服务中断。