3. Helm 核心概念回顾:Chart、Release、Repository、Values、Hooks
在深入跨集群调度与变更门禁之前,必须牢固掌握 Helm 的五个核心概念。它们是 Helm 包管理、部署与生命周期管理的基石。本节以表格、列表与结构图的形式,快速建立概念映射。
3.1 五大概念速览
| 概念 | 本质 | 类比(Linux / 编程) | 关键文件 / 标识 |
|---|---|---|---|
| Chart | Kubernetes 资源的打包模板 | RPM / Debian 包 | Chart.yaml, templates/ |
| Release | Chart 的一次运行实例 | 进程实例 | Release Name + Namespace |
| Repository | Chart 的存储与分发索引 | APT / YUM 源 | index.yaml |
| Values | Chart 模板的输入参数 | 配置文件 / 环境变量 | values.yaml, --set |
| Hooks | Release 生命周期的干预点 | K8s Admission Webhook | annotation helm.sh/hook |
SRE 视角: 变更门禁故障排查中,80% 的问题源于对 Release 与 Values 作用域的误判。例如,跨集群调度时,同一 Chart 在不同集群的 Values 覆盖层级不一致,会导致配置漂移。
3.2 概念关系与数据流
下图展示了从 Chart 获取到 Release 创建的核心链路,以及 Hooks 在生命周期中的插入位置。
3.3 各概念深度要点
3.3.1 Chart — 应用定义包
- 结构标准:
Chart.yaml(元数据)、values.yaml(默认值)、templates/(Go 模板)、charts/(子 Chart 依赖)。 - 版本约束:
appVersion与version分离,前者标识应用版本,后者标识 Chart 打包版本。 - 依赖管理: 通过
dependencies字段声明子 Chart,helm dependency update解析。
3.3.2 Release — 部署实例
- 唯一标识:
Release Name+Namespace构成全局唯一键。 - 版本历史: 每次
helm upgrade生成新 Revision,支持helm rollback。 - 故障排查要点:
helm list -a查看所有 Release(包括失败状态);helm status <release>获取详细信息。
3.3.3 Repository — 分发中心
- 索引文件:
index.yaml包含所有 Chart 版本的 URL、校验和与依赖信息。 - 协议支持: HTTP/HTTPS(OCI 标准逐渐成为主流,支持
helm pull oci://)。 - 安全实践: 使用
helm repo add --username --password或 OCI 凭证管理。
3.3.4 Values — 参数注入
Values 的优先级层级(从低到高)是变更门禁故障的高发区:
- Chart 内
values.yaml— 默认值,最低优先级。 - 父 Chart
values.yaml— 子 Chart 继承时覆盖。 - 用户提供的
-f values.yaml— 显式覆盖文件。 --set参数 — 命令行直接注入,最高优先级。
常见陷阱: 跨集群调度时,若使用
--set global.clusterName=prod,但子 Chart 模板中未引用 .Values.global,则参数不会传递。务必使用 helm get values <release> 验证实际生效值。
3.3.5 Hooks — 生命周期钩子
Hooks 通过 Kubernetes Job 或 Pod 在 Release 安装、升级、删除等阶段执行自定义逻辑。以下是常用 Hook 类型及其触发时机:
| Hook 类型 | 触发时机 | 典型用途 | 失败影响 |
|---|---|---|---|
pre-install |
模板渲染后,资源创建前 | 数据库初始化、配置检查 | 安装中止 |
post-install |
所有资源创建成功后 | 通知、缓存预热 | 安装标记为失败 |
pre-upgrade |
升级模板渲染后,资源更新前 | 备份、迁移检查 | 升级中止 |
post-upgrade |
升级资源更新成功后 | 健康检查、清理旧资源 | 升级标记为失败 |
pre-delete |
删除操作执行前 | 数据导出、资源解绑 | 删除中止 |
post-delete |
删除操作完成后 | 清理外部依赖 | 删除标记为失败 |
门禁集成提示: 变更门禁系统可以在
pre-install 或 pre-upgrade Hook 中注入策略检查 Job。若检查失败,Helm 会自动中止部署,无需额外编排。
3.4 典型故障场景:Hook 超时导致 Release 卡住
以下是一个真实案例,展示 Hooks 与 Release 状态的关系:
# 查看 Release 状态
$ helm status my-app
STATUS: pending-install
...
HOOKS:
---
# Source: my-app/templates/pre-install-check.yaml
kind: Job
metadata:
annotations:
helm.sh/hook: pre-install
helm.sh/hook-delete-policy: hook-succeeded
name: my-app-pre-install-check
...
# 排查:Hook Job 未完成
$ kubectl get job my-app-pre-install-check
NAME COMPLETIONS DURATION AGE
my-app-pre-install-check 0/1 5m 5m
# 查看 Pod 日志
$ kubectl logs job/my-app-pre-install-check
Error: database connection refused
根因: pre-install Hook 中的数据库连接检查超时,导致 Release 一直处于 pending-install 状态。修复数据库连接后,Helm 自动继续安装流程。