3. Helm 核心概念:Chart、Release、Repository、Values、Templates、Hooks
在深入云原生网关回滚护栏与租户配额校准之前,必须牢固掌握 Helm 的六大核心概念。这些概念构成了 Helm 的操作模型,也是后续所有自动化策略的基石。本章将逐一拆解每个概念的定义、作用以及它们之间的协作关系。
3.1 六大概念全景图
Helm 的核心概念可以归纳为“打包、配置、部署、存储”四个维度。下面的 SVG 展示了它们之间的逻辑关系与数据流向。
3.2 Chart:应用的定义包
Chart 是 Helm 的核心打包格式,它包含了一组描述 Kubernetes 资源的 YAML 模板和配置文件。一个 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 的优先级(从低到高)
- Chart 内 values.yaml:默认值,最低优先级。
- 父 Chart values.yaml:当存在依赖时,父 Chart 的值会覆盖子 Chart。
- 用户提供的 values 文件:通过
-f或--values指定。 - 命令行 --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
3.8 概念总结与对比
| 概念 | 类比 | 在租户校准中的角色 |
|---|---|---|
| Chart | 应用的“安装包” | 定义租户配额模板和资源结构 |
| Repository | 应用商店 | 分发校准后的 Chart 版本 |
| Values | 安装时的“配置单” | 注入每个租户的 CPU、内存、PVC 限额 |
| Templates | “模具” | 将 Values 渲染为 ResourceQuota、LimitRange 等 YAML |
| Release | “已安装的应用实例” | 追踪每个租户的配额版本,支持回滚 |
| Hooks | “安装/升级/回滚时的触发器” | 在回滚前校验配额一致性,回滚后触发校准 |