3. Helm 核心概念:Chart、Release、Repository、Values、Templates、Hooks

在深入云原生网关回滚护栏与租户配额校准之前,必须牢固掌握 Helm 的六大核心概念。这些概念构成了 Helm 的操作模型,也是后续所有自动化策略的基石。本章将逐一拆解每个概念的定义、作用以及它们之间的协作关系。

3.1 六大概念全景图

Helm 的核心概念可以归纳为“打包、配置、部署、存储”四个维度。下面的 SVG 展示了它们之间的逻辑关系与数据流向。

Helm 六大核心概念关系图 Helm CLI Chart(包) Repository(仓库) Values(值) Templates(模板) Release(发布) Hooks(钩子) Chart 定义应用结构,Values 提供配置,Templates 生成 YAML,Release 管理部署实例,Hooks 控制生命周期,Repository 实现分发。

3.2 Chart:应用的定义包

Chart 是 Helm 的核心打包格式,它包含了一组描述 Kubernetes 资源的 YAML 模板和配置文件。一个 Chart 本质上就是一个遵循特定目录结构的文件夹。

关键点:Chart 是“可复用的应用定义”,它不包含具体环境的值,只定义资源的骨架和默认值。

3.2.1 Chart 目录结构

mychart/
├── Chart.yaml          # Chart 元数据(名称、版本、描述)
├── values.yaml         # 默认配置值
├── values.schema.json  # (可选)Values 的 JSON Schema 校验
├── charts/             # (可选)子 Chart 依赖
├── templates/          # 模板文件目录
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── _helpers.tpl    # 模板辅助函数
│   └── NOTES.txt       # 安装后的提示信息
└── crds/               # (可选)CRD 定义

3.3 Repository:Chart 的存储与分发中心

Repository(仓库)是用于存储和共享 Chart 包的 HTTP 服务器。Helm 客户端通过 helm repo add 命令将远程仓库添加到本地索引,然后通过 helm search 查找 Chart。

命令 作用 示例
helm repo add 添加仓库到本地索引 helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update 更新本地仓库缓存 helm repo update
helm repo list 列出已添加的仓库 helm repo list
helm search repo 在仓库中搜索 Chart helm search repo nginx

3.4 Values:配置与环境的分离

Values 是 Helm 实现“配置与代码分离”的关键机制。通过 values.yaml 文件定义默认值,在安装或升级时通过 --set 或自定义 values 文件覆盖。

最佳实践:在租户配额校准场景中,将每个租户的 namespace、resourceQuota、limitRange 等参数抽取为 Values,实现“一份 Chart,多租户复用”。

3.4.1 Values 的优先级(从低到高)

  1. Chart 内 values.yaml:默认值,最低优先级。
  2. 父 Chart values.yaml:当存在依赖时,父 Chart 的值会覆盖子 Chart。
  3. 用户提供的 values 文件:通过 -f 或 --values 指定。
  4. 命令行 --set 参数:最高优先级,直接覆盖特定字段。

3.5 Templates:Kubernetes YAML 的生成引擎

Templates 目录下的 Go 模板文件是 Helm 的核心动力。Helm 将 Values 注入模板,渲染出最终的 Kubernetes YAML 清单。

3.5.1 模板语法示例

apiVersion: v1
kind: Namespace
metadata:
  name: {{ .Values.namespace.name }}
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: {{ .Values.quota.name }}
  namespace: {{ .Values.namespace.name }}
spec:
  hard:
    requests.cpu: {{ .Values.quota.cpu }}
    requests.memory: {{ .Values.quota.memory }}
    persistentvolumeclaims: {{ .Values.quota.pvc }}
注意:模板中的 {{ }} 是 Go 模板语法,不要与 Jinja2 或其他模板引擎混淆。Helm 还提供了丰富的内置函数(如 quote、default、upper)和管道操作。

3.6 Release:Chart 的运行实例

Release 是 Helm 管理的核心实体。每次执行 helm install 都会创建一个 Release,每个 Release 都有一个唯一的名称和版本号。Helm 通过 Release 追踪每次部署的状态,支持回滚、升级和删除。

Release 状态 说明 常见场景
deployed 当前生效的版本 正常部署后
failed 安装或升级失败 模板错误、资源冲突
pending-install 安装进行中 正在创建资源
superseded 被新版本替代 升级后旧版本
uninstalled 已卸载 执行 helm uninstall 后

3.7 Hooks:生命周期的干预点

Hooks 允许在 Release 生命周期的特定节点执行自定义操作。它们以 Kubernetes Job 或 Pod 的形式运行,常用于数据库迁移、预检查、通知发送等场景。

3.7.1 常用 Hook 类型

  • pre-install:在模板渲染后、资源创建前执行。
  • post-install:在所有资源创建成功后执行。
  • pre-upgrade:在升级操作前执行。
  • post-upgrade:在升级操作成功后执行。
  • pre-delete:在删除 Release 前执行。
  • post-delete:在删除 Release 后执行。
  • pre-rollback:在回滚操作前执行。
  • post-rollback:在回滚操作成功后执行。

3.7.2 Hook 在租户校准中的应用

在回滚护栏场景中,pre-rollback 和 post-rollback 钩子尤为重要:

apiVersion: batch/v1
kind: Job
metadata:
  name: "{{ .Release.Name }}-pre-rollback"
  annotations:
    "helm.sh/hook": pre-rollback
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: quota-check
        image: bitnami/kubectl:latest
        command:
        - /bin/sh
        - -c
        - |
          echo "执行回滚前配额校验..."
          # 检查当前租户配额是否允许回滚
          kubectl get resourcequota -n {{ .Values.namespace }} -o json
核心价值:Hooks 让 Helm 从“静态部署工具”升级为“具备生命周期管理能力的编排引擎”,是实现回滚护栏和配额校准自动化的关键扩展点。

3.8 概念总结与对比

概念 类比 在租户校准中的角色
Chart 应用的“安装包” 定义租户配额模板和资源结构
Repository 应用商店 分发校准后的 Chart 版本
Values 安装时的“配置单” 注入每个租户的 CPU、内存、PVC 限额
Templates “模具” 将 Values 渲染为 ResourceQuota、LimitRange 等 YAML
Release “已安装的应用实例” 追踪每个租户的配额版本,支持回滚
Hooks “安装/升级/回滚时的触发器” 在回滚前校验配额一致性,回滚后触发校准