2. Helm 基础回顾:Chart 结构、模板引擎、Values 与 Release 管理、依赖管理

在构建服务网格流量拓扑的持续交付流水线之前,必须牢固掌握 Helm 的核心基础。Helm 是 Kubernetes 的包管理工具,它将应用及其依赖打包为 Chart,通过 模板引擎 实现参数化部署,利用 Values 分离配置与代码,并通过 Release 管理每次部署的生命周期。本章将系统回顾这四大支柱,为后续与 CI/CD 流水线的深度集成奠定基础。

2.1 Chart 标准目录结构

一个标准的 Helm Chart 遵循固定的目录布局,这是 Helm 工具识别和解析 Chart 的基础。以下是一个典型 Chart 的结构:

my-chart/
├── Chart.yaml          # Chart 元数据(名称、版本、描述等)
├── values.yaml         # 默认配置值
├── values.schema.json  # (可选)Values 的 JSON Schema 校验文件
├── charts/             # (可选)子 Chart 依赖包
├── templates/          # Kubernetes 资源模板文件(Go 模板)
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── ingress.yaml
│   ├── _helpers.tpl    # (可选)模板辅助函数
│   └── tests/          # (可选)测试模板
└── README.md           # (可选)Chart 使用说明
关键目录与文件说明:
  • Chart.yaml:Chart 的“身份证”,包含 apiVersion、name、version、appVersion 等字段。
  • values.yaml:定义所有可配置参数的默认值,是模板引擎的数据源。
  • templates/:存放 Go 模板文件,Helm 会渲染这些文件并生成最终的 Kubernetes 清单。
  • charts/:存放被依赖的子 Chart(通常是 .tgz 包),实现依赖管理。
Helm Chart 目录结构与渲染流程 Helm Chart 目录结构与渲染流程 Chart 目录结构 my-chart/ ├── Chart.yaml ├── values.yaml ├── values.schema.json ├── charts/ └── sub-chart.tgz ├── templates/ ├── deployment.yaml ├── service.yaml ├── _helpers.tpl └── README.md Helm 模板引擎 Go 模板渲染 + Values 注入 + 函数处理 + 依赖解析 渲染输出 Deployment.yaml Service.yaml Ingress.yaml ConfigMap.yaml ... 最终 Kubernetes 资源清单

2.2 模板引擎与模板函数

Helm 使用 Go 语言的 text/template 作为模板引擎,并扩展了超过 60 个内置模板函数。模板文件位于 templates/ 目录下,通过 {{ .Values.xxx }} 的方式引用 values.yaml 中定义的参数。

2.2.1 核心模板语法

语法/函数 说明 示例
{{ .Values.replicaCount }} 引用 values 中的值 replicas: {{ .Values.replicaCount }}
{{ .Release.Name }} 内置对象,Release 名称 name: {{ .Release.Name }}-app
{{ .Chart.Name }} 内置对象,Chart 名称 app.kubernetes.io/name: {{ .Chart.Name }}
{{ default "default" .Values.mode }} 提供默认值 mode: {{ default "production" .Values.mode }}
{{ required "port is required" .Values.service.port }} 强制校验值存在 port: {{ required "port is required" .Values.service.port }}
{{ include "mychart.labels" . }} 引用 _helpers.tpl 中的命名模板 {{ include "mychart.labels" . | indent 4 }}
{{- toYaml .Values.resources | nindent 8 }} 将 YAML 对象缩进后嵌入 resources: {{- toYaml .Values.resources | nindent 8 }}

2.2.2 流程控制与变量

{{- /* 条件判断 */ -}}
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
{{- else }}
# autoscaling is disabled
{{- end }}

{{- /* 循环遍历 */ -}}
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
  http:
    paths:
    {{- range .paths }}
      - path: {{ . }}
        pathType: Prefix
    {{- end }}
{{- end }}

