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 覆盖,理解优先级顺序对多环境部署至关重要:

  1. Chart 内置:values.yaml(最低优先级)
  2. 父 Chart 覆盖:父 Chart 的 values.yaml 中的子 Chart 值
  3. 用户自定义文件:-f my-values.yaml
  4. 命令行参数:--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 管理的完整生命周期:

Helm 核心工作流 Helm 核心工作流:Chart → 渲染 → Release Chart 源 Chart.yaml templates/ + values.yaml 模板引擎 Go 模板 + Values 生成 Kubernetes 清单 Release 安装 / 升级 / 回滚 Kubernetes 集群 helm package helm install/upgrade Values 注入优先级 --set 参数 > 自定义 values 文件 (-f) > values.yaml > 子 Chart 默认值 依赖管理 Chart.yaml → dependencies → charts/ 升级策略 --atomic / --wait / --cleanup-on-fail helm list / helm history / helm rollback 管理 Release 生命周期

2.6 多集群场景下的 Helm 策略要点

在后续构建多集群拓扑面板时,Helm 的以下特性将发挥关键作用:

  • Chart 复用:同一 Chart 通过不同 Values 文件部署到多个集群,实现配置差异化
  • 依赖管理:将 SLO 采集器、Prometheus 等作为子 Chart 统一管理
  • 原子升级:使用 --atomic 确保跨集群部署的一致性,失败自动回滚
  • Release 标签:通过 --labels 为 Release 添加集群标识,便于面板查询
实践提示: 在多集群环境中,建议为每个集群维护独立的 values-{cluster}.yaml 文件,并通过 CI/CD 流水线注入集群上下文(如 kubeconfig 上下文名称、集群 API 地址),避免手动管理多个 Helm 命令。