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包),实现依赖管理。
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 可以来自多个来源,优先级从高到低依次为:
--set命令行参数(最高优先级)- 用户提供的
-f values-custom.yaml文件 - 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 标志(失败时自动回滚)和健康检查探针,确保部署的可靠性。
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。