Helm Chart 剖析:Chart、Values、模板与 Release
每个 chart 共有的文件夹结构,以及让 Helm 不止于 YAML 打包器的三个概念。
Helm 将一个 Kubernetes 应用打包为一个 chart:一个包含模板化清单以及一组默认 values 的目录。本指南介绍每个 chart 共有的文件夹结构,以及 Helm 其余一切所依赖的三个概念:chart、values 和 release。
为什么不直接写普通清单
一个不简单的应用很少只有一个 Deployment。它是一个 Deployment、一个 Service、一个 ConfigMap,也许还有 Secret 和 Ingress,而你希望把同一组资源部署到 dev、staging 和 production,环境之间只有少数几个值不同:镜像标签、副本数、命名空间。为每个环境复制粘贴清单,意味着每个共享字段都可能彼此失去同步。chart 将清单作为模板只保存一次,并让每次安装提供自己的 values。
文件夹结构
helm create webapp
这会生成如下脚手架:
webapp/
├── Chart.yaml # chart metadata: name, version, description
├── values.yaml # default configuration values
├── charts/ # any charts this one depends on
├── .helmignore
└── templates/
├── deployment.yaml
├── service.yaml
├── _helpers.tpl # reusable template snippets
├── NOTES.txt # printed after install/upgrade
└── tests/
└── test-connection.yaml
Chart.yaml 是关于 chart 本身的元数据,主要是它的名称、版本和 apiVersion(Helm 3 和当前的 Helm 4 使用 v2)。values.yaml 保存默认配置。templates/ 保存混入了 Helm 模板语法的 Kubernetes 清单。charts/ 保存此 chart 所依赖的任何 chart,只有在你把 chart 组合在一起时才会涉及。生成的示例是一个可用的 nginx chart,内容比你通常需要的更多;大多数团队要么删除脚手架并编写自己的三四个模板,要么裁剪掉不适用的部分。
Values 流入模板
模板看起来像普通清单,只是带有占位符:
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.appName }}
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Values.appName }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
# values.yaml
appName: webapp
replicaCount: 2
image:
repository: nginx
tag: "1.25"
.Values 是由 values.yaml 构建的对象,并与命令行提供的任何内容合并。运行 helm install 或 helm template 会用该对象渲染 templates/ 下的每个文件,产生普通的 Kubernetes YAML。{{ }} 语法是 Go 模板,与 Kubernetes 生态系统中其他地方使用的是同一种模板语言,所以除此之外没有什么专有的东西需要学习。Values 可以通过三种方式覆盖,优先级由低到高:values.yaml 的默认值、用 -f 传入的额外文件,以及命令行上单独的 --set key=value 参数。
Release 是 chart 的一次具体部署
渲染一个 chart 并将结果应用到集群,会创建一个 release:一个具名、被跟踪的安装,拥有自己的历史。
helm install web-dev ./webapp
helm list
web-dev 是 release 名称。你可以用不同的 release 名称多次安装同一个 chart,在同一命名空间或不同命名空间中,例如 web-dev 和 web-staging。针对某个 release 的每次 helm upgrade 都会在其历史中添加一个新的修订版本,这正是之后 helm rollback 得以实现的原因:Helm 不只是应用 YAML,它还跟踪应用了什么以及何时应用的。本系列中的 release 管理指南会完整介绍这一工作流。
NOTES.txt 的用途
templates/NOTES.txt 是纯文本,本身也以同样的方式被模板化,Helm 在 install 或 upgrade 之后会把它打印出来。用它告诉安装者接下来该做什么:一条 kubectl port-forward 命令、Service 可访问的 URL,或者首次运行的步骤。它对集群没有任何影响;纯粹是给运行命令的人看的一条消息。
Chart 从哪里来
你不必自己编写每一个 chart。常见软件、数据库、监控栈、ingress 控制器的公共 chart 发布在 Artifact Hub 上,一条命令即可安装。本系列的其余部分先介绍编写你自己的 chart,然后介绍查找并安装已发布的 chart。