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 资源。
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 结构和语法错误。