3. Helm Chart 基础回顾:Chart 结构、模板函数、Values 文件、依赖管理
在深入多环境配置之前,必须牢固掌握 Helm Chart 的核心基础。本章将系统回顾 Chart 的目录结构、模板渲染机制、Values 文件层级以及依赖管理方式,为后续构建开发沙箱、预发布、生产金丝雀等多环境配置体系打下坚实的技术地基。
3.1 Chart 目录结构与核心文件
一个标准的 Helm Chart 遵循固定的目录布局,每个文件和目录都有明确的职责。理解这一结构是编写可维护 Chart 的第一步。
| 路径 / 文件 | 必需 | 说明 |
|---|---|---|
Chart.yaml |
是 | Chart 的元数据文件,包含名称、版本、描述、API 版本等 |
values.yaml |
是 | 默认配置值文件,用户可通过 --values 或 --set 覆盖 |
templates/ |
是 | 存放 Go 模板文件,渲染后生成 Kubernetes 资源清单 |
charts/ |
否 | 存放子 Chart(依赖包),由 helm dependency 命令管理 |
crds/ |
否 | 存放自定义资源定义(CRD),Helm 会在安装时优先应用 |
templates/NOTES.txt |
否 | 安装成功后向用户显示的帮助信息模板 |
templates/_helpers.tpl |
否 | 存放可复用的模板片段(命名模板),通过 include 调用 |
最佳实践:始终将可复用的模板逻辑放入
_helpers.tpl 中,保持主模板文件的简洁性。这是实现多环境配置复用的关键手段。
3.2 模板函数与渲染机制
Helm 使用 Go 模板引擎扩展 Kubernetes 资源清单。模板函数是 Chart 灵活性的核心,允许在部署时动态注入配置。
3.2.1 核心模板语法
- 对象访问:
.Values、.Release、.Chart、.Files是内置对象,分别对应 values 文件、发布信息、Chart 元数据和文件内容。 - 管道与函数:使用
|串联函数,如.Values.replicaCount | default 3 | quote。 - 流程控制:
if/else、with、range用于条件渲染和循环遍历。 - 命名模板:通过
define定义,include或template调用,支持模板复用。
3.2.2 常用内置函数
| 函数 | 用途 | 示例 |
|---|---|---|
default |
为缺失值提供默认值 | .Values.image.tag | default "latest" |
quote |
将值用双引号包裹 | .Values.name | quote |
upper |
转换为大写 | .Values.env | upper |
nindent |
换行并缩进指定空格数 | .Values.annotations | nindent 4 |
toYaml |
将对象转为 YAML 字符串 | .Values.nodeSelector | toYaml |
hasKey |
检查字典中是否存在键 | hasKey .Values "ingress" |
多环境配置关键点:利用
default 函数和 if 条件判断,可以在同一个模板中根据 .Values.environment 或 .Release.Name 渲染出不同的资源规格,这是实现沙箱、预发布、生产差异化部署的基础。
3.3 Values 文件层级与覆盖策略
Values 文件是 Helm 配置的入口。理解其层级结构和覆盖顺序,对于管理多环境配置至关重要。
3.3.1 默认 Values 与用户 Values
- 默认值:
values.yaml中定义的值为 Chart 的默认配置。 - 用户覆盖:通过
helm install -f my-values.yaml或--set key=value传入的值会合并覆盖默认值。 - 合并规则:用户 Values 会深度合并到默认 Values 中,相同键被覆盖,新增键被添加。
3.3.2 多环境 Values 文件组织
推荐为每个环境创建独立的 Values 文件,并通过 -f 参数组合加载:
# 目录结构示例
my-chart/
├── values.yaml # 全局默认值
├── values-dev.yaml # 开发沙箱环境覆盖
├── values-staging.yaml # 预发布环境覆盖
└── values-prod.yaml # 生产环境覆盖
# 部署命令示例
helm install my-release ./my-chart \
-f values.yaml \
-f values-prod.yaml \
--set image.tag=v1.2.3
注意:多个
-f 文件的加载顺序从左到右,后加载的文件会覆盖先加载的文件中的相同键。始终将最通用的文件放在最前面,最具体的环境文件放在后面。
3.4 依赖管理与子 Chart
大型应用通常由多个组件组成,Helm 通过依赖管理支持将 Chart 拆分为可复用的子模块。
3.4.1 声明依赖
在 Chart.yaml 中使用 dependencies 字段声明子 Chart:
# Chart.yaml
apiVersion: v2
name: my-app
version: 1.0.0
dependencies:
- name: redis
version: ">=16.0.0"
repository: "https://charts.bitnami.com/bitnami"
condition: redis.enabled # 条件控制,当 redis.enabled 为 true 时安装
- name: postgresql
version: "~12.0.0"
repository: "https://charts.bitnami.com/bitnami"
alias: db # 别名,避免命名冲突
3.4.2 依赖管理命令
| 命令 | 作用 |
|---|---|
helm dependency update |
根据 Chart.yaml 下载依赖包到 charts/ 目录,并生成 Chart.lock 锁定版本 |
helm dependency build |
从 Chart.lock 重建依赖,确保版本一致性 |
helm dependency list |
列出当前 Chart 的所有依赖及其状态 |
3.4.3 子 Chart 的 Values 传递
父 Chart 可以通过全局值或子 Chart 特定键向子 Chart 传递配置:
# 父 Chart 的 values.yaml
global:
imageRegistry: "my-registry.cn" # 全局值,所有子 Chart 均可访问
redis:
enabled: true
architecture: standalone
auth:
enabled: false
postgresql:
enabled: true
auth:
database: myapp_db
username: myapp_user
多环境依赖管理:在环境特定的 Values 文件中,可以针对不同环境启用或禁用子 Chart。例如,开发沙箱中可能使用内存版 Redis(
redis.enabled: false),而生产环境使用高可用集群版。
3.5 核心概念关系图
下图展示了 Helm Chart 的核心组件及其在多环境配置中的交互关系:
3.6 本章小结
本章回顾了 Helm Chart 的四大核心基础:
- Chart 结构:标准目录布局确保 Chart 的可移植性和可维护性。
- 模板函数:Go 模板引擎提供了动态渲染能力,是多环境配置差异化的技术基础。
- Values 文件:层级覆盖策略允许从全局默认值到环境特定值的灵活组合。
- 依赖管理:子 Chart 机制支持组件级复用,通过条件控制和全局值实现环境感知的依赖装配。