4. Helm 架构与工作原理:Tiller vs Helm3、客户端架构、Chart 渲染与安装流程

理解 Helm 的架构演进与核心工作原理,是掌握集群配置治理与漂移审计的基础。本章深入剖析 Helm 从 v2 到 v3 的架构变革、纯客户端设计哲学,以及 Chart 从渲染到安装的完整生命周期。

4.1 Tiller 时代(Helm v2)的架构与痛点

Helm v2 采用 客户端-服务端(C/S) 架构,核心组件包括 Helm CLI(客户端)和 Tiller(服务端)。

架构核心: Helm CLI 负责 Chart 打包与渲染,Tiller 负责与 Kubernetes API Server 交互,管理 Release 生命周期。
组件 职责 运行位置
Helm CLI Chart 开发、依赖管理、模板渲染、将渲染后的 YAML 发送给 Tiller 用户本地或 CI/CD 节点
Tiller 接收渲染后的资源、调用 K8s API 创建/更新/删除资源、维护 Release 版本历史 K8s 集群内部(Pod)

Tiller 的存在引入了以下关键痛点,直接推动了 Helm v3 的诞生:

  • 安全风险: Tiller 拥有集群级权限,一旦被攻破,整个集群面临风险。RBAC 配置复杂且易出错。
  • 集群状态依赖: Release 信息存储在 Tiller 的 ConfigMap 中,Tiller 故障或数据丢失会导致 Release 管理失控。
  • 多租户隔离困难: 单个 Tiller 实例难以实现精细化的命名空间级权限隔离。
  • 升级与维护成本: Tiller 本身需要升级,增加了集群运维的复杂度。
Helm v2 架构:客户端 + Tiller 服务端 Helm CLI Chart 渲染 / 打包 Tiller Release 管理 / API 调用 K8s API Server 资源创建 / 更新 渲染后 YAML K8s API 调用 Release 信息存储于 ConfigMap(集群内) 安全风险:集群级权限 RBAC 配置复杂

4.2 Helm v3 架构:纯客户端与无 Tiller 设计

Helm v3 彻底移除了 Tiller,采用 纯客户端架构。Helm CLI 直接通过 K8s 的 kubeconfig 文件与 API Server 交互,所有 Release 信息以 Secret 资源形式存储在集群内部。

架构变革核心: 去中心化、安全增强、简化运维。Helm v3 不再需要集群内运行任何服务端组件。
对比维度 Helm v2 Helm v3
架构模式 客户端-服务端(C/S) 纯客户端
服务端组件 Tiller(运行在集群内) 无
Release 存储 ConfigMap(Tiller 命名空间) Secret(Release 所在命名空间)
权限模型 Tiller 拥有集群级权限 使用当前用户的 kubeconfig 权限
安全风险 高(Tiller 成为攻击目标) 低(无集群内服务端)
多租户支持 困难 天然支持(基于命名空间隔离)
升级复杂度 需要升级 Tiller 仅升级 CLI 工具
Helm v3 架构:纯客户端 + 直接 API 交互 Helm CLI Chart 渲染 / 安装 / 升级 K8s API Server 资源创建 / 更新 / 删除 kubeconfig 认证 + K8s API 调用 Release 存储 Secret(命名空间内) 无 Tiller 组件 安全风险显著降低

4.3 Chart 渲染与安装流程详解

Helm 的核心工作流围绕 Chart 渲染 和 Release 安装 展开。理解这一流程对于诊断配置漂移至关重要。

4.3.1 渲染阶段(Render Phase)

  1. 加载 Chart: Helm 读取 Chart 目录或 Chart 包(.tgz),解析 Chart.yaml 元数据。
  2. 合并 Values: 按照优先级合并用户提供的 Values(--values、--set)与 Chart 默认的 values.yaml。优先级:--set > --values > values.yaml。
  3. 模板引擎执行: Go 模板引擎遍历 templates/ 目录下的所有 .yaml、.tpl 文件,结合合并后的 Values 和内置函数(如 .Release.Name、.Chart.Name)生成最终的 Kubernetes 资源 YAML。
  4. Hook 处理: 识别 Chart 中定义的 Helm Hook(如 pre-install、post-upgrade),准备在安装/升级流程的特定阶段执行。

4.3.2 安装阶段(Install Phase)

  1. Release 记录创建: Helm 在目标命名空间创建一个 Secret,记录 Release 名称、版本、Chart 元数据、渲染后的 Manifest 等。
  2. 资源排序与创建: 按照 K8s 资源依赖顺序(Namespace > ServiceAccount > ConfigMap > Deployment > Service > Ingress)依次调用 K8s API 创建资源。
  3. Hook 执行: 在安装流程的特定节点执行 Hook Job(如数据库初始化)。
  4. 状态监控: Helm 等待资源达到就绪状态(如 Deployment 的 Pod 全部 Running),超时则标记 Release 为 FAILED。
配置漂移审计关键点: 渲染阶段生成的 Manifest 是审计的基准。任何绕过 Helm 直接修改集群资源的行为,都会导致实际集群状态与 Helm Release 记录的 Manifest 不一致,形成配置漂移。
Helm v3 Chart 渲染与安装完整流程 阶段 1:渲染(Render) 加载 Chart 合并 Values 模板引擎执行 Hook 预处理 生成 Manifest 阶段 2:安装(Install) 创建 Release Secret 排序并创建资源 执行 Hook 状态监控 输出:Release 状态(DEPLOYED / FAILED) 配置漂移审计关键点 Release Secret 中记录的 Manifest 是审计基准,与实际集群资源对比发现漂移

4.4 客户端架构的核心组件

Helm v3 的 CLI 工具内部由多个模块协同工作,构成完整的客户端架构:

模块 功能描述 审计相关
Chart Loader 加载 Chart 目录或包,验证 Chart.yaml 完整性 确保审计的 Chart 来源可信
Values Merger 按优先级合并多来源 Values,生成最终配置 Values 变更记录是漂移溯源的关键
Template Engine 基于 Go 模板渲染资源 YAML 渲染结果直接决定集群预期状态
Release Manager 管理 Release 的 CRUD 操作,维护 Secret 记录 Release 历史是审计的核心数据源
K8s Client 通过 client-go 与 K8s API Server 通信 所有集群操作均通过此模块执行
运维最佳实践: 在 CI/CD 流水线中,使用 helm template 命令仅执行渲染阶段,输出 Manifest 文件进行版本控制与审计,再使用 helm upgrade --install 执行实际安装。这种分离策略可以清晰区分“预期状态”与“实际部署”。