尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

深入解析 Helm Chart 最小结构:从 `helm create alpine` 生成的示例看 Chart 组成与安装流程

深入解析 Helm Chart 最小结构:从 `helm create alpine` 生成的示例看 Chart 组成与安装流程 深入解析 Helm Chart 最小结构从helm create alpine生成的示例看 Chart 组成与安装流程【免费下载链接】helmThe Kubernetes Package Manager项目地址: https://gitcode.com/GitHub_Trending/hel/helm导读在 HelmKubernetes Package Manager中一个最小的、可直接安装的 Chart 到底由哪些文件组成模板参数如何从values.yaml注入到最终的 Kubernetes 资源清单本文以仓库 pkg/downloader/testdata/signtest/alpine 下的README.md所描述的示例 Chart 为骨架逐文件拆解helm create alpine生成的目录结构、模板语法与默认值机制并结合 Helm 源码中helm create的实现internal/chart/v3/util/create.go与签名验证测试pkg/downloader/chart_downloader_test.go让读者完整掌握从零生成 Chart → 阅读结构 → 修改参数 → 本地安装的实战闭环。示例 Chart 的由来helm create alpine仓库中pkg/downloader/testdata/signtest/alpine/README.md的第一句话就交代了这个目录的用途This example was generated using the commandhelm create alpine.也就是说这个目录并非手写产物而是 Helm 内置脚手架命令helm create的真实输出被保留下来作为测试与示例数据。它同时被嵌套在signtest目录pkg/downloader/testdata/signtest下作为 Chart 签名/下载测试场景的一部分——这一点我们从 pkg/downloader/chart_downloader_test.go 中可以看到它被配套的.tgz与.prov签名文件一起使用用于验证下载后的 Chart 完整性。helm create是 Helm 为用户提供的 Chart 脚手架命令。在源码 internal/chart/v3/util/create.go 中Create(name, dir string)函数会先校验 Chart 名称合法性正则^[a-zA-Z0-9._-]$长度不超过 250在目标目录下创建以 Chart 名为名的子目录依次写入Chart.yaml、values.yaml、.helmignore及templates/下的示例资源模板额外创建空的charts/目录用于存放未来拉取的依赖。因此helm create alpine产出的结构天然就是一个最小的可安装 Chart非常适合作为学习 Helm Chart 结构的入门标本。Chart 目录结构与文件职责alpine示例 Chart 的完整目录如下以仓库根目录为基准pkg/downloader/testdata/signtest/alpine/ ├── Chart.yaml # Chart 元数据名称、版本、描述等 ├── README.md # 使用说明即本文所依据的文档 ├── values.yaml # 默认配置值 └── templates/ └── alpine-pod.yaml # 渲染后的 Pod 资源模板这正对应 Helm 约定俗成的 Chart 内部布局元数据文件Chart.yaml 默认值文件values.yaml 模板目录templates/。相比helm create默认生成的完整骨架还会包含deployment.yaml、service.yaml、ingress.yaml、NOTES.txt、_helpers.tpl等这个示例被刻意精简只保留了一个 Pod 模板因此特别适合作为最小示例讲解。Chart.yamlChart 的身份信息pkg/downloader/testdata/signtest/alpine/Chart.yaml内容如下apiVersion: v1 description: Deploy a basic Alpine Linux pod home: https://helm.sh/helm name: alpine sources: - https://github.com/helm/helm version: 0.1.0这里每个字段的含义分别是字段含义说明apiVersionChart API 版本v1为经典 Chart 格式现代 Helm 默认为v2见下nameChart 名称必须与目录名一致是安装与引用的标识versionChart 版本号遵循语义化版本SemVer打包升级时递增description简短描述说明该 Chart 部署的内容home项目主页 URL可选的元信息sources源码仓库地址列表可选的元信息需要说明的是当前仓库使用的默认脚手架模板internal/chart/v3/util/create.go生成的是apiVersion: v3的新式Chart.yaml并额外包含typeapplication/library与appVersion字段而本示例是历史遗留数据保留了经典的v1格式。两者核心字段name、version、description语义一致v1格式同样可被 Helm 正常加载与渲染。templates/alpine-pod.yaml模板如何工作templates/目录存放 Go 模板文件Helm 渲染时会将其与values.yaml合并后生成最终的 Kubernetes 清单。alpine示例的模板pkg/downloader/testdata/signtest/alpine/templates/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包含安装时生成的发布信息如.Release.Name发布名称、.Release.Service固定为Helm。因此metadata.name会被渲染成发布名-alpine实现不同发布之间的资源隔离。内建对象.Chart直接引用 Chart.yaml 中的元数据如.Chart.Name、.Chart.Version。管道与函数{{.Chart.Version | quote}}将版本号用引号包裹输出{{default Never .restart_policy}}表示若未提供restart_policy值则回退为Never。顶层标量参数.restart_policydefault函数查找的值没有Values前缀说明它访问的是合并后的顶层值Helm 允许通过--set注入顶层键。模板渲染的基础原理可以在 pkg/engine/engine.go 中看到Helm 将 Chart 的默认值、用户提供的值以及内建对象.Release、.Chart、.Values等合并成渲染上下文再交给 Gotext/template执行。values.yaml的内容就是合并后.Values对象的来源。values.yaml默认值即参数入口pkg/downloader/testdata/signtest/alpine/values.yaml是整个示例的参数面板# The pod name name: my-alpine注释表明这是一个占位参数name: my-alpine虽然当前版本的alpine-pod.yaml模板并未直接使用它模板的名称取自.Release.Name与.Chart.Name但它体现了 Helm 的核心设计哲学把可调参数集中声明在values.yaml模板只负责读取与组合。README 中values.yaml文件包含alpine-pod.yaml模板的默认值正是对这个机制的描述。在实际使用中用户可以不修改values.yaml本身而是在安装时通过--values指定自定义文件、或通过--set keyvalue覆盖单个键Helm 会按默认值 用户提供的值的优先级合并。相关的取值/合并逻辑可参见 internal/chart/v3/util/dependencies.go 与 pkg/chart/common/util/coalesce.go。安装这个示例helm install ./alpineREADME 最后给出了一句关键的实操命令You can install this example usinghelm install ./alpine.helm install接受本地目录路径作为 Chart 来源其执行流程见 pkg/action/install.go大致为加载并校验本地 Chart 目录Chart.yaml必须存在且合法渲染templates/下所有模板得到最终的 Kubernetes 资源清单将资源清单组装为 Release 对象并写入集群存储向 Kubernetes API 提交资源。针对这个示例一个完整的安装命令可以是# 在 alpine 目录的上层执行 helm install my-alpine ./alpine执行后Helm 会生成发布名称my-alpine渲染alpine-pod.yaml得到名为my-alpine-alpine的 Pod{{.Release.Name}}-{{.Chart.Name}}由于模板中restartPolicy未在values.yaml中定义回退为Never创建一个使用alpine:3.3镜像、执行/bin/sleep 9000的waiter容器。若想先预览渲染结果而不真正部署可运行helm template ./alpine或helm install --dry-run ./alpine这是调试模板最常用的手段。若需要自定义参数可用helm install my-alpine ./alpine --set restart_policyAlways该命令会把模板中的{{default Never .restart_policy}}渲染为Always直观演示--set对默认值的覆盖。从源码看这个示例的血缘alpine目录虽小却在 Helm 源码与测试中扮演着双重角色作为helm create产物的真实样例对比 internal/chart/v3/util/create.go 中defaultChartfile、defaultValues及各模板常量可以发现helm create脚手架正是按元数据 默认值 模板三段式生成 Chart。示例中一个非常简单的 Pod 资源 少量参数的描述恰好是 Helm 官方对最小可用 Chart 的定位。作为签名验证测试的输入alpine被放在signtest测试数据目录下与该目录中的signtest-0.1.0.tgz、signtest-0.1.0.tgz.provprov 文件内含sha256摘要见 pkg/downloader/testdata/signtest-0.1.0.tgz.prov配合使用。pkg/downloader/chart_downloader_test.go 中的TestVerifyChart即调用VerifyChart校验signtest-0.1.0.tgz与其.prov签名文件的一致性验证 Helm 的 Chart 下载校验链路pkg/downloader/manager_test.go 则演示了如何把testdata/signtest作为本地依赖file://协议解析并打包成signtest-0.1.0.tgz。从源码结构可以推断alpine这一嵌套子目录既可用作干净的最小 Chart 样例被其他测试引用也保留了早期helm create脚手架的历史形态是理解 Chart 结构演进apiVersion: v1→v3、精简模板 → 完整骨架的鲜活标本。小结从示例到实战的四个要点回到pkg/downloader/testdata/signtest/alpine/README.md的四句话它实际上完整覆盖了学习 Helm Chart 的四个里程碑Chart 的诞生helm create name是标准脚手架产出的目录天然可安装模板即代码templates/下的 YAML 是 Go 模板通过.Release、.Chart、.Values等对象动态生成资源清单参数与默认值分离values.yaml集中管理可调参数模板用default函数处理缺失值安装时可用--set/--values覆盖本地即可验证helm install ./alpine直接安装本地目录配合helm template与--dry-run可在不触碰集群的前提下快速迭代。掌握了这份最小 Chart 的结构与渲染机制再去阅读 internal/chart/v3 下更复杂的 Chart 加载逻辑、或参考 pkg/action/install.go 的安装流程就能以点带面地理解 Helm 的完整工作链路。延伸阅读建议读者结合以下仓库文件继续深入internal/chart/v3/util/create.gohelm create脚手架的全部默认模板与校验逻辑pkg/engine/engine.go模板渲染引擎的核心实现pkg/action/install.gohelm install的安装动作实现pkg/downloader/chart_downloader_test.goChart 下载与签名验证的测试用例。【免费下载链接】helmThe Kubernetes Package Manager项目地址: https://gitcode.com/GitHub_Trending/hel/helm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表