2. Helm 基础回顾:Helm 架构、Chart 结构、模板引擎、Release 管理、Helm v3 特性
在深入 故障域 post-renderer 指标告警分层 之前,必须重新夯实 Helm 的核心基础。本章将系统梳理 Helm 的架构演进、Chart 包结构、模板引擎原理、Release 生命周期以及 Helm v3 的关键变更,为后续定制化渲染与告警策略提供理论支撑。
2.1 Helm 架构:从 C/S 到纯客户端
Helm v3 移除了 Tiller 服务端组件,采用纯客户端架构,直接通过 Kubernetes API Server 操作资源。这一变更极大地简化了安全模型与故障排查路径。
架构对比: Helm v2 依赖集群内 Tiller 进行 Release 管理,存在权限过大、多租户隔离困难等问题;Helm v3 将 Release 数据存储在集群 Secret 中,客户端直接与 API Server 交互,符合最小权限原则。
2.2 Chart 结构:标准包规范
一个 Helm Chart 是预配置的 Kubernetes 资源模板集合,遵循固定的目录结构。理解 Chart 结构是编写可维护模板的前提。
| 文件/目录 | 必需 | 说明 |
|---|---|---|
Chart.yaml |
是 | Chart 元数据:名称、版本、API 版本、描述、依赖等 |
values.yaml |
是 | 默认配置值,供模板引擎渲染时注入 |
templates/ |
是 | Go 模板文件,最终渲染为 K8s 清单 |
charts/ |
否 | 子 Chart 依赖(手动或通过 helm dependency 管理) |
crds/ |
否 | 自定义资源定义(CRD),在模板渲染前安装 |
templates/NOTES.txt |
否 | 安装成功后向用户显示的帮助信息 |
templates/tests/ |
否 | 测试 Pod 模板,用于验证 Release 是否正常工作 |
最佳实践: 始终在
values.yaml 中提供完整的默认值,并在 Chart.yaml 中声明 apiVersion: v2(Helm v3 标准)。对于复杂 Chart,使用 values.schema.json 进行值校验。
2.3 模板引擎:Go Template 与 Sprig 函数
Helm 使用 Go 标准库 text/template 作为模板引擎,并集成了 Sprig 函数库(超过 70 个额外函数)。模板引擎负责将 values.yaml 中的值注入到 templates/ 目录下的 YAML 文件中,生成最终的 Kubernetes 资源清单。
核心模板语法示例:
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}
labels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount | default 1 }}
selector:
matchLabels:
app.kubernetes.io/name: {{ .Chart.Name }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ .Chart.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
ports:
- containerPort: {{ .Values.service.port }}
内置对象:
.Release(Release 名称、命名空间、版本等)、.Chart(Chart.yaml 元数据)、.Values(用户传入的值)、.Files(Chart 内文件访问)、.Capabilities(K8s 集群能力信息)。
2.4 Release 管理:生命周期与状态
Release 是 Helm 管理的核心抽象,代表 Chart 的一次部署实例。每个 Release 都有唯一名称和版本号,Helm 通过 Secret 记录其完整状态。
| 命令 | 作用 | Release 状态变更 |
|---|---|---|
helm install |
首次部署 Chart,创建 Release | pending-install → deployed |
helm upgrade |
升级 Release 到新版本 Chart/Values | deployed → pending-upgrade → deployed |
helm rollback |
回滚到历史 Release 版本 | deployed → pending-rollback → deployed |
helm uninstall |
删除 Release 及其所有资源 | deployed → uninstalling → uninstalled |
helm list |
列出当前 Namespace 下的所有 Release | — |
helm history |
查看 Release 的版本历史 | — |
注意: Helm v3 默认保留 Release 历史记录(可通过
--history-max 限制)。大量历史版本会占用 Secret 存储,建议在 CI/CD 中定期清理或设置合理上限。
2.5 Helm v3 关键特性
Helm v3 相比 v2 引入了多项重要变更,直接影响故障排查与告警策略设计:
- 移除 Tiller: 安全模型简化,Release 数据存储在 Secret 中,支持 RBAC 原生控制。
- Release 名称作用域: 名称空间级别隔离,不同 Namespace 可存在同名 Release。
- Chart 库(OCI 支持): 支持将 Chart 存储为 OCI 镜像,便于集成到容器镜像仓库。
- JSON Schema 校验: 通过
values.schema.json对用户输入值进行预校验,减少运行时错误。 - Post-renderer 支持: 允许在 Helm 渲染模板后、提交到 K8s 之前,通过外部命令对 YAML 清单进行二次处理——这正是本课程告警分层方案的核心技术基础。
- Library Chart: 支持创建仅包含模板辅助函数的 Chart,供其他 Chart 引用,提升复用性。