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 的上下文权限。
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 从创建到销毁的完整过程。理解每个阶段的状态变化,是故障域一致性复核的前提。
核心生命周期命令与状态对照
| 命令 | 触发状态 | 成功状态 | 失败状态 | 一致性复核要点 |
|---|---|---|---|---|
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 归档进行外部校验。