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 的核心组件及其在多环境配置中的交互关系:

Helm Chart 核心组件与多环境配置关系 Chart.yaml values.yaml (默认) templates/ charts/ (子 Chart) values-dev.yaml values-staging.yaml values-prod.yaml Go 模板引擎 (模板函数 + 条件 + 循环) Kubernetes 资源清单 多环境配置核心流程 1. 默认 values.yaml 提供全局基线配置 2. 环境特定 Values 文件(dev/staging/prod)覆盖差异化配置 3. Go 模板引擎根据合并后的 Values 和模板函数渲染资源清单 4. 子 Chart 通过依赖管理和全局值实现组件级复用

3.6 本章小结

本章回顾了 Helm Chart 的四大核心基础:

  • Chart 结构:标准目录布局确保 Chart 的可移植性和可维护性。
  • 模板函数:Go 模板引擎提供了动态渲染能力,是多环境配置差异化的技术基础。
  • Values 文件:层级覆盖策略允许从全局默认值到环境特定值的灵活组合。
  • 依赖管理:子 Chart 机制支持组件级复用,通过条件控制和全局值实现环境感知的依赖装配。