Helm 图表初体验从helm create生成的 alpine 示例图表到安装实战【免费下载链接】helmThe Kubernetes Package Manager项目地址: https://gitcode.com/GitHub_Trending/hel/helmHelm 是 Kubernetes 的包管理器而图表Chart是其打包、分发与安装应用的最小单元。本文以仓库中 frobnitz.v2.reqs/charts/alpine 这一测试夹具图表为核心逐文件拆解helm create alpine生成的标准目录结构模板如何引用参数、默认值文件如何组织、子图表如何挂载以及如何用helm install一键部署一个 Alpine Linux Pod。读完本文你将理解一个最小 Helm 图表的完整骨架并能独立创建、阅读与安装属于自己的第一个图表。关联文档说了什么被指定的关联文档是 charts/alpine/README.md全文只有 9 行但信息密度并不低This example was generated using the commandhelm create alpine.Thetemplates/directory contains a very simple pod resource with a couple of parameters.Thevalues.tomlfile contains the default values for thealpine-pod.yamltemplate.You can install this example usinghelm install ./alpine.它交代了三件事图表由helm create alpine生成templates/下有一个带若干参数的简单 Pod 资源安装方式是helm install ./alpine。这篇 README 是典型的 Helm 官方脚手架产物——短小、直白但它背后对应的源码实现helm create命令、目录加载器、模板渲染引擎值得深入展开。本文将沿着这份 README 的线索结合 internal/chart/v3/util/create.go 与 pkg/chart/v2/loader/load.go 等源码把一个 Helm 图表长什么样、怎么被加载、怎么被安装讲透。图表全貌alpine 示例图的目录结构先完整浏览这个示例图表的目录树位于 pkg/chart/v2/loader/testdata/frobnitz.v2.reqs/charts/alpinealpine/ ├── charts/ # 子图表依赖目录 │ ├── mast1/ # 一个未打包的子图表Chart.yaml values.yaml │ └── mast2-0.1.0.tgz # 一个已打包为 tgz 的子图表 ├── templates/ │ └── alpine-pod.yaml # 唯一的模板文件 ├── Chart.yaml # 图表元数据 ├── README.md # 使用说明即关联文档 └── values.yaml # 默认值文件这个结构是 Helm 标准图表布局的浓缩版。对照源码中定义的标准目录常量pkg/chart/v2/util/create.goTemplatesDir templates——模板目录ChartsDir charts——依赖子图表目录ChartYamlFile Chart.yaml——图表元数据文件ValuesfileName values.yaml——默认值文件。Chart.yaml图表的身份证Chart.yaml 内容如下apiVersion: v1 name: alpine description: Deploy a basic Alpine Linux pod version: 0.1.0 home: https://helm.sh/helm字段含义字段值说明apiVersionv1图表 API 版本。v1 是经典版本v2如父图表 frobnitz 的apiVersion: v2将依赖声明从requirements.yaml迁入Chart.yamlnamealpine图表名称模板中通过.Chart.Name引用descriptionDeploy a basic Alpine Linux pod图表功能描述version0.1.0语义化版本号模板中通过.Chart.Version引用homehttps://helm.sh/helm项目主页对照父图表 frobnitz 的 Chart.yaml一个完整的 v2 元数据还可以包含keywords、maintainers、sources、icon、annotations等字段。而这些字段的 Go 结构定义在 internal/chart/v3/metadata.go 中。templates/alpine-pod.yaml核心模板的逐行解读关联文档说templates/目录包含一个带几个参数的极简 Pod 资源即 alpine-pod.yamlapiVersion: v1 kind: Pod metadata: name: {{.Release.Name}}-{{.Chart.Name}} labels: app.kubernetes.io/managed-by: {{.Release.Service}} app.kubernetes.io/name: {{.Chart.Name}} helm.sh/chart: {{.Chart.Name}}-{{.Chart.Version}} spec: restartPolicy: {{default Never .restart_policy}} containers: - name: waiter image: alpine:3.9 command: [/bin/sleep,9000]关键点逐一分析{{.Release.Name}}-{{.Chart.Name}}——Pod 名称由发布名-图表名拼接。Release与Chart是模板内置对象由 Helm 在渲染时注入定义在 internal/chart/v3/loader/load.go 对应的图表加载流程中{{.Release.Service}}——发布的服务标识通常为Helmhelm.sh/chart: {{.Chart.Name}}-{{.Chart.Version}}——标注图表名与版本便于在集群中溯源资源归属{{default Never .restart_policy}}——default是 Helm 模板函数定义于 pkg/engine/funcs.go若.restart_policy未设置则回退为Never。注意这里访问的是顶层.restart_policy而非.Values.restart_policy容器——固定镜像alpine:3.9命令/bin/sleep 9000让 Pod 保持存活以便观察。值得注意这是一个教学味很浓的模板。它直接引用.restart_policy这种非常规的顶层键而标准脚手架helm create默认产物用的是.Values.xxx命名空间。这正是测试夹具图表与真实脚手架的区别也解释了为什么关联文档特意强调a couple of parameters。values.yaml 与 values.toml默认值的两种载体关联文档提到 Thevalues.tomlfile contains the default values——这需要澄清在当前目录中实际存在的是 values.yaml# The pod name name: my-alpinevalues.toml是 Helm 早期版本v1/alpha 阶段遗留的描述性说法。现在 Helm 的默认值文件统一为values.yaml其加载实现在 internal/chart/v3/loader/load.go 中图表加载时按ValuesfileName values.yaml读取该文件并解析为默认值字典。为什么 alpine-pod.yaml 模板里没有用到name: my-alpine因为模板直接用了.Chart.Name。这再次说明这个图表是参数演示性质的夹具而不是参数完备的生产图表——values.yaml中的值并不会自动注入模板必须由模板通过.Values.xxx显式引用才会生效。charts/ 子图表依赖的两种存在形态alpine 图表还挂载了两个子图表依赖展示依赖的两种形态未打包目录charts/mast1仅含 Chart.yamlapiVersion: v1、name: mast1、version: 0.1.0与一个基本为空的 values.yaml打包压缩包mast2-0.1.0.tgz以 Helm 打包格式存在的依赖。这种目录 tgz 混放的布局正是 Helm 目录加载器pkg/chart/v2/loader/directory.go 的LoadDir与归档加载器pkg/chart/v2/loader/archive.go 的LoadFile/LoadArchive各自职责的直观体现目录由LoadDir递归遍历.tgz归档由LoadFile解压读取。从源码结构看子图表会被加载进父图表的Dependencies字段模板渲染时可跨图表引用资源。这也解释了为什么mast1的Chart.yaml中home为空字符串——测试夹具只关心能否被正确加载不关心元数据是否好看。用 helm install 安装这个图表关联文档给出了安装命令helm install ./alpine在 Helm 中helm install的完整形态是helm install release-name chart当省略 release-name 时 Helm 会自动生成一个随机的发布名。从仓库命令行实现pkg/cmd/install.go看该命令的典型完整用法还包括# 指定发布名与命名空间 helm install my-alpine ./alpine --namespace demo # 覆盖默认值 helm install my-alpine ./alpine --set restart_policyAlways # 先做干跑预览不实际部署 helm install my-alpine ./alpine --dry-run --debug安装流程的底层调用链是helm install→ pkg/action/install.go 的Install.Run→ 图表加载loader.Load见 pkg/chart/v2/loader/load.go→ pkg/engine/engine.go 的模板渲染 → 发布到 Kubernetes。具体到本图表安装后 Pod 名称为随机发布名-alpine模板拼接{{.Release.Name}}-{{.Chart.Name}}的结果标签含app.kubernetes.io/managed-by: Helm、helm.sh/chart: alpine-0.1.0容器waiter使用alpine:3.9镜像并休眠 9000 秒。从源码看目录加载如何对待 README 与其他文件关联文档 README 位于图表目录内加载图表时它会被如何处理看 pkg/chart/v2/loader/load.go 的LoadFiles实现加载器会遍历目录下的所有文件并按类型归类——Chart.yaml解析为元数据values.yaml解析为默认值templates/下的文件作为模板而README.md这类文件会被归入图表的Files辅助文件列表不参与渲染仅作为文档留存。因此这个 README 的作用是给阅读图表的人看而不是给渲染引擎看。这正是 Helm 图表的最佳实践之一——每个图表都应附带 README 说明其用途与安装方式本文所分析的这篇正是官方脚手架自带的模板说明。关键源码与文件速查关注点仓库路径图表目录标准常量pkg/chart/v2/util/create.go图表元数据结构internal/chart/v3/metadata.go目录加载器LoadDirpkg/chart/v2/loader/directory.go归档加载器LoadFile/LoadArchivepkg/chart/v2/loader/archive.go通用加载入口Loadpkg/chart/v2/loader/load.go模板渲染引擎pkg/engine/engine.go模板内置函数如defaultpkg/engine/funcs.gohelm install命令实现pkg/cmd/install.go安装动作Install.Runpkg/action/install.go小结这篇 9 行的 README 背后是一个完整的 Helm 图表教学标本Chart.yaml定义身份、templates/alpine-pod.yaml演示模板语法与内置对象.Release、.Chart、default函数、values.yaml承载默认值、charts/挂载两种形态的子图表、helm install ./alpine一键部署。理解了这个最小图表你就掌握了 Helm 图表结构、加载机制与安装流程的最小闭环可以在此基础上用helm create生成脚手架逐步构建自己的生产级图表。延伸阅读本示例图表位于测试夹具目录 pkg/chart/v2/loader/testdata/frobnitz.v2.reqs其父图表frobnitz使用了apiVersion: v2并通过requirements.yamlpkg/chart/v2/loader/testdata/frobnitz.v2.reqs/requirements.yaml声明依赖是研究 Helm 依赖解析与 v1/v2 兼容加载逻辑的绝佳样例。【免费下载链接】helmThe Kubernetes Package Manager项目地址: https://gitcode.com/GitHub_Trending/hel/helm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
