1. Helm 基础:Helm 的起源、Helm v3 架构、Chart 包结构、Tiller 移除后的安全模型

1.1 Helm 的起源与演进

Helm 最初由 Deis 公司在 2015 年发起,旨在解决 Kubernetes 应用打包、版本管理和部署的标准化问题。2016 年,Helm 被捐赠给 CNCF,并于 2018 年正式毕业,成为云原生生态中事实上的包管理标准。Helm 的核心价值在于将 Kubernetes 资源清单(YAML)抽象为可配置、可复用、可版本化的 Chart 包,从而大幅降低应用交付的复杂度。

版本 发布时间 核心架构 关键变化
Helm v2 2016 客户端 + 服务端 Tiller 引入 Chart 概念,Tiller 负责集群内资源管理
Helm v3 2019 纯客户端架构 移除 Tiller,引入 Release 记录存储于集群,增强安全模型
关键认知:Helm v3 的架构变革并非简单的功能升级,而是对 Kubernetes 安全模型的一次根本性对齐。移除 Tiller 意味着不再需要集群内的高权限服务端组件,所有操作由客户端直接通过 kubeconfig 与 API Server 交互,权限控制回归到 Kubernetes RBAC 体系。

1.2 Helm v3 架构剖析

Helm v3 采用纯客户端架构,核心组件包括 Helm CLI、Chart 包、Release 记录和 Kubernetes API Server。客户端直接通过 kubeconfig 文件与 API Server 通信,不再依赖集群内的 Tiller 服务端。

Helm v3 纯客户端架构 Helm CLI 本地 Chart 仓库 Chart 包 (.tgz) kubeconfig Kubernetes API Server Release 记录 (Secrets/ConfigMaps) 说明:Helm v3 所有操作均通过 kubeconfig 认证,Release 记录以 Secret/ConfigMap 形式存储在目标命名空间
架构要点:
  • Helm CLI:负责 Chart 的打包、依赖解析、模板渲染和部署执行。
  • Chart 包:标准化的应用打包格式,包含模板、默认值和依赖定义。
  • kubeconfig:客户端认证凭据,决定操作权限和作用域。
  • Release 记录:每次部署生成一个 Release,状态信息存储在目标命名空间的 Secret 或 ConfigMap 中。

1.3 Chart 包结构详解

一个标准的 Helm Chart 包遵循固定的目录结构,每个文件和目录都有明确的语义。理解 Chart 结构是编写高质量 Helm 包的基础。

my-chart/
├── Chart.yaml          # Chart 元数据:名称、版本、描述、依赖
├── values.yaml         # 默认配置值,供模板引用
├── values.schema.json  # (可选) values.yaml 的 JSON Schema 校验
├── charts/             # (可选) 子 Chart 依赖包
│   └── sub-chart-1.0.0.tgz
├── templates/          # 核心模板目录
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── _helpers.tpl    # 模板辅助函数
│   └── NOTES.txt       # 部署后提示信息
├── crds/               # (可选) 自定义资源定义
│   └── my-crd.yaml
└── README.md           # 使用说明
文件/目录 必选 功能说明
Chart.yaml 是 定义 Chart 名称、版本、API 版本、描述、关键字、依赖列表
values.yaml 是 提供默认配置值,模板通过 .Values 对象引用
templates/ 是 存放 Go 模板文件,渲染后生成 Kubernetes 资源清单
charts/ 否 存放子 Chart 依赖包,Helm 会自动解压和合并
crds/ 否 存放 CRD 定义,Helm 在安装时优先创建 CRD
values.schema.json 否 对 values.yaml 进行结构化校验,防止配置错误
常见陷阱:templates/ 目录下的所有 YAML 文件都会被 Helm 渲染并提交给 Kubernetes API Server。如果模板中存在语法错误或未定义的变量引用,会导致整个 Release 安装失败。建议在开发阶段使用 helm lint 和 helm template --debug 进行预检。

1.4 Tiller 移除后的安全模型

Helm v2 的 Tiller 组件是集群内的高权限服务端进程,拥有对 Kubernetes API 的广泛访问权限。这种设计带来了严重的安全隐患:Tiller 的 ServiceAccount 往往被授予 cluster-admin 角色,任何能访问 Tiller 的用户都能间接获得集群管理权限。Helm v3 彻底移除了 Tiller,将安全模型重构为基于 kubeconfig 的客户端认证体系。

Tiller 移除前后安全模型对比 Helm v2(含 Tiller) Helm CLI Tiller (高权限) API Server ⚠ 风险:Tiller 拥有 cluster-admin 权限 任何能访问 Tiller 的用户均可提权 Helm v3(无 Tiller) Helm CLI kubeconfig API Server ✓ 安全:权限由 kubeconfig 的 RBAC 控制 无集群内高权限服务端组件
安全模型核心变化:
  • 权限隔离:每个用户使用自己的 kubeconfig 和 ServiceAccount,权限范围由 Kubernetes RBAC 精确控制。
  • 无集群内服务端:不再需要维护 Tiller 的 ServiceAccount、ClusterRoleBinding 和 Deployment,攻击面大幅缩小。
  • Release 记录本地化:Release 状态存储在目标命名空间的 Secret 中,默认使用 ownerReferences 关联资源,避免跨命名空间权限泄露。
  • 插件与认证分离:Helm 插件不再拥有隐式集群权限,所有操作必须通过 kubeconfig 认证。
生产建议:在 Helm v3 环境中,推荐为每个团队或每个应用创建独立的命名空间和 ServiceAccount,并通过 RBAC 限制其只能操作本命名空间内的资源。对于跨命名空间的操作(如安装 ClusterRole),必须显式授予对应的 ClusterRoleBinding 权限。