2. Helm 基础回顾:Chart 结构、模板引擎、Values 文件、Release 生命周期
在深入 GitOps 与变更门禁之前,必须重新夯实 Helm 的核心概念。Helm 是 Kubernetes 的包管理工具,它将应用的定义、配置、依赖打包为一个标准化的 Chart。本节将拆解 Chart 的物理结构、模板渲染机制、Values 注入方式以及 Release 的完整生命周期,为后续的配额变更与回滚判断建立共同语言。
2.1 Chart 目录结构
一个标准的 Helm Chart 遵循固定的目录布局。以下是一个典型 Chart 的骨架:
my-app/
├── Chart.yaml # 元数据:名称、版本、API 版本、依赖
├── values.yaml # 默认配置值(用户可覆盖)
├── values.schema.json # (可选)Values 的 JSON Schema 校验
├── charts/ # (可选)子 Chart 或依赖包
├── templates/ # 模板文件目录(核心)
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── _helpers.tpl # 命名模板(函数)
│ └── NOTES.txt # 安装后的提示信息
└── crds/ # (可选)CRD 定义,仅安装一次
| 文件/目录 | 作用 | 变更频率 |
|---|---|---|
| Chart.yaml | 定义 Chart 名称、版本、appVersion、依赖声明 | 低(版本升级时修改) |
| values.yaml | 提供默认配置,用户通过 --set 或自定义 values 文件覆盖 |
中(随环境参数调整) |
| templates/ | Go 模板 + YAML 清单,最终渲染为 Kubernetes 资源 | 高(业务逻辑变更) |
| charts/ | 存放子 Chart 或通过 helm dependency 下载的 tgz |
低(依赖更新时) |
| crds/ | 自定义资源定义,helm install 时优先安装 |
极低(仅首次或升级 CRD 版本) |
实践要点: 在 GitOps 场景中,
values.yaml 通常作为“基线”,环境差异通过 values-production.yaml 或 values-staging.yaml 在 Git 仓库中管理,避免直接修改 Chart 内的默认值。
2.2 模板引擎与渲染流程
Helm 使用 Go 的 text/template 引擎,并扩展了 sprig 函数库。模板引擎的核心工作是将 模板文件 + Values 渲染为纯 YAML。渲染流程如下:
- 加载 Chart:读取
Chart.yaml和values.yaml。 - 合并 Values:用户提供的
--values/--set覆盖默认值,形成最终 Values 对象。 - 解析依赖:如果存在子 Chart,递归加载并合并其 Values(全局值传递)。
- 执行模板:遍历
templates/目录,对每个.yaml/.tpl文件执行 Go 模板渲染。 - 校验输出:对渲染后的 YAML 进行基本结构校验(非 Schema 校验)。
- 生成 Release 对象:将渲染后的资源清单打包为 Release 记录,存储于集群 Secret 中。
关键命令:
helm template my-release ./my-chart — 仅渲染模板到终端,不安装,用于调试。helm install my-release ./my-chart --dry-run --debug — 模拟安装并输出渲染结果与 Values 合并过程。
2.3 Values 文件与作用域
Values 是 Helm 模板的数据源。理解其作用域规则对 GitOps 中的多环境配置至关重要。
| 来源 | 优先级(高→低) | 示例 |
|---|---|---|
--set / --set-string |
1(最高) | --set image.tag=v2.0 |
--values 指定文件 |
2 | --values prod-values.yaml |
| 父 Chart 的 values.yaml | 3 | 子 Chart 继承父 Chart 的全局值 |
| 子 Chart 自身的 values.yaml | 4(最低) | 子 Chart 默认值 |
常见陷阱: 在 GitOps 工具(如 ArgoCD/Flux)中,
--set 参数通常被映射为 Helm 参数或 Kustomize 补丁。如果直接在 Git 仓库中硬编码 --set,会导致声明式配置与运行时状态不一致。推荐将所有环境差异写入独立的 values 文件并纳入版本控制。
2.4 Release 生命周期
一个 Release 是 Chart 的一次部署实例。Helm 管理 Release 的完整状态变迁,这是实现回滚判断的基础。
- Pending-install:Helm 正在执行安装操作,资源尚未完全创建。
- Deployed:安装成功,所有资源正常运行。
- Failed:安装或升级过程中发生错误,部分资源可能已创建。
- Pending-upgrade:正在执行升级操作。
- Pending-rollback:正在执行回滚操作。
- Superseded:被新版本替代的历史 Release 版本。
- Uninstalled:已卸载,但 Release 记录保留(默认保留历史)。
2.5 关键命令速查
| 操作 | 命令 | 说明 |
|---|---|---|
| 安装 | helm install [name] [chart] |
创建 Release,版本号 = 1 |
| 升级 | helm upgrade [name] [chart] |
创建新版本,版本号递增 |
| 回滚 | helm rollback [name] [revision] |
回退到指定版本,版本号继续递增 |
| 查看历史 | helm history [name] |
列出所有版本及其状态 |
| 卸载 | helm uninstall [name] |
删除资源,保留 Release 记录 |
GitOps 关联: 在 GitOps 工作流中,
helm upgrade --install 是标准操作。ArgoCD 和 Flux 均使用此模式实现“期望状态”与“实际状态”的同步。回滚操作在 GitOps 中通常通过 Git revert 触发,而非直接执行 helm rollback,以保持 Git 作为单一事实来源。