3. Helm 工作原理:Chart 结构、Tiller/Helm v3 架构差异、Release 管理机制

理解 Helm 的工作原理是掌握故障域隔离设计的前提。本章深入剖析 Helm 的核心组件:Chart 的目录与文件规范、Helm v2 (Tiller) 与 Helm v3 的架构演进,以及 Release 版本的生命周期管理机制。

3.1 Chart 结构:应用包的标准规范

一个 Helm Chart 是描述一组 Kubernetes 资源的文件集合。遵循标准目录结构,确保 Chart 可被 Helm 客户端解析、验证与渲染。

3.1.1 标准目录布局

mychart/
├── Chart.yaml          # Chart 元数据(名称、版本、API版本等)
├── values.yaml         # 默认配置值
├── values.schema.json  # (可选) values 的 JSON Schema 校验
├── charts/             # (可选) 子 Chart 依赖(.tgz 或目录)
├── crds/               # (可选) 自定义资源定义(CRD)
├── templates/          # 模板文件目录
│   ├── NOTES.txt       # (可选) 安装后的使用说明
│   ├── _helpers.tpl    # (可选) 模板辅助函数
│   ├── deployment.yaml
│   ├── service.yaml
│   └── ...
└── README.md           # (可选) 使用文档

3.1.2 核心文件职责

文件/目录 职责 是否必须
Chart.yaml 定义 Chart 名称、版本、API 版本、描述、关键字等 是
values.yaml 提供默认配置值,模板通过 .Values 引用 是
templates/ 存放 Go 模板文件,渲染后生成 Kubernetes 资源清单 是
charts/ 管理子 Chart 依赖,支持嵌套依赖树 否
crds/ 存放 CRD 定义,Helm v3 在安装时优先应用 否
最佳实践: 在 values.yaml 中为所有可配置项提供默认值,并使用 values.schema.json 对用户输入进行校验,避免因配置错误导致故障域扩大。

3.2 Tiller vs Helm v3:架构演进与故障域影响

Helm v2 与 v3 最核心的差异在于 服务端组件 Tiller 的移除。这一变化直接影响了权限模型、安全边界以及故障隔离能力。

3.2.1 架构对比

维度 Helm v2 (Tiller) Helm v3 (无 Tiller)
服务端组件 Tiller 运行在集群内,拥有集群管理员权限 无服务端组件,仅 Helm 客户端与 API Server 交互
权限模型 Tiller 使用 ServiceAccount,权限过大,存在安全风险 客户端使用 kubeconfig 中的用户权限,遵循 RBAC
Release 存储 存储在集群内的 ConfigMap 中(默认命名空间) 存储在集群内的 Secret 中(Release 所在命名空间)
故障域影响 Tiller 单点故障,影响所有 Release 管理 无中心组件,故障域缩小到客户端与 API Server 连接
安全隔离 Tiller 可访问所有命名空间,隔离性差 客户端权限受 kubeconfig 限制,天然支持多租户隔离
故障域关键点: Helm v2 的 Tiller 是一个集群级别的单点故障组件。一旦 Tiller 崩溃或被攻击,所有通过 Helm 管理的 Release 都无法进行安装、升级或回滚操作。Helm v3 移除了 Tiller,将故障域缩小到客户端与 API Server 之间的通信链路,显著提升了控制平面的稳定性。

3.2.2 架构演进示意图

Helm v2 与 Helm v3 架构对比 Helm v2 (Tiller) vs Helm v3 架构对比 Helm v2 Helm 客户端 (CLI) Tiller (集群内) Kubernetes API Server ConfigMap (Release 存储) 故障域:Tiller 单点 + 集群级权限 Helm v3 Helm 客户端 (CLI) Kubernetes API Server Secret (Release 存储) 故障域:客户端权限 + 无中心组件

3.3 Release 管理机制

Release 是 Helm 管理的核心抽象,代表 Chart 的一次部署实例。Helm 通过版本号、状态和存储后端来管理 Release 的完整生命周期。

3.3.1 Release 生命周期状态机

状态 描述 触发操作
pending-install 安装请求已提交,资源尚未完全创建 helm install
deployed Release 已成功部署并运行 helm install / helm upgrade 成功
failed 安装或升级过程中发生错误 操作执行失败
pending-upgrade 升级请求已提交,资源正在更新 helm upgrade
pending-rollback 回滚请求已提交,资源正在恢复 helm rollback
superseded 旧版本 Release,已被新版本替代 helm upgrade / helm rollback 后
uninstalled Release 已被卸载,但历史记录保留 helm uninstall
uninstalling 卸载请求已提交,资源正在清理 helm uninstall

3.3.2 Release 版本管理

每次 helm upgrade 或 helm rollback 都会创建一个新的 Release 版本。Helm v3 默认保留最近 10 个 历史版本(可通过 --history-max 配置)。

# 查看 Release 历史版本
helm history my-release -n my-namespace

# 输出示例
REVISION    STATUS        CHART             APP VERSION    DESCRIPTION
1           superseded    mychart-1.0.0     1.0            Install complete
2           superseded    mychart-1.1.0     1.1            Upgrade complete
3           deployed      mychart-1.2.0     1.2            Upgrade complete

3.3.3 Release 存储与故障域

Helm v3 将 Release 信息存储在 Secret 中,且位于 Release 所在的命名空间。这一设计对故障域隔离至关重要:

  • 命名空间隔离: 每个 Release 的 Secret 只存在于其所属命名空间,不会跨命名空间泄露。
  • 权限最小化: 客户端只需对目标命名空间具有读写 Secret 的权限,无需集群级权限。
  • 故障域缩小: 某个命名空间的 Release 管理故障不会影响其他命名空间。
关键结论: Helm v3 通过移除 Tiller、使用 Secret 存储 Release、以及遵循 RBAC 权限模型,将故障域从“集群级”缩小到“命名空间级”。在后续章节中,我们将利用这一特性设计 DNS 故障隔离与控制平面隔离策略。

3.4 本章小结

  • Chart 结构: 标准化的目录与文件规范,确保应用包的可移植性与可维护性。
  • 架构演进: Helm v3 移除 Tiller,消除了集群级单点故障,提升了安全性与故障隔离能力。
  • Release 管理: 基于 Secret 的版本化存储,支持回滚、历史追溯,且故障域限定在命名空间内。