2. Helm 基础回顾:Chart结构、模板引擎、Values文件、Release生命周期管理

在深入 Hook 驱动灰度发布 之前,必须重新夯实 Helm 的四大核心基础:Chart 结构、模板引擎、Values 文件 以及 Release 生命周期。这些概念是后续所有高级模式(集群模板、蓝图、准入检查)的基石。

2.1 Chart 结构:应用交付的“安装包”

一个 Helm Chart 本质上是一个遵循特定目录结构的压缩包。它定义了部署一个应用所需的所有 Kubernetes 资源清单以及配置逻辑。

路径 / 文件 是否必须 说明
Chart.yaml 是 Chart 的元数据文件,包含名称、版本、描述、API 版本等。
values.yaml 是 默认的配置值文件,定义了所有可配置参数的默认值。
templates/ 是 存放 Go 模板文件(如 deployment.yaml、service.yaml),渲染后生成 Kubernetes 清单。
charts/ 否 存放子 Chart(依赖项),用于构建复杂应用的依赖树。
crds/ 否 存放自定义资源定义(CRD),Helm 会在安装时优先安装这些 CRD。
templates/NOTES.txt 否 安装成功后向用户显示的帮助文本,通常包含访问地址、默认密码等。
templates/_helpers.tpl 否 存放可复用的模板子函数(命名模板),通过 include 调用。
关键点: templates/ 目录下的文件并非直接提交给 Kubernetes,而是先经过 Go 模板引擎渲染,再与 values.yaml 或用户提供的自定义值合并后输出。
Helm Chart 标准目录结构 mychart/ Chart.yaml values.yaml templates/ charts/ deployment.yaml service.yaml _helpers.tpl NOTES.txt 核心目录:templates/ 是模板引擎的 工作目录,所有 .yaml/.tpl 文件均在此渲染。

2.2 模板引擎:从参数到清单的渲染管线

Helm 使用 Go 标准库 text/template 作为模板引擎,并扩展了 60+ 个模板函数(来自 sprig 库)。模板引擎的核心工作流如下:

  1. 加载 Chart:读取 templates/ 目录下的所有文件。
  2. 合并 Values:将用户提供的 --set 或 -f custom.yaml 的值与 values.yaml 深度合并。
  3. 渲染模板:对每个模板文件执行 {{ .Values.xxx }} 替换,并执行 include、range、if 等控制结构。
  4. 生成清单:输出纯 YAML/JSON 格式的 Kubernetes 资源清单。
常用模板语法速查:
{{ .Values.replicaCount }} — 引用 Values 中的值
{{ include "mychart.labels" . }} — 调用命名模板
{{- range .Values.containers }} — 循环遍历列表
{{- if .Values.ingress.enabled }} — 条件判断

2.3 Values 文件:配置的“三明治”模型

Values 文件是 Helm 配置管理的核心。它采用 三层合并模型,优先级从低到高为:

层级 来源 优先级 典型用途
1 values.yaml(Chart 内置) 最低 提供所有参数的默认值,作为文档基线
2 父 Chart 的 values.yaml(依赖场景) 中 覆盖子 Chart 的默认值,实现全局配置
3 用户提供的 -f 文件 或 --set 参数 最高 环境差异化配置(如 dev/staging/prod)
避坑提示: --set 参数仅支持简单类型(字符串、数字、布尔)。复杂结构(如数组、嵌套对象)必须使用 --set-json 或通过 -f 传入 YAML 文件。在灰度发布场景中,建议始终使用 -f 传递环境差异文件,避免 --set 导致的类型隐式转换错误。

2.4 Release 生命周期管理:安装、升级、回滚、删除

一个 Release 是 Chart 的一次部署实例。Helm 通过 Release 记录(存储在 Secret 中)来追踪每次变更。核心生命周期命令如下:

  • helm install — 创建第一个 Release,生成 Release v1 记录。
  • helm upgrade — 执行滚动升级,生成 Release v2、v3… 记录。
  • helm rollback — 回滚到之前的 Release 版本(如 v1)。
  • helm uninstall — 删除 Release 及其所有资源。
  • helm list — 查看当前命名空间下的所有 Release。
Helm Release 生命周期状态转换 PENDING_INSTALL DEPLOYED FAILED UNINSTALLED install 成功 upgrade 失败 rollback uninstall 核心机制:每次 helm upgrade 都会创建新的 Release 版本(v2、v3…), 旧版本记录保留在 Secret 中,支持快速回滚。灰度发布正是利用这一机制实现版本切换。

2.5 核心概念关联:从 Chart 到 Release 的完整链路

理解以下链路是掌握 Helm 交付的关键:

Chart(模板 + 默认值)
    │
    ├── 用户提供自定义 Values(-f / --set)
    │
    ▼
模板引擎渲染(Go template + Sprig 函数)
    │
    ▼
生成 Kubernetes 清单(Deployment, Service, Ingress...)
    │
    ▼
Helm 调用 Kubernetes API 创建/更新资源
    │
    ▼
生成 Release 记录(存储在 Secret 中,包含清单快照)
    │
    ▼
Release 状态:DEPLOYED / FAILED / PENDING_UPGRADE
实战要点: 在后续的“集群模板蓝图”章节中,我们将把上述链路中的 Values 文件 和 模板渲染 步骤抽象为可复用的“蓝图”,并通过 Hook 在 Release 生命周期的特定节点(如 pre-upgrade、post-upgrade)注入准入检查逻辑,从而实现灰度发布的自动化控制。