1. Helm 基础回顾:Helm 架构、Chart 结构、模板引擎、Release 管理
在深入 Chart 测试与验证之前,必须重新夯实 Helm 的核心基础。Helm 是 Kubernetes 生态中的包管理工具,它将应用定义、配置与部署逻辑封装为 Chart,并通过 Release 机制管理每次部署的生命周期。本节从架构、Chart 结构、模板引擎与 Release 管理四个维度进行系统性回顾。
1.1 Helm 架构:客户端与 Tiller(历史)及客户端仅模式
Helm 架构经历了从 v2 到 v3 的重大演进。v3 移除了服务端组件 Tiller,采用纯客户端架构,大幅提升了安全性与简洁性。
架构对比: v2 依赖集群内 Tiller 管理 Release,v3 直接通过 Kubernetes API 操作资源,无需额外服务端组件。
1.2 Chart 结构:标准目录布局
一个标准的 Helm Chart 遵循固定的目录结构,每个文件都有明确的职责。理解此结构是编写可测试 Chart 的前提。
| 文件/目录 | 必需 | 说明 |
|---|---|---|
Chart.yaml |
是 | Chart 元数据:名称、版本、API 版本、描述、依赖等 |
values.yaml |
是 | 默认配置值,供模板引擎渲染使用 |
templates/ |
是 | Kubernetes 资源模板文件(Go 模板语法) |
charts/ |
否 | 子 Chart 依赖(手动或通过 helm dependency 管理) |
crds/ |
否 | 自定义资源定义(CRD),在模板渲染前安装 |
templates/NOTES.txt |
否 | 安装成功后输出的使用说明 |
templates/tests/ |
否 | 测试 Pod 定义,用于 helm test 验证 |
最佳实践: 始终在
templates/tests/ 目录下放置测试 Pod 模板,这是 Helm 内置验证机制的核心入口。
1.3 模板引擎:Go 模板与内置函数
Helm 使用 Go 模板引擎将 values.yaml 中的配置注入到 Kubernetes 资源模板中。模板引擎的核心能力包括:
- 值注入: 通过
{{ .Values.key }}引用 values 中的值。 - 管道与函数: 支持
quote、default、upper、indent等内置函数。 - 流程控制:
if/else、with、range实现条件渲染与循环。 - 命名模板: 使用
define和template复用模板片段。
# 示例:Deployment 模板片段 (templates/deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
labels:
app.kubernetes.io/name: {{ include "myapp.name" . }}
helm.sh/chart: {{ include "myapp.chart" . }}
spec:
replicas: {{ .Values.replicaCount | default 1 }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "myapp.name" . }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ include "myapp.name" . }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default "latest" }}"
ports:
- containerPort: {{ .Values.service.port }}
1.4 Release 管理:生命周期与操作
Release 是 Chart 的一次部署实例。每次 helm install、helm upgrade、helm rollback 都会生成或变更一个 Release。Release 名称在命名空间内唯一。
| 操作 | 命令 | Release 状态变化 |
|---|---|---|
| 安装 | helm install [name] [chart] |
创建 Release,状态为 deployed |
| 升级 | helm upgrade [name] [chart] |
新 Revision 创建,旧 Revision 状态变为 superseded |
| 回滚 | helm rollback [name] [revision] |
目标 Revision 重新变为 deployed,当前变为 superseded |
| 卸载 | helm uninstall [name] |
Release 标记为 uninstalled,默认保留历史记录 |
| 测试 | helm test [name] |
运行 templates/tests/ 中的 Pod,不改变 Release 状态 |
注意:
helm test 不会创建新的 Revision,也不会改变 Release 状态。测试 Pod 运行完成后即终止,其日志和退出码用于判断测试是否通过。
1.5 核心概念关系总结
以下表格梳理了 Helm 核心概念在测试与验证上下文中的关键作用:
| 概念 | 与测试验证的关系 |
|---|---|
| Chart | 测试的单元,包含模板、默认值、依赖和测试 Pod 定义 |
| Values | 测试输入,通过覆盖默认值验证不同配置下的渲染结果 |
| 模板引擎 | 渲染正确性验证,确保资源定义符合预期 |
| Release | 测试的上下文,通过 helm test 验证运行中的应用 |
| Revision | 回滚测试的基础,验证升级/回滚流程的可靠性 |