3. Chart 目录结构详解:Chart.yaml、values.yaml、templates/、charts/、crds/、README 等文件的作用与规范

一个标准 Helm Chart 的目录结构是 Helm 打包、发布和版本管理的基石。理解每个文件和目录的职责,是进行 Chart 治理的第一步。本章将逐层拆解标准 Chart 目录,并给出生产级规范。

标准 Chart 目录结构(快速参考)
mychart/
├── Chart.yaml          # Chart 元数据(必选)
├── values.yaml         # 默认配置值(必选)
├── values.schema.json  # values 的 JSON Schema 校验(可选)
├── templates/          # Kubernetes 资源模板(必选)
│   ├── _helpers.tpl    # 模板辅助函数(可选)
│   ├── NOTES.txt       # 安装后提示信息(可选)
│   └── *.yaml          # 各类资源模板
├── charts/             # 子 Chart 依赖(可选)
├── crds/               # 自定义资源定义 CRD(可选)
├── README.md           # 使用说明(推荐必选)
└── .helmignore         # 打包忽略规则(可选)

3.1 Chart.yaml:Chart 的身份证

Chart.yaml 是每个 Chart 必须存在的核心文件,定义了 Chart 的名称、版本、描述等元数据。Helm 通过该文件识别 Chart 身份并执行版本管理。

字段 必填 说明 规范建议
apiVersion 是 Chart API 版本,v2 为当前标准 固定为 v2
name 是 Chart 名称,需符合 DNS-1123 子域名规范 全小写、连字符分隔
version 是 Chart 语义化版本,遵循 SemVer 2.0 格式 MAJOR.MINOR.PATCH
appVersion 否 所部署应用的版本,可与 Chart 版本不同 推荐填写,便于关联应用版本
description 否 简短描述 Chart 功能 一句话概括,不超过 120 字符
type 否 Chart 类型:application 或 library 应用 Chart 使用 application
dependencies 否 子 Chart 依赖列表 明确版本范围,避免 latest
keywords 否 搜索关键词列表 3~5 个关键词,便于仓库检索
home 否 项目主页 URL 指向 Git 仓库或文档站点
sources 否 源代码仓库列表 至少包含一个可访问的 Git 地址
maintainers 否 维护者信息列表 包含 name、email、url
icon 否 Chart 图标 URL SVG 或 PNG,建议 80x80 以上
annotations 否 自定义元数据键值对 用于扩展信息,如分类、团队
生产规范:version 字段必须严格遵循 SemVer 规范。每次发布新版本时,version 必须递增。建议在 CI/CD 流水线中自动校验 version 是否已更新,防止重复发布。
# 标准 Chart.yaml 示例
apiVersion: v2
name: my-nginx
description: A Helm chart for deploying Nginx on Kubernetes
type: application
version: 1.2.3
appVersion: 1.25.0
home: https://github.com/myteam/my-nginx
sources:
  - https://github.com/myteam/my-nginx
maintainers:
  - name: DevOps Team
    email: devops@example.com
    url: https://devops.example.com
keywords:
  - nginx
  - web
  - reverse-proxy
annotations:
  category: Infrastructure
  team: platform

3.2 values.yaml:配置的默认值

values.yaml 是 Chart 的默认配置入口,定义了所有可配置参数的默认值。用户可以通过 --values 或 --set 覆盖这些值。

常见陷阱:values.yaml 中不要包含敏感信息(密码、密钥、)。敏感信息应通过外部 Secret 管理工具注入,或使用 Helm 的 --set 参数在 CI/CD 中动态传入。

values.yaml 编写规范:

  • 扁平化优先:避免过深嵌套,建议不超过 3 层
  • 命名一致:使用驼峰命名(camelCase)或全小写连字符
  • 注释完整:每个参数上方添加注释说明用途和默认值含义
  • 类型明确:字符串、数字、布尔值、列表、字典类型清晰区分
  • 提供示例:复杂结构给出完整示例值
# values.yaml 规范示例
# -- 副本数量
replicaCount: 3

# -- 容器镜像配置
image:
  repository: nginx
  tag: 1.25.0
  pullPolicy: IfNotPresent

# -- 服务配置
service:
  type: ClusterIP
  port: 80
  targetPort: 8080

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

# -- 环境变量列表
env:
  - name: LOG_LEVEL
    value: info
  - name: NODE_ENV
    value: production

# -- 持久化存储配置
persistence:
  enabled: false
  storageClass: ""
  accessMode: ReadWriteOnce
  size: 10Gi

3.3 templates/:Kubernetes 资源模板

templates/ 目录是 Chart 的核心,包含所有 Kubernetes 资源的 Go 模板文件。Helm 在渲染时会将这些模板与 values.yaml 结合,生成最终的 YAML 清单。

模板文件命名规范:
  • 文件名应反映资源类型:deployment.yaml、service.yaml、ingress.yaml
  • 使用 _ 前缀表示辅助文件(不会被渲染为独立资源):_helpers.tpl
  • NOTES.txt 是特殊文件,安装成功后显示提示信息

