3. Chart结构详解:Chart目录结构、Chart.yaml文件、values.yaml文件、模板文件(templates/)的作用

Helm Chart 是 Kubernetes 应用的打包格式,理解其内部结构是进行升级、回滚与配置管理的基础。一个标准的 Chart 遵循固定的目录约定和文件规范,Helm 通过解析这些文件来生成最终的 Kubernetes 资源清单。

3.1 Chart 标准目录结构

一个典型的 Chart 目录结构如下所示。每个文件和目录都有其特定的职责,共同构成了一个可发布、可版本化的应用包。

mychart/
├── Chart.yaml          # Chart 元数据定义(必选)
├── values.yaml         # 默认配置值(必选)
├── values.schema.json  # values.yaml 的 JSON Schema 校验文件(可选)
├── charts/             # 子 Chart 依赖目录(可选)
│   └── subchart-1.0.0.tgz
├── templates/          # 模板文件目录(必选)
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── _helpers.tpl    # 模板辅助函数(可选)
│   └── NOTES.txt       # 安装后的使用说明(可选)
├── templates/tests/    # 测试模板目录(可选)
│   └── test-connection.yaml
├── crds/               # CRD 定义目录(可选)
│   └── my-crd.yaml
└── README.md           # Chart 说明文档(可选)
核心原则: Chart.yaml、values.yaml 和 templates/ 目录是 Chart 的三大必选组件,缺少任何一个 Helm 都会拒绝安装。

3.2 Chart.yaml 文件:Chart 的身份证

Chart.yaml 是 Chart 的元数据文件,定义了 Chart 的名称、版本、描述等关键信息。Helm 通过此文件识别 Chart 的身份和依赖关系。

字段 必填 说明 示例值
apiVersion 是 Chart API 版本,v2 用于 Helm 3+ v2
name 是 Chart 名称,必须符合 DNS 标签规范 my-nginx
version 是 Chart 语义化版本号,用于发布和回滚 1.2.3
appVersion 否 所包含应用的版本号,与 Chart 版本独立 1.21.0
description 否 Chart 的简短描述 A simple Nginx web server
dependencies 否 子 Chart 依赖列表,定义依赖名称、版本和仓库 见下方代码块
type 否 Chart 类型,application 或 library application

示例:一个完整的 Chart.yaml 文件

apiVersion: v2
name: my-nginx
description: A Helm chart for deploying Nginx on Kubernetes
type: application
version: 1.2.3
appVersion: 1.21.0
dependencies:
  - name: redis
    version: ">=10.0.0"
    repository: "https://charts.bitnami.com/bitnami"
    condition: redis.enabled
maintainers:
  - name: DevOps Team
    email: devops@example.com
版本管理要点: version 字段用于 Helm 发布管理,每次修改模板或 values 后必须递增;appVersion 仅用于信息展示,Helm 不会自动校验其与容器镜像版本的一致性。

3.3 values.yaml 文件:配置的默认值

values.yaml 是 Chart 的默认配置中心,定义了模板中使用的所有可配置参数。用户可以通过 --set 或自定义 values 文件覆盖这些默认值,实现环境差异化部署。

典型 values.yaml 结构示例:

# 副本数配置
replicaCount: 3

# 镜像配置
image:
  repository: nginx
  tag: 1.21.0
  pullPolicy: IfNotPresent

# 服务配置
service:
  type: ClusterIP
  port: 80

# 资源限制
resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 250m
    memory: 256Mi

# 环境变量
env:
  - name: NGINX_HOST
    value: "example.com"

# 是否启用 ingress
ingress:
  enabled: false
  host: myapp.example.com
配置层级原则: 使用 YAML 的嵌套结构组织配置,避免扁平化命名。例如 image.repository 比 imageRepository 更易于扩展和维护。Helm 支持通过 --set image.tag=1.22.0 直接覆盖深层字段。

3.4 模板文件(templates/):资源生成引擎

templates/ 目录包含 Go 模板文件,Helm 将这些模板与 values.yaml 合并,渲染出最终的 Kubernetes 资源清单。模板文件使用 {{ .Values.xxx }} 语法引用配置值。

模板文件的核心机制:

  • 模板语法: 使用 Go 模板引擎,支持 {{ .Values.replicaCount }} 引用值、{{- if .Values.ingress.enabled }} 条件判断、{{- range .Values.env }} 循环迭代。
  • 内置对象: .Values(values.yaml 内容)、.Release(发布信息,如 Name、Namespace、Revision)、.Chart(Chart.yaml 内容)、.Files(Chart 内文件访问)。
  • 辅助模板: _helpers.tpl 文件定义可复用的模板片段,通过 {{ include "mychart.labels" . }} 调用,避免重复代码。
  • NOTES.txt: 安装成功后显示的使用说明,支持模板语法,可动态生成访问地址等信息。

示例:一个简单的 deployment.yaml 模板

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-nginx
  labels:
    app: nginx
    release: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          ports:
            - containerPort: {{ .Values.service.port }}

3.5 Chart 结构关系总览

下图展示了 Chart 各组件之间的数据流和协作关系,帮助理解 Helm 如何从 Chart 包生成可部署的 Kubernetes 资源。

Chart 结构关系与数据流图 Chart 结构关系与数据流 Chart 包 Chart.yaml 元数据、版本、依赖 values.yaml 默认配置值 templates/ Go 模板文件 charts/ 子 Chart 依赖 _helpers.tpl 辅助模板函数 Helm 模板引擎 模板解析与渲染 值合并与覆盖 依赖解析 Kubernetes 资源清单 Deployment Service ConfigMap / Secret Ingress / HPA ... 其他资源 数据流方向:Chart 包 → Helm 模板引擎(合并 values + 解析模板)→ 生成 Kubernetes 资源清单

3.6 模板文件最佳实践

  • 保持模板简洁: 复杂的业务逻辑应放在 _helpers.tpl 中,主模板文件只负责资源结构定义。
  • 使用命名约定: 资源名称使用 {{ .Release.Name }}-{{ .Chart.Name }} 格式,避免多实例部署时的命名冲突。
  • 条件渲染: 对于可选功能(如 Ingress、ServiceMonitor),使用 {{- if .Values.ingress.enabled }} 包裹,默认值设为 false。
  • 资源标签标准化: 所有资源都应包含 app.kubernetes.io/name、app.kubernetes.io/instance 等推荐标签,便于运维管理。
  • NOTES.txt 实用化: 在 NOTES.txt 中输出访问 URL、默认密码获取方式、健康检查命令等用户关心的信息。
调试技巧: 使用 helm template mychart ./mychart 可以在不安装的情况下预览渲染后的 YAML 输出;使用 helm lint ./mychart 检查 Chart 结构和语法错误。