2. Helm 基础回顾:Chart 结构、模板引擎、Values 与依赖管理、Helm 安装与升级策略
在深入多集群拓扑与租户边界 SLO 面板化之前,必须牢固掌握 Helm 的核心机制。Helm 是 Kubernetes 的包管理工具,它将应用定义为 Chart,通过模板引擎动态生成 Kubernetes 资源清单。本章将系统回顾 Chart 结构、模板引擎、Values 与依赖管理,以及安装与升级策略,为后续章节的复杂编排打下基础。
2.1 Chart 目录结构
一个标准的 Helm Chart 遵循固定目录约定。以下是一个典型 Chart 的完整结构:
my-chart/
├── Chart.yaml # Chart 元数据(名称、版本、描述)
├── values.yaml # 默认配置值
├── values.schema.json # (可选)Values 的 JSON Schema 校验
├── charts/ # (可选)子 Chart 依赖包
├── templates/ # 模板文件目录
│ ├── NOTES.txt # (可选)安装后的使用说明
│ ├── _helpers.tpl # (可选)模板辅助函数
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ └── hpa.yaml
└── .helmignore # (可选)打包时忽略的文件模式
关键点:
templates/ 目录下的所有 YAML 文件都会经过模板引擎渲染。文件名本身不影响渲染结果,但建议按资源类型命名以保持可维护性。
2.2 模板引擎与模板函数
Helm 使用 Go 模板引擎(text/template)扩展了 Kubernetes 清单的生成能力。模板通过双花括号 {{ }} 引用 Values 或执行函数。
2.2.1 核心模板语法
| 语法 | 说明 | 示例 |
|---|---|---|
{{ .Values.replicaCount }} |
引用顶层 Values 中的值 | replicas: {{ .Values.replicaCount }} |
{{ .Release.Name }} |
内置 Release 对象,包含名称、命名空间等 | name: {{ .Release.Name }}-app |
{{- if .Values.enabled -}} |
条件判断,- 用于去除空白 |
根据布尔值决定是否包含某资源 |
{{- range .Values.items -}} |
遍历列表或字典 | 动态生成多个 ConfigMap 条目 |
{{ .Values.nested.key | default "fallback" }} |
管道函数,default 提供默认值 |
防止空值导致渲染失败 |
2.2.2 内置对象与函数
模板中可用的内置对象包括:
- .Values:用户提供的配置值,优先级从高到低为:
--set> 自定义 values 文件 >values.yaml - .Release:包含
Name、Namespace、IsUpgrade、IsInstall等属性 - .Chart:Chart.yaml 中的元数据,如
Version、AppVersion - .Files:访问 Chart 包内的非模板文件(如配置文件)
- .Capabilities:Kubernetes 集群版本与 API 版本信息
最佳实践: 在
_helpers.tpl 中定义命名模板(define),通过 {{ include "my-chart.labels" . }} 复用标签、选择器等公共片段,避免模板重复。
2.3 Values 与依赖管理
2.3.1 Values 优先级与合并
Helm 支持多层 Values 覆盖,理解优先级顺序对多环境部署至关重要:
- Chart 内置:
values.yaml(最低优先级) - 父 Chart 覆盖:父 Chart 的
values.yaml中的子 Chart 值 - 用户自定义文件:
-f my-values.yaml - 命令行参数:
--set key=value(最高优先级)
2.3.2 依赖管理(子 Chart)
当 Chart 依赖其他 Chart 时,通过 Chart.yaml 的 dependencies 字段声明:
# Chart.yaml
dependencies:
- name: prometheus
version: "15.0.0"
repository: "https://prometheus-community.github.io/helm-charts"
condition: prometheus.enabled # 条件控制是否安装
alias: metrics-server # 别名,避免命名冲突
依赖管理常用命令:
| 命令 | 作用 |
|---|---|
helm dependency update |
根据 Chart.yaml 下载依赖到 charts/ 目录 |
helm dependency build |
从 Chart.lock 锁定版本重建依赖 |
helm dependency list |
查看当前依赖状态 |
注意: 子 Chart 的 Values 必须在父 Chart 的
values.yaml 中以 子Chart名称: 为顶层键进行嵌套覆盖。例如 prometheus: 下的 server: 配置。
2.4 Helm 安装与升级策略
2.4.1 安装与升级命令
# 安装新 Release
helm install my-release ./my-chart -f prod-values.yaml --namespace monitoring --create-namespace
# 升级现有 Release
helm upgrade my-release ./my-chart -f prod-values.yaml --set image.tag=v2.0
# 安装/升级合并(幂等)
helm upgrade --install my-release ./my-chart -f prod-values.yaml
2.4.2 升级策略与回滚
Helm 默认执行 滚动升级,但可通过 --history-max 控制保留的修订版本数量。关键参数:
| 参数 | 说明 | 使用场景 |
|---|---|---|
--atomic |
升级失败时自动回滚到上一个版本 | 生产环境关键部署 |
--cleanup-on-fail |
失败时删除新创建的资源 | 避免残留资源 |
--wait |
等待所有 Pod 就绪后再标记成功 | 确保服务可用性 |
--timeout |
设置等待超时时间(默认 5m) | 大型 Chart 需延长超时 |
回滚操作:
# 查看历史版本
helm history my-release -n monitoring
# 回滚到指定版本
helm rollback my-release 2 -n monitoring
2.5 Helm 核心工作流 SVG 图
下图展示了 Helm 从 Chart 打包到 Release 管理的完整生命周期:
2.6 多集群场景下的 Helm 策略要点
在后续构建多集群拓扑面板时,Helm 的以下特性将发挥关键作用:
- Chart 复用:同一 Chart 通过不同 Values 文件部署到多个集群,实现配置差异化
- 依赖管理:将 SLO 采集器、Prometheus 等作为子 Chart 统一管理
- 原子升级:使用
--atomic确保跨集群部署的一致性,失败自动回滚 - Release 标签:通过
--labels为 Release 添加集群标识,便于面板查询
实践提示: 在多集群环境中,建议为每个集群维护独立的
values-{cluster}.yaml 文件,并通过 CI/CD 流水线注入集群上下文(如 kubeconfig 上下文名称、集群 API 地址),避免手动管理多个 Helm 命令。