3. Chart 目录结构详解:Chart.yaml、values.yaml、templates/、charts/、crds/、README 等文件的作用与规范
一个标准 Helm Chart 的目录结构是 Helm 打包、发布和版本管理的基石。理解每个文件和目录的职责,是进行 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 |
否 | 自定义元数据键值对 | 用于扩展信息,如分类、团队 |
# 标准 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 覆盖这些值。
--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 流水线、在线开发 |
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
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 目录结构及其各组件之间的数据流关系:
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 |
helm lint --strict 结合自定义脚本,在 PR 阶段自动拦截不符合规范的 Chart 提交。