templates/ 目录治理要点:

  • 单一职责:每个模板文件只定义一个 Kubernetes 资源
  • 复用辅助函数:将重复逻辑提取到 _helpers.tpl 中
  • 避免硬编码:所有可变值通过 .Values 引用
  • 使用命名模板:通过 define 和 template 实现模块化
  • 添加资源标签:统一使用 helm.sh/chart、app.kubernetes.io/name 等标准标签
{{- /* templates/deployment.yaml 示例 */ -}}
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-nginx.fullname" . }}
  labels:
    {{- include "my-nginx.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "my-nginx.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "my-nginx.selectorLabels" . | nindent 8 }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: {{ .Values.service.targetPort }}
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

3.4 charts/:子 Chart 依赖管理

charts/ 目录存放 Chart 的依赖子 Chart。有两种方式管理依赖:

  • 手动放置:将子 Chart 打包后的 .tgz 文件放入该目录
  • 自动管理:在 Chart.yaml 的 dependencies 中声明,通过 helm dependency update 自动下载
管理方式 优点 缺点 适用场景
手动放置 .tgz 版本锁定,构建可重复 更新依赖需手动替换文件 离线环境、严格版本管控
dependencies 声明 自动解析依赖树,版本范围灵活 需要网络访问仓库 CI/CD 流水线、在线开发
治理建议:在 CI/CD 流水线中使用 helm dependency build 命令,它会基于 Chart.lock 文件锁定依赖版本,确保每次构建的一致性。将 Chart.lock 文件纳入版本控制。

3.5 crds/:自定义资源定义

crds/ 目录用于存放 Chart 所需的 CustomResourceDefinition(CRD)资源。Helm 在处理 CRD 时有特殊行为:

  • 安装时先安装 CRD:在渲染 templates/ 之前,Helm 会先安装 crds/ 目录中的 CRD
  • 不参与模板渲染:crds/ 中的文件不会被 Go 模板引擎处理,必须是纯 YAML
  • 不参与升级和回滚:CRD 安装后,helm upgrade 和 helm rollback 不会修改或删除 CRD
  • 不参与删除:helm uninstall 不会删除已安装的 CRD
重要限制:crds/ 目录中的 CRD 文件大小总和不能超过 1MB。如果 CRD 较大,建议将其放在独立的 Chart 中管理,或使用 Operator Lifecycle Manager(OLM)等工具。

3.6 README.md:Chart 的使用说明书

虽然 README.md 不是 Helm 的强制要求,但在生产级 Chart 治理中,它是推荐必选的文件。良好的 README 能显著降低使用者的学习成本。

README.md 标准结构:

章节 内容要求
标题与简介 Chart 名称、一句话功能描述、适用场景
前置条件 Kubernetes 版本要求、Helm 版本、依赖组件
安装指南 helm install 命令示例、常用参数说明
配置说明 values.yaml 核心参数表格,包含参数名、类型、默认值、说明
卸载指南 helm uninstall 命令、清理注意事项
常见问题 FAQ,解决高频问题
版本历史 Changelog 或指向 CHANGELOG.md 的链接

3.7 其他辅助文件

values.schema.json: 用于对 values.yaml 进行 JSON Schema 校验。Helm 在安装或升级时会自动校验用户提供的 values 是否符合 schema 定义,提前发现配置错误。

{
  "$schema": "https://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": ["replicaCount", "image"],
  "properties": {
    "replicaCount": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "image": {
      "type": "object",
      "required": ["repository", "tag"],
      "properties": {
        "repository": { "type": "string" },
        "tag": { "type": "string", "pattern": "^[a-zA-Z0-9._-]+$" }
      }
    }
  }
}

.helmignore: 类似于 .gitignore,在 helm package 打包时忽略指定文件或目录,避免将敏感文件或本地配置打包进 Chart。

# .helmignore 示例
.git/
.gitignore
*.md
test/
ci/
*.log
.secrets/

3.8 目录结构全景图

下图展示了标准 Helm Chart 目录结构及其各组件之间的数据流关系:

Helm Chart 目录结构全景图 mychart/ (Chart 根目录) Chart.yaml values.yaml templates/ charts/ crds/ deployment.yaml service.yaml _helpers.tpl NOTES.txt 核心数据流: 1. Helm 读取 Chart.yaml 获取元数据和依赖信息 2. 用户提供的 values 与 values.yaml 默认值合并 3. Go 模板引擎将合并后的 values 注入 templates/ 中的模板,生成最终 Kubernetes 资源清单 治理要点: • 所有必选文件(Chart.yaml、values.yaml、templates/)必须存在且格式正确 • 可选文件(charts/、crds/、README.md)按需添加,但推荐生产环境全部完善

3.9 目录结构治理清单

在 Chart 发布前,建议使用以下清单逐项检查目录结构完整性:

检查项 要求 检查方式
Chart.yaml 完整性 必填字段齐全,version 符合 SemVer helm lint
values.yaml 注释 每个参数上方有注释说明 人工审查
templates/ 命名规范 文件名反映资源类型,无重复定义 helm template 测试
依赖版本锁定 Chart.lock 文件存在且与 Chart.yaml 一致 helm dependency list
CRD 文件大小 单个 CRD 文件不超过 1MB ls -lh crds/
README.md 存在 包含安装、配置、卸载指南 文件存在性检查
敏感信息排查 values.yaml 和模板中无明文密码 grep 扫描 + 人工审查
Schema 校验 values.schema.json 与 values.yaml 字段一致 helm lint --strict
自动化建议:将上述检查清单集成到 CI/CD 流水线的 lint 阶段。使用 helm lint --strict 结合自定义脚本,在 PR 阶段自动拦截不符合规范的 Chart 提交。