{{- /* 变量赋值 */ -}}
{{- $fullName := include "mychart.fullname" . }}
最佳实践: 使用 _helpers.tpl 文件定义可复用的命名模板(如 labels、fullname),避免在多个模板文件中重复相同的逻辑。命名模板通过 {{ define "name" }} 定义,通过 {{ include "name" . }} 引用。

2.3 Values 与 Release 管理

Values 是 Helm 的配置中心,Release 是 Chart 的一次部署实例。理解两者的关系是管理多环境部署的关键。

2.3.1 Values 的层级与覆盖

Values 可以来自多个来源,优先级从高到低依次为:

  1. --set 命令行参数(最高优先级)
  2. 用户提供的 -f values-custom.yaml 文件
  3. Chart 自带的 values.yaml(最低优先级)

在 CI/CD 流水线中,通常将环境特定的配置(如 staging、production)放在独立的 values 文件中,通过 -f 参数注入:

# values-staging.yaml
replicaCount: 2
ingress:
  hosts:
    - host: staging.myapp.com

# values-production.yaml
replicaCount: 5
ingress:
  hosts:
    - host: myapp.com
    - host: www.myapp.com

2.3.2 Release 生命周期管理

Helm 命令 功能 CI/CD 场景
helm install 创建新的 Release 首次部署到环境
helm upgrade 升级现有 Release 持续交付新版本
helm rollback 回滚到历史版本 部署失败自动回滚
helm list 列出所有 Release 查看部署状态
helm uninstall 删除 Release 清理环境
注意: helm upgrade 默认使用“滚动升级”策略。如果新版本部署失败,Helm 不会自动回滚。在 CI/CD 流水线中,建议结合 --atomic 标志(失败时自动回滚)和健康检查探针,确保部署的可靠性。
Release 生命周期与 Values 覆盖层级 Release 生命周期与 Values 覆盖层级 Values 覆盖层级 --set 参数(最高) -f values-custom.yaml values.yaml(最低) 优先级从上到下递减 Release 生命周期 installed upgraded failed rolled back uninstalled

2.4 依赖管理

Helm 支持通过 Chart.yaml 中的 dependencies 字段声明对其他 Chart 的依赖。依赖管理是构建复杂应用(如服务网格中的 Istio、监控组件 Prometheus)的关键能力。

2.4.1 声明依赖

在 Chart.yaml 中声明依赖:

# Chart.yaml
dependencies:
  - name: postgresql
    version: "12.1.0"
    repository: "https://charts.bitnami.com/bitnami"
    condition: postgresql.enabled   # 条件控制,当 postgresql.enabled 为 true 时安装
    tags:
      - database
  - name: redis
    version: "17.0.0"
    repository: "https://charts.bitnami.com/bitnami"
    condition: redis.enabled
    tags:
      - cache

2.4.2 依赖管理命令

命令 功能 说明
helm dependency update 更新 charts/ 目录中的依赖包 根据 Chart.yaml 中的声明下载或更新依赖
helm dependency build 从 Chart.lock 文件重建依赖 确保团队使用完全相同的依赖版本
helm dependency list 列出当前 Chart 的依赖状态 检查依赖是否已下载、版本是否匹配
依赖管理最佳实践:
  • 始终将 Chart.lock 文件纳入版本控制,确保可重现的构建。
  • 使用 condition 和 tags 实现依赖的条件安装,避免在不需要时安装不必要的组件。
  • 在 CI/CD 流水线中,在 helm package 或 helm install 之前执行 helm dependency update,确保依赖是最新的。

2.5 本章小结

Helm 的基础知识是构建云原生持续交付流水线的基石。通过本章的回顾,我们掌握了:

  • Chart 结构:标准目录布局,Chart.yaml、values.yaml、templates/ 和 charts/ 各司其职。
  • 模板引擎:Go 模板语法、内置对象(.Values、.Release、.Chart)、流程控制和命名模板。
  • Values 与 Release:多层级 Values 覆盖机制,Release 的安装、升级、回滚、删除生命周期。
  • 依赖管理:通过 dependencies 声明、helm dependency update/build 管理子 Chart。