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 或用户提供的自定义值合并后输出。
2.2 模板引擎:从参数到清单的渲染管线
Helm 使用 Go 标准库 text/template 作为模板引擎,并扩展了 60+ 个模板函数(来自 sprig 库)。模板引擎的核心工作流如下:
- 加载 Chart:读取
templates/目录下的所有文件。 - 合并 Values:将用户提供的
--set或-f custom.yaml的值与values.yaml深度合并。 - 渲染模板:对每个模板文件执行
{{ .Values.xxx }}替换,并执行include、range、if等控制结构。 - 生成清单:输出纯 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。
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)注入准入检查逻辑,从而实现灰度发布的自动化控制。