4. Helm 包管理基础:Chart 结构、模板引擎、Values 文件、Release 与 Revision 概念

在深入服务网格流量拓扑的校验之前,必须牢固掌握 Helm 的核心抽象。Helm 将 Kubernetes 资源打包为 Chart,通过 模板引擎 将 Values 注入到资源定义中,最终在集群中产生一个可追溯的 Release,每次升级都会生成新的 Revision。这四个概念构成了 Helm 包管理的基石。

4.1 Chart 目录结构

一个标准的 Helm Chart 是一个遵循特定布局的目录集合。以下是一个典型 Chart 的骨架结构:

mychart/
├── Chart.yaml          # Chart 元数据(名称、版本、API 版本等)
├── values.yaml         # 默认配置值
├── values.schema.json  # (可选)Values 的 JSON Schema 校验文件
├── charts/             # 子 Chart 依赖(.tgz 包或目录)
├── templates/          # Go 模板文件,最终渲染为 Kubernetes 清单
│   ├── NOTES.txt       # (可选)安装后的使用说明
│   ├── _helpers.tpl    # (可选)模板辅助函数
│   ├── deployment.yaml
│   ├── service.yaml
│   └── hpa.yaml
└── README.md           # (可选)Chart 使用文档
关键点: templates/ 目录下的文件会被 Helm 模板引擎逐一遍历并渲染。非 .yaml、.yml、.tpl 或 .txt 后缀的文件会被忽略,但可以放在 templates/ 中作为辅助数据。

4.2 模板引擎:从静态到动态

Helm 使用 Go 语言的 text/template 包作为模板引擎,并扩展了 60 多个模板函数(来自 Sprig 库)。模板引擎的核心作用是将 Values 注入到 Kubernetes 资源定义中,实现“一次 Chart,多环境部署”。

以下是一个典型的 Deployment 模板片段,展示了模板语法如何将 Values 转化为具体配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "mychart.name" . }}
    helm.sh/chart: {{ include "mychart.chart" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "mychart.name" . }}
  template:
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          ports:
            - containerPort: {{ .Values.service.port }}
模板对象说明:
  • .Values:指向 values.yaml 及用户传入的自定义值。
  • .Chart:指向 Chart.yaml 中的元数据。
  • .Release:包含 Release 名称、命名空间、是否为安装/升级等信息。
  • .Files:允许访问 Chart 包内的非模板文件。
  • .Capabilities:提供 Kubernetes 集群版本和 API 版本信息。

4.3 Values 文件:配置的层次与覆盖

Values 是 Helm 实现配置分离的核心机制。Helm 在渲染模板时,会按照以下优先级(从低到高)合并 Values:

优先级 来源 说明
1(最低) values.yaml Chart 内嵌的默认值
2 子 Chart 的 values.yaml 依赖包自带的默认值
3 -f / --values 文件 用户指定的 YAML 文件,可多次使用
4(最高) --set 命令行参数 直接通过命令行覆盖的键值对

以下是一个 values.yaml 的典型结构,展示了如何为服务网格场景定义配置:

# values.yaml
replicaCount: 3

image:
  repository: myregistry/istio-proxy
  tag: "1.20.0"
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 8080

mesh:
  enabled: true
  mtls:
    mode: STRICT
  trafficManagement:
    circuitBreaker:
      maxConnections: 100
      maxPendingRequests: 10

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 250m
    memory: 256Mi
注意: 在服务网格场景中,Values 文件通常需要包含 mesh、sidecar、telemetry 等与流量拓扑相关的配置段。这些配置的完整性直接影响后续的校验结果。

4.4 Release 与 Revision:部署的版本化

Release 是 Helm 在 Kubernetes 集群中管理 Chart 部署实例的核心抽象。每次执行 helm install 都会创建一个新的 Release。而 Revision 则是 Release 的版本历史记录,每次 helm upgrade 都会递增 Revision 编号。

以下表格清晰展示了 Release 与 Revision 的关系:

概念 生命周期 标识方式 典型操作
Release 从 install 到 uninstall Release 名称(如 my-istio) helm install、helm list、helm uninstall
Revision 每次 upgrade 或 rollback Revision 编号(如 1、2、3) helm upgrade、helm rollback、helm history

通过 helm history RELEASE_NAME 可以查看一个 Release 的所有 Revision 记录,包括每次升级的 Chart 版本、App 版本、时间戳和状态。这对于审计服务网格流量拓扑的变更历史至关重要。

Helm 包管理核心概念关系图 Chart 打包的 Kubernetes 资源 模板引擎 Go template + Sprig Values 配置注入层 读取 注入 渲染后的 Kubernetes 清单 Deployment / Service / VirtualService 等 渲染 Release 集群中的部署实例 Revision 版本历史(1, 2, 3...) apply 每次 upgrade 递增 核心流程:Chart + Values → 模板引擎 → 渲染清单 → 创建/升级 Release → 生成 Revision

4.5 实践:使用 Helm 命令管理 Release

以下命令序列展示了从安装到升级的完整生命周期,以及如何查看 Revision 历史:

# 安装一个 Chart,创建 Release 并生成 Revision 1
helm install my-istio ./istio-mesh --namespace mesh-system --create-namespace

# 查看所有 Release
helm list -n mesh-system

# 升级 Release,生成 Revision 2
helm upgrade my-istio ./istio-mesh -f prod-values.yaml -n mesh-system

# 查看 Revision 历史
helm history my-istio -n mesh-system

# 回滚到 Revision 1
helm rollback my-istio 1 -n mesh-system
服务网格场景提示: 在升级 Istio 或服务网格组件时,每次 helm upgrade 都会产生一个新的 Revision。通过 helm get manifest RELEASE_NAME --revision N 可以导出指定 Revision 的完整清单,这对于对比流量拓扑的变更、校验包完整性至关重要。