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 操作资源,无需额外服务端组件。
Helm v3 纯客户端架构 Helm Client CLI / SDK Chart 仓库 OCI / HTTP Kubernetes API REST / RBAC 集群资源 Deploy / Service / ConfigMap Release 存储 Secrets / ConfigMap 说明: Helm v3 直接与 Kubernetes API 交互,Release 元数据以 Secret/ConfigMap 形式存储在集群中,无需 Tiller 服务端。

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 状态
Release 生命周期与 Revision 流转 helm install Revision 1 deployed Revision 2 superseded Revision 3 deployed (rollback) helm uninstall uninstalled helm rollback 3 将 Rev3 置为 deployed
注意: helm test 不会创建新的 Revision,也不会改变 Release 状态。测试 Pod 运行完成后即终止,其日志和退出码用于判断测试是否通过。

1.5 核心概念关系总结

以下表格梳理了 Helm 核心概念在测试与验证上下文中的关键作用:

概念 与测试验证的关系
Chart 测试的单元,包含模板、默认值、依赖和测试 Pod 定义
Values 测试输入,通过覆盖默认值验证不同配置下的渲染结果
模板引擎 渲染正确性验证,确保资源定义符合预期
Release 测试的上下文,通过 helm test 验证运行中的应用
Revision 回滚测试的基础,验证升级/回滚流程的可靠性