拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Argo CD ApplicationSet 生成器(Generators)详解:参数生成、模板渲染与十大生成器实践

Argo CD ApplicationSet 生成器Generators详解参数生成、模板渲染与十大生成器实践【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cdArgo CD ApplicationSet 控制器通过一组“生成器Generators”从不同数据源产出模板参数再将这些参数渲染进 ApplicationSet 的template:字段最终批量创建出 Argo CD Application 资源。本文基于官方文档 ApplicationSet Generators 的核心脉络展开并结合当前仓库中的生成器接口、类型定义与控制器处理流程源码帮助读者理解每个生成器的定位、组合方式Matrix/Merge、公共后过滤Post Selector以及落地时的关键注意事项掌握从“声明一个 ApplicationSet”到“批量管理多集群/多应用”的完整技术链路。一、Generators 的职责从数据源到模板参数ApplicationSet 的核心思想是用一个 Kubernetes 清单管理多个 Argo CD Application。生成器在其中承担的职责可以概括为每个生成器基于一种特定的数据源工作List 生成器来自一份字面量列表literal listCluster 生成器来自 Argo CD 自身管理的集群列表Git 生成器来自 Git 仓库中的文件或目录结构SCM Provider 生成器来自 SCM 平台如 GitHubAPI 等生成器输出的是参数parameters即一组键值对这些参数会被替换进 ApplicationSet 资源template:字段中的{{parameter name}}占位符每一组参数渲染出一份完整的 Argo CDApplication资源由 ApplicationSet 控制器创建或更新到集群中之后交由 Argo CD 应用控制器管理。也就是说选择哪种生成器本质上就是回答一个问题“我要根据什么数据源来决定生成哪些 Application”官方建议在初学阶段从List与Cluster两个生成器入手更复杂的场景再使用其余生成器。1.1 一次完整的渲染流程以 ApplicationSet 入门文档 中的 guestbook 示例为参照参数替换后的执行流程为ApplicationSet 控制器处理generators:中的每一项产出参数集合对每一组参数将其替换进模板得到一份渲染后的清单每份渲染结果被转换为一个 Argo CDApplication资源在 Argo CD 命名空间中创建或更新Argo CD 应用控制器感知到这些 Application负责后续的同步与调和。例如一个含 3 个集群的 List 生成器最终会产生 3 个 Application 资源分别对应 3 个目标集群。后续对 ApplicationSet 的任何修改增删列表项、修改模板都会自动作用到由它派生的全部 Application 上。二、当前仓库中的生成器全景原文档列出十个生成器它们与 ApplicationSetGenerator 类型定义 中的字段一一对应这也从 CRD 层面证实了每个生成器的 spec 字段名生成器spec 字段数据源 / 用途详细文档实现文件Listlist固定的一组任意键值对列表Generators-Listlist.goClusterclustersArgo CD 内部已定义并管理的集群列表可自动响应集群增删事件Generators-Clustercluster.goGitgitGit 仓库中的文件内容或目录结构Generators-Gitgit.goMatrixmatrix将两个独立生成器产出的参数组合笛卡尔积Generators-Matrixmatrix.goMergemerge合并两个或更多生成器的参数靠后的生成器可覆盖基础生成器的同名值Generators-Mergemerge.goSCM ProviderscmProvider通过 SCM 平台 API如 GitHub自动发现组织内的仓库Generators-SCM-Providerscm_provider.goPull RequestpullRequest通过 SCMaaS 平台 API 自动发现仓库中打开的 Pull RequestGenerators-Pull-Requestpull_request.goCluster Decision ResourceclusterDecisionResource与 Kubernetes 自定义资源交互由该自定义资源的专属逻辑决定部署到哪些集群Generators-Cluster-Decision-Resourceduck_type.goPluginplugin通过 RPC/HTTP 请求外部插件服务获取参数Generators-Pluginplugin.goOCIoci类似 Git 生成器基于 OCI artifact 中的文件或其目录结构创建 ApplicationGenerators-OCIoci.go说明原文档开头写有 “there are nine generators”但实际列举了 10 项——OCI 生成器是后来加入的文档表述略有滞后。以 ApplicationSetGenerator 结构体为准当前仓库支持的顶层生成器即为上表 10 种。除生成器外ApplicationSetGenerator结构体中还带有一个selector字段metav1.LabelSelector类型用于对任意生成器的输出做后过滤即下文第四节的 Post Selector。三、生成器在控制器中的实现Generator 接口与 Transform 流程3.1 Generator 接口所有生成器都实现同一个接口定义于 interface.go// Generator defines the interface implemented by all ApplicationSet generators. type Generator interface { // GenerateParams 解释 ApplicationSet 并生成模板所需的全部参数 GenerateParams(appSetGenerator *argoprojiov1alpha1.ApplicationSetGenerator, applicationSetInfo *argoprojiov1alpha1.ApplicationSet, client client.Client) ([]map[string]any, error) // GetRequeueAfter 让生成器控制下一次调和循环 // 存在多个生成器时取各生成器时间的最小值 GetRequeueAfter(appSetGenerator *argoprojiov1alpha1.ApplicationSetGenerator) time.Duration // GetTemplate 返回该生成器内联的 template若存在否则返回空对象 GetTemplate(appSetGenerator *argoprojiov1alpha1.ApplicationSetGenerator) *argoprojiov1alpha1.ApplicationSetTemplate }从源码结构可以读出三个设计要点GenerateParams是统一入口每个生成器把自身 spec 翻译为[]map[string]any一组参数集每组参数最终渲染一个 ApplicationGetRequeueAfter让生成器自定轮询节奏例如 SCM Provider、Git 这类依赖外部 API 的生成器可以返回自己的重新入队时间多个生成器并存时控制器取最小值。接口文件还定义了默认值DefaultRequeueAfter 3 * time.Minute并可通过环境变量ARGOCD_APPLICATIONSET_CONTROLLER_REQUEUE_AFTER覆盖下限 1 秒、上限 8760 小时GetTemplate支持生成器级模板覆盖Matrix、Merge、List 等生成器均可携带自己的template字段用于覆盖或合并进ApplicationSet 顶层模板。3.2 从 spec 到参数集Transform 处理链生成器不是被孤立调用的。generator_spec_processor.go 中的Transform函数揭示了单个生成器从声明到产出的完整处理链解析 selector调用utils.LabelSelectorAsSelector解析该生成器上的selector。源码注释特别说明这是从 k8s.io/apimachinery 复制的定制版本取消了标签值的长度/格式限制因此可以用它来匹配集群 URL 这类非标准标签值找到对应实现GetRelevantGenerators通过反射遍历ApplicationSetGenerator结构体的各个字段哪个字段非 nil 就取出allGenerators中同名的实现generator_spec_processor.go#L104-L120。这也解释了为什么 CRD 字段名list、git、clusters…必须与注册表键名严格一致先合并模板再取参数mergeGeneratorTemplate先执行——注释解释这样做的目的是 fail fast因为GenerateParams往往要访问 Git/SCM API成本更高参数插值若该生成器处于嵌套位置且上游已产出genParams会先用InterpolateGenerator把上游参数渲染进本生成器自身的 spec这正是 Matrix 组合能成立的前提见 3.3 节生成参数 → 扁平化 → selector 过滤g.GenerateParams的返回结果经flattenParameters压平后逐组检查是否命中selector命中的才进入最终参数集错误处理单个生成器失败时记录错误并continue只保留第一个错误firstError返回其余生成器继续尝试——即部分生成器故障不会让整个 ApplicationSet 静默丢失参数但会在状态中暴露第一个错误。3.3 组合型生成器与嵌套深度限制Matrix 与 Merge 属于“组合型生成器”其内部嵌套的生成器由另外两个类型描述applicationset_types.go#L215-L260ApplicationSetNestedGenerator可嵌套在 Matrix/Merge 之下的生成器集合允许继续嵌套 Matrix/MergeApplicationSetTerminalGenerator位于嵌套最底层例如 merge 中的 matrix 中的 list的生成器不允许再是组合型生成器。源码注释给出了原因“ApplicationSet enforces this nesting depth limit because CRDs do not support recursive types”——Kubernetes CRD 不支持递归类型定义因此把嵌套深度硬编码为三层顶层 → 嵌套层 → 终止层。值得注意的是嵌套层的 Matrix/Merge 并非直接的强类型字段而是以通用的apiextensionsv1.JSON承载在运行时经ToNestedMatrixGenerator等函数反序列化为具体结构这是一个理解 ApplicationSet CRD 生成细节的关键点。两个组合生成器的语义差异Matrix对两个嵌套生成器的参数做笛卡尔积组合每个组合渲染一个 ApplicationMerge按mergeKeys对齐两组参数键值相等时合并参数集后者生成器的同名值覆盖前者合并键在基础生成器参数中不存在的参数集会被忽略。Merge 支持模板覆盖当 Merge 是多个顶层生成器之一时其 template 会先与顶层生成器合并再应用到参数上。四、Post Selector所有生成器通用的后过滤原文档明确指出所有生成器都可以用 Post Selector 进行过滤Generators-Post-Selector。在实现上selector直接挂在ApplicationSetGenerator/ApplicationSetNestedGenerator/ApplicationSetTerminalGenerator三种结构体上即任意层级的生成器都能声明自己的selector。过滤发生在参数生成之后参数先被扁平化为labels.Set再与 selector 做匹配generator_spec_processor.go#L89-L93。典型用法例如在 Git 目录生成器上过滤出“只属于某个团队”的目录或在 Cluster 生成器上只保留带特定标签的集群从而在不改动上游数据源的情况下精确控制最终生成哪些 Application。五、实战示例List 生成器与动态元素5.1 基础用法字面量列表Generators-List 文档 给出的示例完整示例见仓库 applicationset/examples/list-generatorapiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: guestbook namespace: argocd spec: goTemplate: true goTemplateOptions: [missingkeyerror] generators: - list: elements: - cluster: engineering-dev url: https://kubernetes.default.svc # - cluster: engineering-prod # url: https://kubernetes.default.svc template: metadata: name: {{.cluster}}-guestbook spec: project: my-project source: repoURL: https://github.com/argoproj/argo-cd.git targetRevision: HEAD path: applicationset/examples/list-generator/guestbook/{{.cluster}} destination: server: {{.url}} namespace: guestbook要点List 生成器把每个 element 的所有键值对url、cluster等作为参数传入模板。若取消注释第二个 elementApplicationSet 控制器会自动为新增环境生成对应 Application对应类型 ListGenerator 的Elements是[]apiextensionsv1.JSON即任意 JSON 对象都可以作为 element——这与“v0.2.0 起支持任意键值对”的文档描述一致早期v0.1.0仅要求cluster/url键现已完全向后兼容spec: generators: - list: elements: # v0.1.0 形式 —— 要求 cluster/url 键 - cluster: engineering-dev url: https://kubernetes.default.svc values: additional: value # v0.2.0 形式 —— 不要求 cluster/url 键但仍支持 - staging: true gitRepo: https://kubernetes.default.svc重要前提element 中引用的集群必须已经预先定义在 Argo CD 中。ApplicationSet 控制器不会、也没有凭据去在 Argo CD 中创建集群Generators-List 文档 中的 NOTE 明确指出这一点。5.2 进阶用法elementsYaml 动态生成元素List 生成器的elementsYaml字段对应 ListGenerator.ElementsYaml允许元素列表本身来自上游生成器。典型组合是Matrix(Git, List)Git 生成器读出仓库中一个 YAML 文件的内容List 生成器把该内容解析为元素列表spec: goTemplate: true goTemplateOptions: [missingkeyerror] generators: - matrix: generators: - git: repoURL: https://github.com/argoproj/argo-cd.git revision: HEAD files: - path: applicationset/examples/list-generator/list-elementsYaml-example.yaml - list: elementsYaml: {{ .key.components | toJson }} template: metadata: name: {{.name}} spec: project: default syncPolicy: automated: selfHeal: true syncOptions: - CreateNamespacetrue sources: - chart: {{.chart}} repoURL: {{.repoUrl}} targetRevision: {{.version}} helm: releaseName: {{.releaseName}} destination: server: https://kubernetes.default.svc namespace: {{.namespace}}被读取的 list-elementsYaml-example.yaml 内容为一组组件定义name、chart、version、releaseName、repoUrl、namespaceMatrix 将 Git 参数整个文件内容与 List 解析出的每个组件组合最终每个组件渲染出一个 Helm 应用。这个例子集中体现了 Matrix 参数插值机制3.2 节第 4 步的实际价值一份 Git 里的清单文件即可驱动一组 Helm Application 的批量生成。六、选型建议与落地清单结合原文档与仓库实现落地 ApplicationSet 生成器时可遵循以下清单入门路径先用 List 生成器跑通“固定参数 → 模板渲染 → Application 创建”的闭环再切换到 Cluster 生成器享受“集群加入/离开 Argo CD 时自动增减 Application”的能力Cluster 生成器依赖 Argo CD 集群清单见 Generators-Cluster数据在 Git 里就用 Git 生成器按文件内容JSON 解析为参数或目录结构目录路径即参数值两种方式monorepo 场景优先考虑需要组合时两两组合用 Matrix多源按键合并/覆盖用 Merge注意嵌套最多三层终止层生成器不能再是 Matrix/Merge精细化裁剪任何层级生成器都可以加selector做后过滤注意轮询行为依赖外部 API 的生成器会按各自GetRequeueAfter控制节奏全局默认重新入队间隔为 3 分钟可用ARGOCD_APPLICATIONSET_CONTROLLER_REQUEUE_AFTER调整安全前提ApplicationSet 直接创建集群中的 Application 资源权限面较大启用前建议阅读 Security 文档 了解其安全影响。七、延伸阅读生成器总览本文对应原文档Generators.mdApplicationSet 控制器入门参数渲染完整流程index.md模板与 GoTemplate 语法GoTemplate.md、Template.md生成器实现代码目录applicationset/generators各生成器示例清单applicationset/examples【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门