Helm 最小图表示例解剖:从helm create alpine到可安装的 Pod 图表
【免费下载链接】helmThe Kubernetes Package Manager项目地址: https://gitcode.com/GitHub_Trending/hel/helm
这篇技术指南以 helm 仓库测试数据中的 alpine 子图表示例(README.md)为线索,逐层拆解一个最小 Helm 图表的完整组成:Chart.yaml元数据、templates/模板目录、values.yaml默认值,以及helm install的安装方式。读完本文,你将理解helm create生成的图表骨架中各文件与模板指令的真实作用,并掌握如何参照该示例快速搭建自己的第一个 Helm 图表。
示例的由来:helm create alpine
该 alpine 子图表位于测试数据目录internal/chart/v3/util/testdata/frobnitz/charts/alpine/,其 README 明确说明:这个示例是使用helm create alpine命令生成的。
在 helm 源码中,helm create的底层实现位于 internal/chart/v3/util/create.go,其中的Create(name, dir string)函数(见 create.go)会完成以下工作:
- 使用正则
^[a-zA-Z0-9._-]+$与 250 字符长度上限校验图表名(validateChartName,见 create.go); - 在目标目录下创建以图表名命名的子目录;
- 写入 12 类默认文件(Chart.yaml、values.yaml、.helmignore、templates/ 下的 deployment.yaml、service.yaml、ingress.yaml、httproute.yaml、serviceaccount.yaml、hpa.yaml、NOTES.txt、_helpers.tpl、test-connection.yaml);
- 显式创建
charts/依赖目录(os.MkdirAll(filepath.Join(cdir, ChartsDir), 0o755))。
值得注意:现代helm create默认生成的模板要丰富得多(Deployment、Service、Ingress 等),而本文的 alpine 示例刻意保持"极简"——它只包含一个非常简单的 Pod 模板和极少的参数,非常适合作为理解 Helm 图表渲染机制的入门标本。
图表目录结构总览
alpine 子图表的完整结构如下(相对仓库根目录):
internal/chart/v3/util/testdata/frobnitz/charts/alpine/ ├── Chart.yaml # 图表元数据(apiVersion: v3) ├── README.md # 本文所依据的示例说明 ├── values.yaml # 默认值文件(README 中误写为 values.toml) ├── templates/ │ └── alpine-pod.yaml # 唯一的模板文件:一个极简 Pod └── charts/ # 子图表目录(含 mast1/ 子图表与 mast2-0.1.0.tgz 打包文件)这里有一个细节值得注意:示例 README 提到 "Thevalues.tomlfile contains the default values",但仓库中实际的文件名是 values.yaml。Helm 约定俗成的默认值文件名就是values.yaml,这一点可以从源码常量确认:ValuesfileName = "values.yaml"(见 create.go)。这属于测试数据中 README 的笔误,实际行为以代码为准。
Chart.yaml:图表元数据
alpine/Chart.yaml 内容如下:
apiVersion: v3 name: alpine description: Deploy a basic Alpine Linux pod version: 0.1.0 home: https://helm.sh/helm关键字段说明:
| 字段 | 值 | 作用 |
|---|---|---|
apiVersion | v3 | 声明使用 Helm 3 图表格式(chart.APIVersionV3),区别于 Helm 2 的v1/v2 |
name | alpine | 图表名称,须匹配^[a-zA-Z0-9._-]+$,并作为资源命名的一部分 |
description | 单行描述 | 人类可读的图表用途说明 |
version | 0.1.0 | 图表语义化版本,每次修改模板或 appVersion 都需递增 |
home | URL | 项目主页 |
对比仓库中更完整的 frobnitz 主图表 Chart.yaml,可以看到可选字段还包括keywords、maintainers、sources、icon、annotations和dependencies。在create.go的defaultChartfile模板中(见 create.go),还会默认生成type: application与appVersion: "1.16.0"字段,并附带注释说明应用图表(application)与库图表(library)的区别。
模板文件:templates/alpine-pod.yaml逐行解析
核心模板文件 alpine-pod.yaml 是整个示例的精华:
apiVersion: v1 kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: app.kubernetes.io/managed-by: {{.Release.Service}} chartName: {{.Chart.Name}} chartVersion: {{.Chart.Version | quote}} spec: restartPolicy: {{default "Never" .restart_policy}} containers: - name: waiter image: "alpine:3.3" command: ["/bin/sleep","9000"]这段模板展示了 Helm 模板引擎的四个核心机制:
内置对象访问:
{{.Release.Name}}、{{.Chart.Name}}、{{.Release.Service}}、{{.Chart.Version}}分别引用 Release 对象(本次发布的名称与服务类型)和 Chart 对象(元数据)。这些对象由模板引擎在渲染时注入,其渲染入口可在 internal/chart/v3/loader/load.go 的图表加载链路中找到对应上下文构造逻辑。管道与函数:
{{.Chart.Version | quote}}将版本号通过quote函数转为带引号的字符串;{{default "Never" .restart_policy}}则是在.restart_policy未定义时回退到默认值"Never"。这正是 Helm 模板中"安全取值"的常见写法——default函数可以避免空值直接渲染到 YAML 中导致格式错误。渲染结果:以
helm install my-alpine ./alpine为例,上述模板会被渲染为名为my-alpine-alpine的 Pod(Release.Name 拼接 Chart.Name),标签中携带托管者Helm({{.Release.Service}})与图表版本"0.1.0"。镜像与命令:
image: "alpine:3.3"配合command: ["/bin/sleep","9000"]让 Pod 启动后挂起 9000 秒,方便观察部署状态——这是一个典型的"占位容器"教学用法。
values.yaml:模板参数的默认值来源
alpine/values.yaml 内容极简,只有一行有效配置:
# The pod name name: "my-alpine"README 声称 values 文件包含alpine-pod.yaml模板的默认值,但对照上面的模板可以发现:实际模板引用的外部参数只有.restart_policy(且已用default兜底),Pod 名称则通过.Release.Name与.Chart.Name计算得出,values.yaml中的name字段在渲染时并不会被模板直接消费。这说明该示例的 values 文件更偏向"演示默认值文件的存在形式",而非严格与模板一一对应——这正是入门示例常见的简化处理。
作为对照,helm create生成的完整默认 values 文件(defaultValues常量,见 create.go)会包含replicaCount、image.repository/pullPolicy/tag、imagePullSecrets、serviceAccount、ingress、httpRoute、resources、livenessProbe、autoscaling等几十个带注释的参数,并针对每个参数附上 Kubernetes 官方文档链接——这是编写生产级图表 values 文件的最佳参考模板。
安装示例:helm install ./alpine
README 给出了唯一的实战命令:
helm install ./alpine这里省略了 release 名称,Helm 会为本次发布自动生成一个随机名称。更完整的用法是显式指定名称并覆盖 values:
helm install my-alpine ./alpine helm install my-alpine ./alpine --set restart_policy=OnFailure helm install my-alpine ./alpine -f my-values.yaml其中--set与-f分别对应命令行内联赋值与外部 values 文件覆盖,二者合并后的最终值会参与模板渲染。安装后可通过helm list、helm status my-alpine、kubectl get pods观察结果,用helm uninstall my-alpine清理。
需要说明的适用前提:执行安装要求集群上下文可用(kubectl已配置),而模板渲染本身(不触达集群)可通过helm template ./alpine或helm install --dry-run验证。
测试数据中的验证依据
该 alpine 子图表并非孤立存在,而是嵌在 frobnitz 这个用于测试的复合图表中(父级 Chart.yaml 声明了 alpine 与 mariner 两个依赖)。仓库中的测试用例从多个角度验证了这类图表的行为:
- load_test.go 通过
Loader("testdata/frobnitz")加载整棵依赖树,断言图表名称、模板文件与依赖子图表是否正确解析,frobnitz-1.2.3.tgz的打包/解包也在 expand_test.go 中覆盖; - create_test.go 的
TestCreate会真实调用Create("foo", tdir)生成新图表,随后用loader.LoadDir重新加载,并逐一断言 Chart.yaml、templates 目录、values.yaml 等 12 个文件全部存在; - create_test.go 的
TestCreateFrom则以testdata/frobnitz/charts/mariner为源执行CreateFrom脚手架复制,并验证模板内容中<CHARTNAME>占位符已被全部替换。
这些测试共同印证了本文描述的图表结构约定:templates/目录下的.yaml会被当作模板渲染,values.yaml提供默认值,charts/存放依赖子图表。理解 alpine 这个最小示例后,再对照 create.go 中完整的默认模板与 values 常量,即可从零编写结构规范、参数完备的 Helm 图表。
【免费下载链接】helmThe Kubernetes Package Manager项目地址: https://gitcode.com/GitHub_Trending/hel/helm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考