ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

深入解析 incubator/raw Chart:用 Helm 统一管理 Kubernetes 原生资源与模板化资源

深入解析 incubator/raw Chart:用 Helm 统一管理 Kubernetes 原生资源与模板化资源 【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载incubator/raw是 Helm Charts 仓库GitHub 加速计划 / chart / chartsincubator 目录下的一个通用 Chart它允许用户把任意一组 Kubernetes 资源如LimitRange、PriorityClass、Secret直接写进values.yaml由 Chart 统一注入默认metadata.labels后安装到集群。本文将以该 Chart 的官方文档为主体结合其模板源码与 CI 测试配置完整讲解 raw 资源与 templated 资源的两种用法、安装命令以及标签合并的底层实现原理帮助读者掌握一套无需为每种 K8s 资源单独写 Chart即可用 Helm 统一交付的实践方法。一、Chart 定位给没有家的 Kubernetes 资源一个统一入口incubator/raw的定位非常明确接收一份 Kubernetes 资源清单将清单中的每一项资源与一份默认的metadata.labels合并然后把合并后的结果安装到集群见 incubator/raw/README.md。其核心设计是两类资源入口raw 资源定义在resources键下是字面意义上的原始资源直接以 YAML 形式列出apiVersion、kind、metadata等字段templated 资源定义在templates键下是一段 Helm 模板文本可以引用{{ .Values.xxx }}等模板变量适合注入运行时才确定的参数如密钥。官方文档列出的典型使用场景包括以下资源类型LimitRange为命名空间设置 Pod / 容器的资源限额范围PriorityClass定义 Pod 优先级类供调度器在资源紧张时决定抢占顺序Secret以 Helm 方式创建和管理敏感配置。这类资源往往不隶属于某个具体应用又没有对应的独立 Chartincubator/raw恰好提供了一个杂项资源统一入口。Chart 的description字段也印证了这一点A place for all the Kubernetes resources which dont already have a home见 incubator/raw/Chart.yaml。需要说明的是该 Chart 已标记为deprecated: true版本 0.2.5见 incubator/raw/Chart.yaml整个仓库也于 2020 年 11 月 13 日起停止更新并归档。本文内容基于仓库现状整理适用于理解该 Chart 的设计思路新项目建议优先参考 Helm 3 时代的原生include/tpl组合或 Operator 方案。二、Raw 资源直接把 YAML 资源清单交给 Helm2.1 设计思路Raw 资源的使用方式最为直接把完整的 Kubernetes 资源对象写进values.yaml或独立的-f文件Helm 渲染时会为每个对象自动补上metadata.labels无需手工维护繁琐的标签。2.2 STEP 1创建包含 raw 资源的 YAML 文件以下示例来自官方文档文件可命名为raw-priority-classes.yaml一次性定义 8 个PriorityClass覆盖公共命名空间级与应用级两个优先级档次# raw-priority-classes.yaml resources: - apiVersion: scheduling.k8s.io/v1beta1 kind: PriorityClass metadata: name: common-critical value: 100000000 globalDefault: false description: This priority class should only be used for critical priority common pods. - apiVersion: scheduling.k8s.io/v1beta1 kind: PriorityClass metadata: name: common-high value: 90000000 globalDefault: false description: This priority class should only be used for high priority common pods. - apiVersion: scheduling.k8s.io/v1beta1 kind: PriorityClass metadata: name: common-medium value: 80000000 globalDefault: false description: This priority class should only be used for medium priority common pods. - apiVersion: scheduling.k8s.io/v1beta1 kind: PriorityClass metadata: name: common-low value: 70000000 globalDefault: false description: This priority class should only be used for low priority common pods. - apiVersion: scheduling.k8s.io/v1beta1 kind: PriorityClass metadata: name: app-critical value: 100000 globalDefault: false description: This priority class should only be used for critical priority app pods. - apiVersion: scheduling.k8s.io/v1beta1 kind: PriorityClass metadata: name: app-high value: 90000 globalDefault: false description: This priority class should only be used for high priority app pods. - apiVersion: scheduling.k8s.io/v1beta1 kind: PriorityClass metadata: name: app-medium value: 80000 globalDefault: true description: This priority class should only be used for medium priority app pods. - apiVersion: scheduling.k8s.io/v1beta1 kind: PriorityClass metadata: name: app-low value: 70000 globalDefault: false description: This priority class should only be used for low priority app pods.注意其中两个关键字段value优先级数值越大优先级越高。示例中公共类common取值范围为 7000 万 ~ 1 亿应用类app为 7 万 ~ 10 万两者差距悬殊可确保公共关键性 Pod 在资源竞争时优先被调度globalDefault示例中仅app-medium为true表示未显式指定priorityClassName的 Pod 默认使用该优先级类。整个集群的globalDefault应保持唯一否则 Kubernetes 会因冲突而拒绝创建。该示例同样作为默认注释保存在 incubator/raw/values.yaml 中可直接复制使用。2.3 STEP 2安装 raw 资源官方文档给出的安装命令为Helm v2 语法使用--name指定 release 名称helm install --name raw-priority-classes incubator/raw -f raw-priority-classes.yaml执行后Helm 会将resources下的每一项资源逐一渲染为独立的 Kubernetes 清单并自动追加默认标签详见下文合并与标签注入一节随后在集群中创建 8 个PriorityClass对象。2.4 可验证的最小示例仓库的 CI 目录提供了一个最小化的 raw 资源用例 incubator/raw/ci/resources-values.yaml仅包含单个PriorityClass适合快速验证 Chart 渲染是否正常resources: - apiVersion: scheduling.k8s.io/v1beta1 kind: PriorityClass metadata: name: common-critical value: 100000000 globalDefault: false description: This priority class should only be used for critical priority common pods.三、Templated 资源把模板变量注入 Kubernetes 资源3.1 设计思路当资源内容需要依赖运行时参数例如 Secret 的取值来自外部加密文件时raw 资源的静态写法就不够用了。incubator/raw支持在templates键下书写 Helm 模板模板中可引用{{ .Values.mysecret }}这类变量再由 Helm 渲染引擎求值后输出为资源清单。3.2 STEP 1创建包含 templated 资源的 YAML 文件官方文档示例文件可命名为values.yaml# values.yaml templates: - | apiVersion: v1 kind: Secret metadata: name: common-secret stringData: mykey: {{ .Values.mysecret }}这里的关键在于templates下的每一项都是一段以|块标量书写的多行模板文本模板内的{{ .Values.mysecret }}会在渲染时被替换为来自 values 的真实值。由于 Secret 中往往存放敏感数据官方文档建议用helm-secrets这类工具对包含mysecret的 YAML 文件进行加密。先创建明文文件# secrets.yaml mysecret: abc123再执行加密$ helm secrets enc secrets.yaml加密后的secrets.yaml即可安全地提交到 Git 仓库解密与渲染由 helm-secrets 插件在安装时自动完成。3.3 STEP 2安装 templated 资源通过-f同时传入模板文件与加密后的 secrets 文件helm secrets install --name mysecret incubator/raw -f values.yaml -f secrets.yaml渲染结果为一个名为common-secret的Secret对象其stringData.mykey的值为abc123。文件合并时后传入的secrets.yaml提供了templates模板所需的mysecret变量。3.4 同时使用两种资源入口resources与templates可以共存于同一个 values 文件中。仓库的 CI 综合用例 incubator/raw/ci/values.yaml 展示了这种组合resources: - apiVersion: v1 kind: Secret metadata: name: common stringData: foo: bar mysecret: abc134 templates: - | apiVersion: v1 kind: Secret metadata: name: common-secret stringData: mykey: {{ .Values.mysecret }}渲染后会得到两个资源静态定义的Secret/common与模板求值后的Secret/common-secret。而 incubator/raw/ci/templates-values.yaml 则单独演示了仅含一个ConfigMap模板的最小场景templates: - | apiVersion: v1 kind: ConfigMap metadata: name: raw四、底层实现一次合并统一注入标签incubator/raw的全部渲染逻辑只有一份模板文件 incubator/raw/templates/resources.yaml核心是逐项遍历 与默认标签模板合并{{- $template : fromYaml (include raw.resource .) -}} {{- range .Values.resources }} --- {{ toYaml (merge . $template) -}} {{- end }} {{- range $i, $t : .Values.templates }} --- {{ toYaml (merge (tpl $t $ | fromYaml) $template) -}} {{- end }}逐行拆解include raw.resource .调用辅助模板生成一份默认元数据含metadata.labels再用fromYaml解析为 map得到$templaterange .Values.resources遍历resources列表对每一项执行merge . $template。Helm 内置的merge语义是后传入者优先即$template中的默认标签会覆盖资源自身同名字段最终toYaml序列化输出range $i, $t : .Values.templates遍历templates列表先用tpl $t $对模板文本求值$即顶层 context因此模板内可访问.Values.mysecret等再fromYaml解析为 map最后同样与$template合并输出。4.1 默认标签从哪里来raw.resource辅助模板默认标签由 incubator/raw/templates/_helpers.tpl 中的raw.resource定义{{- define raw.resource -}} metadata: labels: app: {{ template raw.name . }} chart: {{ template raw.chart . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} {{- end }}即每个被管理的资源都会自动获得四个标签这也是 Helm 官方 Chart 约定俗成的标签规范标签键取值来源含义appraw.name默认取 Chart 名raw可用nameOverride覆盖应用标识chartraw.chartChart 名 版本号如raw-0.2.5来源 Chart 标识release.Release.Namerelease 名所属 Helm releaseheritage.Release.Service固定为Helm管理工具来源4.2 命名辅助函数raw.name与raw.chart同一份_helpers.tpl中还定义了命名规则与 Helm 官方模板规范一致raw.name优先使用nameOverride否则取.Chart.Name并做trunc 63 | trimSuffix -截断处理raw.chart格式化为Chart.Name-Chart.Version把替换为_后再截断到 63 字符DNS 命名规范限制同时保证 Chart 版本升级不会产生标签值歧义raw.fullname在fullnameOverride为空时若 release 名已包含 Chart 名则直接使用 release 名否则拼接为Release.Name-Chart.Name同样截断到 63 字符。该函数虽未直接在资源渲染中使用但保留了标准命名能力便于扩展。4.3 values 默认值resources: []与templates: []incubator/raw/values.yaml 中两个核心键的默认值均为空列表resources: [] templates: []这意味着用户可以在自己的 values 中通过追加式覆盖Helm 的-f多文件合并语义自由扩展这两个列表而无需改动 Chart 本身。文件中还以注释形式内嵌了完整的 PriorityClass 示例与 Secret 模板示例作为开箱即用的参考文档。五、使用注意事项与弃用说明Helm 版本前提文档中的helm install --name ...与helm secrets install --name ...均为 Helm v2 时代的命令行语法在 Helm 3 中安装位置参数与 release 命名方式已变化直接照搬需要调整为helm install release chart -f ...。helm-secrets插件templated 资源示例依赖helm secrets子命令对应 helm-secrets 插件完成加密与解密使用前需先安装该插件不敏感的场景也可直接使用明文 values 文件配合helm install -f。资源级联删除与标签被管理的资源与 release 生命周期绑定helm delete时会一并删除由于所有资源都被注入统一的app/release/heritage标签可方便地通过kubectl get kind -l releasename审计与筛选。弃用状态Chart 自身在 incubator/raw/Chart.yaml 中标记deprecated: true整个仓库亦于 2020 年 11 月 13 日归档停止更新。本文仅用于理解其设计模式与历史实现生产环境建议评估其他活跃维护的方案。六、总结incubator/raw用一份不足 20 行的核心模板incubator/raw/templates/resources.yaml实现了任意 K8s 资源 默认标签统一注入的通用能力静态资源走resources键模板化资源走templates键配合merge与raw.resource辅助模板完成标签合并。对于LimitRange、PriorityClass、Secret这类散装资源它提供了一种低成本、可审计的 Helm 化交付思路其遍历 合并默认标签 模板求值的实现也为读者自行编写通用 Chart 提供了可直接借鉴的范式。赞分享【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载相关推荐终极指南Screenbox - 现代化Windows媒体播放器的10个核心功能解析终极指南Screenbox 现代化Windows媒体播放器的10个核心功能解析 Screenbox是一款基于LibVLC的现代化Windows媒体播放器专为音视频视频kubernetes-handbook 实战使用 Helm 管理 Kubernetes 应用Chart 结构、模板渲染与版本管理kubernetes handbook 实战使用 Helm 管理 Kubernetes 应用Chart 结构、模板渲染与版本管理 Helm 是 Kuber教程云原生容器编排Kubernetes资源管理深入理解Pod与容器的资源配置Kubernetes资源管理深入理解Pod与容器的资源配置 概述 在现代容器化部署中合理的资源管理是确保应用稳定性和集群高效运行的关键。Kubernetes文档教程云原生创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表