4. Chart.yaml 详解:核心字段定义与最佳实践
Chart.yaml 是 Helm Chart 的元数据清单文件,位于 Chart 根目录,Helm 客户端通过它识别 Chart 的身份、版本、依赖与约束。一个结构严谨的 Chart.yaml 是发布治理的起点,也是运维排查版本冲突、依赖断裂、升级回滚的第一入口。
核心原则:Chart.yaml 中的每一个字段都应被显式声明,避免依赖 Helm 默认值。生产环境必须保证 version 与 appVersion 语义化、可追溯、与制品仓库一致。
4.1 字段定义速查表
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
apiVersion |
string | 是 | Chart API 版本,v1(Helm 2)或 v2(Helm 3+) |
name |
string | 是 | Chart 名称,必须符合 DNS-1123 子域名规范 |
version |
semver | 是 | Chart 自身的语义化版本,用于 Helm 发布与回滚 |
appVersion |
string | 推荐 | 所部署应用的版本号,可与 Chart version 不同步 |
description |
string | 推荐 | Chart 功能简述,用于 helm search 展示 |
dependencies |
list | 按需 | 子 Chart 依赖列表,定义名称、版本、仓库地址 |
type |
string | 否 | application(默认)或 library |
icon |
string | 否 | Chart 图标 URL,用于 UI 展示 |
keywords |
list | 否 | 搜索关键词,增强 Chart 可发现性 |
home |
string | 否 | 项目主页 URL |
sources |
list | 否 | 源码仓库地址列表 |
maintainers |
list | 推荐 | 维护者信息(name、email、url) |
4.2 核心字段深度解析
4.2.1 apiVersion:Chart API 版本选择
Helm 3 强制使用 v2,Helm 2 使用 v1。当前所有新 Chart 必须声明 apiVersion: v2。v2 支持依赖管理、Library Chart、更严格的 schema 校验。
迁移警告:不要将 v1 Chart 直接修改 apiVersion 为 v2 来“升级”。v2 对依赖目录结构、values 类型校验有差异,必须使用
helm create 重建或通过 helm package 验证。
4.2.2 name:Chart 命名规范
- 必须符合 DNS-1123 子域名:只包含小写字母、数字、连字符(-),首尾为字母数字。
- 禁止使用下划线、大写字母、点号。
- 建议命名与 Git 仓库目录名、OCI 制品仓库名保持一致。
- 示例:
nginx-ingress、prometheus-operator。
4.2.3 version 与 appVersion:双版本治理
这是 Chart.yaml 中最容易混淆的一对字段,也是发布治理的核心。
| 维度 | version | appVersion |
|---|---|---|
| 代表对象 | Chart 包本身的版本 | Chart 所部署的上游应用版本 |
| 变更时机 | Chart 模板、values、依赖变更时 | 上游应用发布新版本时 |
| 格式要求 | 严格 SemVer 2.0 | 自由字符串,推荐 SemVer |
| helm list 展示 | REVISION 列 | APP VERSION 列 |
| 回滚影响 | helm rollback 基于此版本 | 仅标识,不影响回滚逻辑 |
| 最佳实践 | 每次 Chart 变更递增 | 与上游 release tag 对齐 |
# 典型生产示例
apiVersion: v2
name: redis-cluster
version: 3.2.1 # Chart 版本,第 3 次大重构,第 2 次特性,第 1 次补丁
appVersion: 7.2.4 # Redis 上游版本
description: "Redis Cluster Helm Chart for production workloads"
治理建议:在 CI/CD 中,每次 Chart 模板变更自动递增 version 的 patch 位;上游应用升级时同步更新 appVersion 并重置 version 的 minor 位。例如:appVersion 从 7.2.4 升到 7.4.0,Chart version 从 3.2.1 升到 3.3.0。
4.2.4 description:搜索与发现
description 会被 helm search 和 Helm UI(如 Harbor、Artifact Hub)展示。建议控制在 1-2 句话,包含 Chart 名称、主要功能、适用场景。
# 好的描述
description: "NGINX Ingress Controller for Kubernetes, supporting SSL termination, canary deployments, and custom annotations"
# 差的描述
description: "nginx chart"
4.2.5 dependencies:依赖治理
dependencies 字段定义了当前 Chart 所依赖的子 Chart。Helm 3 通过 helm dependency update 将依赖下载到 charts/ 目录并生成 Chart.lock 文件。
dependencies:
- name: common
version: "2.x.x"
repository: "https://charts.bitnami.com/bitnami"
condition: common.enabled
tags:
- bitnami-common
- name: postgresql
version: "12.1.0"
repository: "https://charts.bitnami.com/bitnami"
alias: db
import-values:
- child: defaults
parent: postgresqlDefaults
| 子字段 | 说明 | 最佳实践 |
|---|---|---|
name |
依赖 Chart 名称 | 与上游 Chart.yaml 的 name 一致 |
version |
依赖版本范围 | 使用 SemVer 范围(如 1.x、>=2.0.0 <3.0.0) |
repository |
Chart 仓库 URL 或 OCI 地址 | 优先使用 OCI 仓库(oci://) |
condition |
条件控制,值为 values 中的布尔路径 | 用于按环境开关依赖 |
tags |
标签分组,可批量启用/禁用 | 避免与 condition 冲突 |
alias |
依赖别名,避免同名冲突 | 当依赖多个同名 Chart 时必填 |
import-values |
子 Chart values 导入父 Chart | 谨慎使用,增加隐式耦合 |
依赖治理红线:
- 永远不要手动修改
charts/目录下的依赖 Chart,必须通过helm dependency update管理。 Chart.lock必须提交到 Git,确保可重现构建。- 避免使用
latest或空版本范围,锁定主版本号(如2.x)。
4.3 Chart.yaml 字段关系图
4.4 生产级 Chart.yaml 完整示例
apiVersion: v2
name: platform-gateway
version: 1.4.2
appVersion: 3.2.0
description: "Platform API Gateway based on Kong, with OAuth2, rate limiting, and observability integration"
type: application
keywords:
- gateway
- kong
- api-management
- platform
home: https://github.com/example/platform-gateway
sources:
- https://github.com/example/platform-gateway
- https://github.com/example/platform-common
icon: https://example.com/icons/gateway.png
maintainers:
- name: "Platform Team"
email: "platform@example.com"
url: "https://platform.example.com"
- name: "Alice Zhang"
email: "alice@example.com"
dependencies:
- name: kong
version: "2.36.x"
repository: "https://charts.konghq.com"
condition: kong.enabled
- name: postgresql
version: "12.x"
repository: "oci://registry-1.docker.io/bitnamicharts"
alias: kong-db
tags:
- database
- name: redis
version: "18.x"
repository: "oci://registry-1.docker.io/bitnamicharts"
condition: redis.enabled
tags:
- cache
- name: common
version: "2.x"
repository: "https://charts.bitnami.com/bitnami"
tags:
- platform-common
运维清单检查项:
- ☐ version 是否使用 SemVer 且与 Git tag 一致?
- ☐ appVersion 是否与上游应用 release 版本对齐?
- ☐ dependencies 中是否所有 repository 可访问且版本范围合理?
- ☐ Chart.lock 是否已生成并提交?
- ☐ maintainers 是否包含当前负责人的有效邮箱?
- ☐ apiVersion 是否为 v2?
4.5 常见错误与避坑指南
| 错误场景 | 后果 | 正确做法 |
|---|---|---|
version 使用 latest 或 1.0 |
helm list 无法区分版本,回滚失效 | 严格使用 SemVer:1.0.0 |
| appVersion 与 version 同步递增 | Chart 模板未变更却升级版本,造成冗余发布 | 分离管理,仅上游变更时更新 appVersion |
dependencies 中 repository 使用 file:// 相对路径 |
CI/CD 环境路径不一致导致依赖解析失败 | 使用 HTTPS 或 OCI 仓库地址 |
| name 包含大写字母或下划线 | helm install 报错,K8s 资源命名冲突 | 全小写 + 连字符 |
| 缺少 maintainers 字段 | 故障时无法定位负责人 | 至少填写一个维护者邮箱 |
| 手动修改 charts/ 目录下的依赖 | helm dependency update 覆盖修改,版本不一致 | 通过 dependency 声明 + update 管理 |
4.6 版本治理策略对比
4.7 本章小结
Chart.yaml是 Helm Chart 的身份证,每个字段都有明确的治理含义。version与appVersion必须分离管理,这是发布治理的第一道防线。dependencies使用 SemVer 范围 +Chart.lock锁定,确保可重现构建。- 生产环境必须填写
maintainers、description、keywords,提升可运维性。 - 所有字段的变更都应通过 CI/CD 自动化,避免人工修改导致版本混乱。