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 在生命周期中的插入位置。

Helm 核心概念关系图 Helm 核心概念关系与数据流 Repository Chart 索引仓库 Chart 模板 + 默认值 Values 用户参数覆盖 helm fetch / pull --values / --set Release Chart + Values 的运行时实例 helm install / upgrade Hooks:生命周期干预点 pre-install post-install pre-upgrade post-upgrade 触发

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 的优先级层级(从低到高)是变更门禁故障的高发区:

  1. Chart 内 values.yaml — 默认值,最低优先级。
  2. 父 Chart values.yaml — 子 Chart 继承时覆盖。
  3. 用户提供的 -f values.yaml — 显式覆盖文件。
  4. --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 自动继续安装流程。