ARTICLE DETAIL

资讯详情

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

KubeVela 插件(Addon)经典目录结构全解:以 example-legacy 为例掌握插件打包与渲染原理

KubeVela 插件(Addon)经典目录结构全解:以 example-legacy 为例掌握插件打包与渲染原理 云原生DevOps运维微服务【免费下载链接】kubevelaThe Modern Application Platform.项目地址https://gitcode.com/gh_mirrors/ku/kubevela点击查看免费下载KubeVela 的 Addon插件机制允许把一组关联的 OAM 定义、Kubernetes 资源与应用骨架打包成可一键安装、可升级、可依赖的交付单元。本文以仓库内置的示例插件pkg/addon/testdata/example-legacy及其 readme.md 为骨架逐文件拆解经典legacy插件的目录规范、元数据字段、参数暴露方式与组件渲染规则并结合pkg/addon的源码揭示底层渲染链路帮助读者掌握编写或迁移一个合规 KubeVela 插件所需的完整知识。一、example-legacy一个基于 FluxCD 的经典插件样例example-legacy是一个用于说明插件目录规范的测试样例其定位是基于 FluxCD 的示例插件见 readme.md。它演示的是一套经典的legacy插件打包方式目录内只包含template.yaml、metadata.yaml、definitions/与resources/这几类文件由 Addon 安装器把其中的定义与资源渲染进一个 KubeVela Application再通过该 Application 的工作流完成安装。该样例在仓库中的完整文件清单如下pkg/addon/testdata/example-legacy/ ├── Chart.yaml # Helm chart 元信息addon 以 helm library chart 形式打包 ├── metadata.yaml # 插件元数据 ├── template.yaml # 应用骨架Application ├── readme.md # 插件说明文档 └── definitions/ ├── helm.yaml # ComponentDefinitionX-Definition └── dummy.txt # 非 yaml/cue 文件会被读取逻辑忽略值得注意的是样例目录中并没有独立的resources/目录与parameter.cue但 readme 仍然完整描述了它们在标准插件中的角色——这两类文件属于可选能力缺省时插件依然可以安装。二、目录结构总览每个文件的职责readme 对插件目录结构做了如下划分readme.md文件/目录职责template.yaml插件的基础 Application 骨架可自行添加组件component与工作流workflow满足需求resources/与definitions/中的文件会被渲染为组件并追加到spec.componentsmetadata.yaml插件元数据信息definitions/X-Definition 的 yaml/cue 文件会被渲染为 KubeVela 组件Component写入template.yamlresources/parameter.cue暴露插件参数会被转换为 JSON Schema 并渲染为 UI 表单resources/其余文件渲染为 KubeVela 组件分为两类单资源 YAML渲染为raw组件与可读取parameter.XXX输入的 CUE 模板与parameter.cue联合渲染资源且可以在该格式中指定组件类型与 trait这套文件规范在源码中被定义为一组Pattern见 pkg/addon/addon.go合法的插件文件必须至少匹配README.md、metadata.yaml、template.yaml、resources/parameter.cue、resources/、definitions/、schemas/、views/、godef/、template.cue、parameter.cue、NOTES.cue、readme.md等模式之一其余文件在扫描阶段会被直接忽略。这也解释了definitions/dummy.txt存在的原因——它用于验证非 yaml/cue 后缀文件不参与渲染这一边界行为。三、template.yaml插件应用骨架与安装工作流样例的 template.yaml 定义了一个非常典型的基础 ApplicationapiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: example-legacy namespace: vela-system spec: workflow: steps: - name: apply-ns type: apply-component properties: component: ns-example-system - name: apply-resources type: apply-remaining components: - name: ns-example-system type: raw properties: apiVersion: v1 kind: Namespace metadata: name: example-system它演示了两个关键设计先决资源用工作流显式控制顺序apply-ns先执行apply-component创建名为example-system的 Namespace随后apply-resources通过apply-remaining把其余组件一并应用。这是插件安装时常见的先建命名空间、再装业务资源模式。骨架只负责最小能力readme 明确指出开发者可以在该模板基础上添加任意组件与工作流步骤以满足自身需求而definitions/与resources/中渲染出的组件会被自动追加到spec.components。从源码看template.yaml由readTemplate通过 Kubernetes 的 YAML 解码器直接解析为v1beta1.Applicationpkg/addon/addon.go最终渲染时generateAppFramework会强制把 Application 的 name 改写为addon-nameAddon2AppName、namespace 改写为vela-system并自动打上addon.oam.dev/name与addon.oam.dev/version标签pkg/addon/render.go。因此插件作者在模板中手写的metadata.name与metadata.namespace最终都会被覆盖仅作为可读性提示存在。四、metadata.yaml插件元数据字段逐一拆解样例的 metadata.yaml 展示了元数据文件的完整形态name: example-legacy version: 1.0.1 description: Extended workload to do continuous and progressive delivery icon: https://raw.githubusercontent.com/fluxcd/flux/master/docs/_files/weave-flux.png url: https://fluxcd.io tags: - extended_workload - gitops - only_example deployTo: control_plane: true runtime_cluster: false dependencies: [] #- name: addon_name # set invisible means this wont be list and will be enabled when depended on # for example, terraform-alibaba depends on terraform which is invisible, # when terraform-alibaba is enabled, terraform will be enabled automatically # default: false invisible: false对应到源码中的Meta结构体pkg/addon/type.go各字段的含义与行为如下字段类型说明namestring插件名称必填源码中标记了validate:required也是安装后 Application 命名的依据versionstring插件版本参与版本校验与升级判断descriptionstring一句话描述用于列表展示iconstring图标地址urlstring插件主页例如 FluxCD 官网tags[]string标签用于分类与检索样例打上了extended_workload、gitops、only_exampledeployToobject部署目标详见下文dependencies[]object依赖的其他插件nameversion安装时自动先装依赖invisiblebool是否隐藏。true时插件不出现在列表中仅在作为依赖被引用时自动启用如 terraform-alibaba 依赖隐藏的 terraform默认falsedeployTo对应源码中的DeployTo结构体pkg/addon/type.go包含三个字段control_plane是否部署到控制面集群对应DisableControlPlane的反义逻辑runtime_cluster是否部署到运行时集群对应RuntimeCluster这是新字段legacyRuntimeCluster兼容旧版的runtime_cluster字段对应LegacyRuntimeCluster。当插件声明需要部署到运行时集群、但template.yaml中又没有显式声明 topology 策略时渲染器会自动为 Application 追加拓扑策略未指定集群时生成deploy-addon-to-all-clusters策略空 labelSelector 表示部署到所有集群指定集群时生成deploy-addon-to-specified-clusters策略并自动补上本地集群见 pkg/addon/render.go 的attachPolicyForLegacyAddon。而checkNeedAttachTopologyPolicypkg/addon/render.go会在检测到冲突时打印告警提示删除deployTo字段以免与已有 topology 策略冲突。此外样例还提供了 Chart.yaml这是一个type: library的 Helm 库 chart通过annotations.addon.name声明所属插件并同步了name、version、description、icon、keywords等信息。这印证了插件在发布侧同时以 Helm 库包和目录两种形态存在的设计。五、definitions/X-Definition 如何变成组件definitions/目录存放 X-Definition 文件yaml 或 cue。样例中的 helm.yaml 是一个完整的ComponentDefinition其 CUE 模板会依据parameter.repoType的值动态生成三类 FluxCD 资源git生成GitRepository支持git.branch分支参数与secretRef认证oss生成Bucket支持bucketName、provider默认generic可选aws、regionhelm生成HelmRepository。同时在outputs.release中生成HelmRelease指向sourceRef引用的仓库/桶并支持targetNamespace、releaseName、values、pullInterval、timeout等参数status.healthPolicy用context.outputs.release.status.conditions判定资源健康状态workload.type声明为autodetects.core.oam.dev。整个模板通过parameter: {...}区块定义参数类型、默认值与// usage描述例如pullInterval: *5m | string表示默认 5 分钟拉取间隔version: ** | string表示 chart 版本默认取最新。从渲染链路看definitions/中的文件由readDefFile读取pkg/addon/addon.go.cue后缀进入CUEDefinitions.yaml/.yml后缀进入Definitions其他后缀直接跳过。安装时RenderDefinitions会把 YAML 定义直接解码为 unstructured 对象把 CUE 定义通过definition.FromCUEString编译成 X-Definition并将两者的 namespace 统一强制为vela-systempkg/addon/addon.go——插件安装的 X-Definition 只落在控制面集群。六、resources/参数暴露与两类组件渲染规则resources/目录是插件参数与运行时资源的集中地包含两种角色1. parameter.cue参数即 Schemaresources/parameter.cue以 CUE 文件形式声明插件的可配置参数。安装器读取该文件后会通过schema.ParsePropertiesToSchemapkg/schema/schema.go把它转换为 OpenAPI JSON Schema再进一步生成 UI Schema 用于 VelaUX 等控制台渲染表单见genAddonAPISchemapkg/addon/addon.go。这意味着插件参数的表单能力完全由这一个 CUE 文件驱动参数定义里写清楚类型、默认值与描述用户界面便自动生成对应输入控件。2. 其余文件两种组件渲染方式readResFilepkg/addon/addon.go在读取时会先跳过parameter.cue然后按扩展名分发.cue进入CUETemplates.yaml/.yml进入YAMLTemplates其余后缀忽略。YAML 文件单资源按 readme 的经典描述每个只含单个资源的 YAML 会被渲染为raw组件当前源码实现则会把目录下所有 YAML 资源统一打包进一个类型为k8s-objects、名为addon-name-resources的组件属性为{objects: [...]}见renderK8sObjectsComponentpkg/addon/render.go。这两种表述分别对应经典文档语义与当前实现读者在阅读旧文档与源码时需注意这一演进。CUE 模板文件可以读取用户在parameter.cue中定义的parameter.XXX输入。渲染时CUE 上下文会把参数 JSON 注入为parameter字段、把插件元数据注入为context.metadata再与parameter.cue联合编译见formatContextpkg/addon/render.go模板的output字段被解析为组件对象outputs字段中的对象则会作为辅助资源附加并打上addon.oam.dev/auxiliary标签。在这个格式里CUE 模板可以直接指定组件的type与trait——这正是 readme 强调的you can specify the type and trait in this format能力的来源。若组件未显式命名则默认以文件名为名去掉扩展名、点号转连字符见 pkg/addon/render.go。七、渲染链路从目录到最终 Application把上述规则串起来经典插件的完整渲染链路如下核心代码位于 pkg/addon/render.go 的RenderAppgenerateAppFramework加载template.yaml或 CUE 模板作为应用骨架强制改写 name/namespace 并打上 addon 标签renderNeededNamespaceAsComps根据needNamespace等元数据自动生成 Namespace 组件renderResourcespkg/addon/render.go把所有 YAML 资源打包为k8s-objects组件逐个渲染 CUE 模板组件带package main头或缺少output的模板会被跳过避免误渲染attachPolicyForLegacyAddon按deployTo与集群参数自动追加拓扑策略最终 Application 连同definitions/渲染出的 X-Definition、schemas/渲染出的 UI Schema ConfigMap、views/渲染出的 VelaQL 视图等一起提交安装参见RenderDefinitions、RenderConfigTemplates、RenderViewspkg/addon/addon.go。安装器Installer随后执行版本校验checkAddonVersionMeetRequired、依赖安装installDependency、资源分发dispatchAddonResource与工作流继续continueOrRestartWorkflow四步pkg/addon/addon.go。安装时传入的参数还会被序列化进vela-system命名空间下的 SecretRenderArgsSecret用于重启或升级时恢复用户配置pkg/addon/addon.go。八、从经典结构到新式结构演进与兼容example-legacy名称中的 legacy 暗示了它是被兼容保留的旧式结构。从Patterns列表pkg/addon/addon.go可以看到新式插件引入了几类经典结构没有的文件template.cue以 CUE 方式编写整个 Application 骨架与template.yaml二选一两者同时提供会报ErrBothCueAndYamlTmpl见 pkg/addon/render.go根目录parameter.cue全局参数文件优先级高于resources/parameter.cue两者同时存在时只采用全局参数并输出告警见GetUIDataFromReaderpkg/addon/addon.goNOTES.cue安装完成后输出给用户的提示信息schemas/、views/、godef/分别承载 UI Schema、VelaQL 视图与 Go 语言定义。同时readReadmepkg/addon/addon.go兼容README.md与readme.md两种大小写命名且只读取其中之一作为插件详情。这意味着沿用经典目录结构编写的旧插件仍然可以被正常发现、展示与安装为插件生态的渐进迁移提供了保障。结语通过example-legacy这份样例及其配套源码可以完整掌握 KubeVela 经典插件的打包规范template.yaml提供应用骨架与工作流metadata.yaml声明元数据与部署目标definitions/贡献 OAM 定义resources/暴露参数并渲染运行时组件。理解这套规则既能为存量插件做排查与迁移也能为编写符合规范的新插件打下坚实基础若需进一步验证渲染行为可参考 pkg/addon/render_test.go 与 pkg/addon/addon_test.go 中的测试用例或在本地通过vela addon enable命令对插件目录进行实装验证。赞分享云原生DevOps运维微服务【免费下载链接】kubevelaThe Modern Application Platform.项目地址https://gitcode.com/gh_mirrors/ku/kubevela点击查看免费下载相关推荐KubeVela 插件Addon开发实战目录结构、渲染规则与源码原理深度解析KubeVela 插件Addon开发实战目录结构、渲染规则与源码原理深度解析 导读 KubeVela 的 Addon插件体系是平台能力扩展的核心机制云原生DevOps运维微服务KubeVela Addon 目录结构与开发指南以 FluxCD 示例 Addon 为骨架深入解析KubeVela Addon 目录结构与开发指南以 FluxCD 示例 Addon 为骨架深入解析 Addon 是 KubeVela 中可插拔、可分发、可参数云原生DevOps运维微服务baoyu-article-illustrator 文章配图完整工作流从参考图采集到批量生成的六步实战指南baoyu article illustrator 文章配图完整工作流从参考图采集到批量生成的六步实战指南 本篇技术指南围绕 baoyu skills 仓库中AI 技能AI 插件上一篇UMAP参数调优终极指南从默认配置到定制化嵌入结果下一篇Android网络请求优化终极指南5个缓存重试开源库提升App性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表