3. Helm 核心概念:Chart、Release、Repository、Values,以及 Helm v3 的安全特性

在深入 Cilium 的 Helm 交付与准入控制之前,必须牢固掌握 Helm 自身的核心抽象与安全模型。Helm v3 相比 v2 在架构与安全性上发生了根本性变化,理解这些概念是后续编写 Cilium Chart 和配置准入控制策略的基础。

3.1 四大核心抽象

Helm 将 Kubernetes 资源的打包、配置与部署抽象为四个核心概念,它们构成了 Helm 的操作模型。

概念 定义 类比(类比操作系统) 关键特征
Chart Kubernetes 资源的打包格式,包含模板、默认值、依赖和元数据。 软件安装包(.deb/.rpm) 版本化、可依赖、可签名
Release Chart 在目标集群中的一次运行实例,包含部署状态与历史记录。 运行中的进程实例 每个 Release 有唯一名称、版本号、修订历史
Repository Chart 的存储与分发索引,通常托管在 HTTP 服务器上。 APT/YUM 软件源 通过 index.yaml 索引,支持 OCI 注册表
Values Chart 模板的输入参数,用于定制化部署行为。 配置文件或环境变量 支持默认值、层级覆盖、类型校验
实践要点: 在 Cilium 部署中,values.yaml 控制着从 CNI 插件选择、IPAM 模式到 Hubble 可观测性组件的全部行为。理解 Values 的覆盖优先级(--set > 自定义 values 文件 > Chart 默认值)是避免配置冲突的关键。

3.2 Helm v3 架构变革与安全特性

Helm v3 移除了 Tiller 服务端组件,将 Release 信息直接存储在 Kubernetes Secret 中。这一架构变化带来了显著的安全提升。

架构变化: Helm v2 中 Tiller 拥有集群级权限,成为安全攻击面。v3 完全依赖用户本地 kubeconfig 的 RBAC 权限,实现了“以用户身份运行”的安全模型。

3.2.1 Helm v3 核心安全特性清单

  • 无 Tiller 架构: 消除服务端特权组件,避免权限提升与横向移动风险。
  • Release 信息加密存储: Release 对象以 Secret 形式保存在目标命名空间,默认使用 secrets 存储后端,支持加密。
  • Chart 签名与验证: 使用 GnuPG 对 Chart 包进行数字签名,确保来源可信与完整性。
  • OCI 注册表支持: Chart 可存储在 OCI 兼容的容器镜像仓库中,复用镜像签名、扫描与访问控制策略。
  • 基于 Kubernetes RBAC 的权限控制: 用户只能在其 kubeconfig 授权的命名空间和资源范围内操作。
安全警示: 虽然 Helm v3 移除了 Tiller,但 Release Secret 默认未加密。在生产环境中,建议启用 Kubernetes 静态加密(Encryption at Rest)来保护 Release 中的敏感配置数据。

3.3 Helm v3 安全架构与操作流程

下图展示了 Helm v3 的安全架构与一次典型的 Chart 安装流程,重点突出无 Tiller 架构下的身份认证与数据流。

Helm v3 安全架构与安装流程 用户 / CI 系统 Helm CLI (v3) Chart Repository OCI Registry K8s API Server RBAC 鉴权 Release Secret 安全关键点: 1. Helm CLI 直接使用用户 kubeconfig 中的凭证与 API Server 通信,无中间特权组件。 2. Release 信息以 Secret 形式存储,受命名空间隔离与 RBAC 保护。

3.4 Chart 签名与验证实践

Helm v3 支持使用 GnuPG 对 Chart 进行签名,确保 Chart 在传输和存储过程中未被篡改。这是准入控制链中“来源可信”的第一道防线。

3.4.1 签名与验证流程

  1. 生成 GPG 密钥对: gpg --full-generate-key
  2. 导出公钥: gpg --export > public.key
  3. 签名 Chart: helm package --sign --key 'your-key-name' --keyring ~/.gnupg/secring.gpg ./mychart
  4. 验证 Chart: helm verify --keyring ./public.key ./mychart-0.1.0.tgz
生产建议: 在 CI/CD 流水线中,将 Chart 签名步骤集成到发布阶段,并将公钥分发给所有需要验证 Chart 的集群或工具(如 Kyverno、OPA Gatekeeper)。对于 Cilium 这类基础设施组件,建议使用硬件安全模块(HSM)或密钥管理服务(KMS)保护签名密钥。

3.5 Values 的层级结构与覆盖优先级

Values 是 Helm 模板化的核心输入。理解其层级结构与覆盖优先级,对于编写可复用的 Cilium Chart 至关重要。

3.5.1 Values 覆盖优先级(从低到高)

优先级 来源 示例 适用场景
1(最低) Chart 内置 values.yaml image.tag: "v1.14.0" 提供安全、合理的默认值
2 父 Chart 的 values.yaml 子 Chart 继承父 Chart 的默认值 多 Chart 依赖场景
3 用户自定义 values 文件 helm install -f my-values.yaml 环境差异化配置(开发/生产)
4(最高) --set 命令行参数 --set image.tag=v1.15.0 临时覆盖、CI/CD 参数注入

3.5.2 全局 Values 与子 Chart 作用域

在 Helm 依赖管理中,global 字段允许父 Chart 将值传递给所有子 Chart,而子 Chart 的 Values 默认作用域在其自身名称下。

# 父 Chart values.yaml
global:
  registry: "docker.io"
cilium:
  image:
    tag: "v1.15.0"
  hubble:
    enabled: true
最佳实践: 在 Cilium 的 Helm Chart 中,使用 global 字段传递镜像仓库地址、集群名称等全局参数;使用 cilium 作用域下的字段控制 Cilium 特定组件的配置。避免在子 Chart 中直接引用父 Chart 的非全局字段,以保持模板的可移植性。

3.6 Helm v3 安全特性总结

下表对比了 Helm v2 与 v3 在关键安全维度上的差异,帮助理解 v3 的安全优势。

安全维度 Helm v2 Helm v3
服务端组件 Tiller(集群级权限) 无(客户端直接调用 API)
Release 存储 ConfigMap(默认命名空间) Secret(目标命名空间)
权限模型 Tiller 的 ServiceAccount 用户 kubeconfig 的 RBAC
Chart 签名 支持(需插件) 原生支持(helm verify)
OCI 支持 不支持 原生支持(v3.8+)
命名空间隔离 弱(Tiller 跨命名空间) 强(Release 在目标命名空间)
迁移注意: 从 Helm v2 迁移到 v3 时,需使用 helm 2to3 插件迁移 Release 数据。迁移后,原有 Tiller 的 ServiceAccount 和 ClusterRoleBinding 应被清理,避免遗留权限风险。