2. Helm 基础回顾:Helm 架构、Chart 结构、Release 生命周期管理

在深入故障域与 OCI Registry 一致性复核之前,必须重新夯实 Helm 的核心基础。本章从 Helm 架构、Chart 结构、Release 生命周期 三个维度展开,为后续的变更追踪与一致性校验建立统一的术语体系和认知框架。

2.1 Helm 架构:Tiller 已死,Plugin 当立

Helm v3 彻底移除了服务端组件 Tiller,采用纯客户端架构。这意味着 Release 的状态直接存储在 Kubernetes 集群的 Secret 资源中,不再依赖中心化的服务端数据库。

架构要点: Helm v3 的架构简化了安全模型,不再需要为 Tiller 配置 RBAC,每个操作直接使用当前 kubeconfig 的上下文权限。
Helm v3 纯客户端架构 用户/CI Helm CLI Chart 仓库 OCI Registry Kubernetes API Release Secret Deploy / Service / ConfigMap 关键变化 无 Tiller Secret 存储 OCI 原生支持

2.2 Chart 结构:标准化的应用打包格式

一个 Helm Chart 是描述一组 Kubernetes 资源的文件集合。遵循标准目录结构是 Chart 可被 Helm 引擎正确解析的前提。

文件/目录 是否必需 说明
Chart.yaml 是 Chart 元数据:名称、版本、apiVersion、描述、依赖等
values.yaml 是 默认配置值,供模板引用
templates/ 是 Go 模板文件,渲染后生成 Kubernetes 资源清单
charts/ 否 子 Chart(依赖)的打包目录
crds/ 否 自定义资源定义(CRD),在模板渲染前安装
templates/NOTES.txt 否 安装成功后输出的使用说明
README.md 否 Chart 使用文档(最佳实践强烈建议包含)
一致性复核关注点: Chart.yaml 中的 version 和 appVersion 字段是 OCI 镜像 Tag 生成的关键输入,也是故障域中版本追溯的锚点。

典型 Chart 目录结构示例

my-app/
├── Chart.yaml          # apiVersion: v2, name: my-app, version: 1.2.3
├── values.yaml         # replicaCount: 3, image: nginx:1.21
├── values.schema.json  # (可选) values 的 JSON Schema 校验
├── charts/             # (可选) 依赖的子 Chart
│   └── redis/
├── crds/               # (可选) CRD 定义
│   └── crontabs.yaml
└── templates/
    ├── deployment.yaml
    ├── service.yaml
    ├── _helpers.tpl     # 模板辅助函数
    └── NOTES.txt        # 安装后提示信息

2.3 Release 生命周期管理

Release 是 Chart 的一次部署实例。Helm 通过一系列命令管理 Release 从创建到销毁的完整过程。理解每个阶段的状态变化,是故障域一致性复核的前提。

Release 生命周期状态机 pending-install deployed pending-upgrade failed superseded uninstalling uninstalled helm install → helm upgrade → helm rollback → helm uninstall

核心生命周期命令与状态对照

命令 触发状态 成功状态 失败状态 一致性复核要点
helm install pending-install deployed failed Chart 版本与 OCI Tag 是否匹配
helm upgrade pending-upgrade deployed(新) failed values 变更是否被完整记录
helm rollback pending-upgrade deployed(回滚版本) failed 回滚后的资源是否与历史 Release 一致
helm uninstall uninstalling uninstalled — Release 记录是否被清理

2.4 Release 存储与版本追溯

Helm v3 将 Release 信息存储在 Kubernetes Secret 中,命名格式为 sh.helm.release.v1.<release-name>.v<revision>。每个 Secret 包含完整的 Chart 内容、values 和模板渲染结果。

故障域关键洞察: 如果 Secret 被意外删除或篡改,Helm 将无法感知该 Release 的历史状态。一致性复核机制需要依赖 OCI Registry 中的 Chart 快照作为外部权威数据源,而非仅信任集群内的 Secret。

Release 信息存储结构

apiVersion: v1
kind: Secret
metadata:
  name: sh.helm.release.v1.my-app.v3   # Release: my-app, Revision: 3
  namespace: default
  labels:
    modifiedAt: "1695000000"            # 时间戳
    name: my-app
    owner: helm
    status: deployed                    # 当前状态
    version: 3                          # 修订版本号
type: helm.sh/release.v1
data:
  release: <base64 编码的 Release 数据>  # 包含 Chart 包、values、模板等

2.5 本章小结

  • 架构: Helm v3 去中心化,Release 状态存储在集群 Secret 中,无 Tiller 单点故障。
  • Chart: 标准目录结构是 Helm 引擎的契约,Chart.yaml 的版本字段是 OCI 一致性的锚点。
  • 生命周期: 每个 Release 经历 install → upgrade → rollback → uninstall 等状态转换,Secret 记录每次变更的完整快照。
  • 一致性前提: 集群内 Secret 可能因故障丢失,必须依赖 OCI Registry 的不可变 Chart 归档进行外部校验。