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

资讯详情

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

Argo CD ApplicationSet 实战指南:用 ApplicationSet 控制器自动批量生成 Application

Argo CD ApplicationSet 实战指南:用 ApplicationSet 控制器自动批量生成 Application Argo CD ApplicationSet 实战指南用 ApplicationSet 控制器自动批量生成 Application【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd本文围绕 Argo CD 的 ApplicationSet 控制器ApplicationSet controller展开讲解它如何基于ApplicationSet自定义资源CR自动批量生成 Argo CDApplication覆盖 List/Cluster/Git/Matrix 等生成器的参数注入机制、模板渲染流程与多集群目标选择方案并补充源码级的生成、对账与安全边界说明。读完后你可以用单个清单文件管理面向多集群、多应用的 Application 集合并理解其背后的生成器接口与调和逻辑。1. ApplicationSet 控制器解决什么问题ApplicationSet 控制器是一个 Kubernetes 控制器为 Argo CD 引入ApplicationSetCRD自 Argo CD v2.3 起随 Argo CD 一同捆绑发布。它面向三类典型场景见 ApplicationSet 介绍文档用一份Kubernetes 清单同时把应用部署到多个Kubernetes 集群用一份清单从一个或多个 Git 仓库部署多个应用对 monorepo 尤其友好在 Argo CD 语境下monorepo 指单个 Git 仓库内定义多个 Application在多租户集群中让普通租户自助创建 Application无需集群管理员介入。最后一点也意味着安全边界问题官方安全文档明确指出只应授予管理员创建/更新/删除 ApplicationSet 的权限——因为 ApplicationSet 可以在任意 Project 下创建 Application包括权限很高的defaultproject可以高速创建/删除任意数量的 Application甚至在特定生成器如 Git generator 的api字段下泄露 Argo CD 命名空间内 Secret 的信息。因此若要让开发者通过 ApplicationSet 创建 Application必须先评估这些安全影响。2. 完整示例用 List 生成器将 guestbook 部署到三个集群下面是 用户指南中的 ApplicationSet 示例ApplicationSet基于 List 生成器把guestbook应用模板化为面向三个集群的三套部署目标。apiVersion: argoproj.io/v1alpha1 kind: ApplicationSet metadata: name: guestbook spec: goTemplate: true goTemplateOptions: [missingkeyerror] generators: - list: elements: - cluster: engineering-dev url: https://1.2.3.4 - cluster: engineering-prod url: https://2.4.6.8 - cluster: finance-preprod url: https://9.8.7.6 template: metadata: name: {{.cluster}}-guestbook spec: project: my-project source: repoURL: https://github.com/infra-team/cluster-deployments.git targetRevision: HEAD path: guestbook/{{.cluster}} destination: server: {{.url}} namespace: guestbook示例要点逐项说明字段作用goTemplate: true启用 Go Text Template 渲染引擎而非默认的 fasttemplate可使用 Go 模板函数goTemplateOptions: [missingkeyerror]推荐选项模板引用了不存在的参数时直接报错而不是静默渲染成空值出于向后兼容它不是默认行为generators.list.elementsList 生成器的参数源每个元素是一组键值对cluster与url两个字段会成为模板参数template待渲染的 Application 模板{{.cluster}}、{{.url}}在渲染时被替换为每个元素对应的值List 生成器把每个元素的url、cluster字段作为{{param}}风格的参数传入模板最终渲染出三个对应的 Argo CD Application每个集群一个。新增或移除目标集群只需修改这个ApplicationSet资源对应的 Application 会被自动创建或删除同理修改template中的任意字段也会自动应用到所有已生成的 Application 上。也就是说管理一组 Application 与管理单个 ApplicationSet 一样简单。渲染结果之一对应engineering-dev集群是一个完整的 ApplicationapiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: engineering-dev-guestbook spec: source: repoURL: https://github.com/infra-team/cluster-deployments.git targetRevision: HEAD path: guestbook/engineering-dev destination: server: https://1.2.3.4 namespace: guestbook在 Argo CD Web UI 中三个生成的 Application 会并列展示3. 参数替换与调和流程源码印证无论使用哪种生成器流程都是一致的生成器产出参数 → 参数替换进template中的{{parameter}}占位 → 每套参数渲染出一次模板 → 每个渲染结果转化为一个Application资源创建或更新→ Argo CD 应用控制器接管这些 Application见 IntroductionApplicationSet 控制器处理 generator 条目产出一组模板参数参数被逐套替换进模板每个渲染后的模板转化为 Argo CDApplication在 Argo CD 命名空间内创建或更新Argo CD 控制器随后被通知并负责这些 Application。3.1 生成器接口所有生成器的统一抽象从源码结构看applicationset/generators/interface.go每个生成器都实现统一的Generator接口只有三个方法GenerateParams(...)解释ApplicationSetGenerator配置产出参数列表[]map[string]any随后由控制器渲染并与集群中现有 Application 状态对账GetRequeueAfter(...)控制下一次调和循环的间隔多生成器时取最小值NoRequeueAfter表示不重入队。List 生成器是纯静态数据源直接返回NoRequeueAfter见 applicationset/generators/list.goGetTemplate(...)返回生成器条目内联的模板如有。3.2 List 生成器实现elements 如何变成参数applicationset/generators/list.go 的GenerateParams展示了参数生成的具体逻辑每个elements条目先被 JSON 反序列化为 map若goTemplate: true整个元素对象含嵌套结构直接作为参数传入模板因此模板中可以用{{.values.xxx}}这类嵌套路径若未启用 Go 模板则仅接受字符串值values子映射会被展开为values.key扁平键此外还支持elementsYaml字段以 YAML 字符串形式提供元素列表反序列化后追加到参数结果中适合不便直接内联elements的场景。3.3 对账主循环从生成到落盘调和入口在 applicationset/controllers/applicationset_controller.go 的Reconcile中可以看到核心链路若 ApplicationSet 正在被删除且同步策略不允许删除则移除生成 Application 上的 ownerReference 并走渐进式删除progressive sync 的 Reverse 删除序逻辑正常路径上template.GenerateApplications(...)调用所有注册生成器产出期望的 Application 集合desiredApplications再与集群现有状态对账对期望与实际 Application 的规格比较并非简单逐字节对比applicationset/utils/createOrUpdate.go 中的SpecsEquivalent先做NormalizeApplicationSpec规范化再应用ignoreDifferences规则后判断 spec 是否等价避免忽略项导致的“永远显示待变更”。这意味着ApplicationSet 的任何变更增删生成器元素、修改模板都会在后续调和中自动传导到对应 Application无需手动创建或更新 Application。4. 除 List 之外的生成器List 生成器只是最基础的起点。ApplicationSet 控制器内置了多种更强大的生成器完整清单见 Generators 文档共九种Cluster 生成器不手写集群列表而是直接使用 Argo CD 中已定义的集群清单作为参数源并在集群增删时自动响应Git 生成器基于 Git 仓库内的文件或目录结构生成参数——JSON 文件会被解析为模板参数目录路径本身也可作为参数值适合 monorepo 按目录部署Matrix 生成器把另外两个生成器产出的参数做组合笛卡尔积式交叉Merge 生成器合并两个或多个生成器的参数附加生成器可覆盖基础生成器的值SCM Provider 生成器通过 GitHub 等 SCM 提供方 API 自动发现组织/仓库下的仓库Pull Request 生成器通过 API 自动发现仓库中开放的 PR常用于预览环境Cluster Decision Resource 生成器对接自定义 CR用其内置逻辑决定部署到哪些 Argo CD 集群Plugin 生成器通过 RPC HTTP 请求获取参数。此外所有生成器都可以用 Post Selector 做结果过滤见 Post Selector。对于刚接触生成器的读者官方建议从List和Cluster两种入手再按需求引入其他生成器。5. 模板渲染细节与限制示例中goTemplate: true启用了 Go Text Template并带来几个实用点除标准 Go 文本模板函数外还提供 Sprig 函数库env、expandenv、getHostByName除外额外提供normalize函数把任意字符串转为合法 DNS 名非法字符替换为连字符并截断到 253 字符以及slugify函数支持最大长度、智能截断等可选参数对生成 Application 名称尤其有用限制Go 模板按字段per-field作用于字符串字段不能用于模板化布尔字段或对象字段——例如helm.useCredentials这类布尔值不能写成{{.useCredentials}}。关于goTemplateOptions当前唯一有用的选项就是missingkeyerror它让模板引用未定义参数时报错而非静默通过官方推荐设置示例中已启用。6. 在 Web UI 中管理 ApplicationSet除了直接操作 Kubernetes 资源ApplicationSet 也可以通过 Argo CD Web UI 管理包括创建、编辑与查看生成的 Application详见 在 Web UI 中管理 ApplicationSet。7. 小结ApplicationSet 控制器让“一份清单 → N 个 Application”成为可能是 Argo CD 多集群、monorepo 与多租户自助部署场景的核心机制生成器负责产出参数template负责消费参数List 生成器演示了最直观的参数注入方式Cluster/Git/Matrix/Merge/SCM Provider/Pull Request/CDR/Plugin 等生成器覆盖更动态的场景从源码看Generator接口统一了参数产出、重入队与模板来源三个职责Reconcile主循环负责将期望 Application 集合与集群实际状态对账SpecsEquivalent等工具函数保证比较前先规范化并应用ignoreDifferences确保变更可靠传导安全上务必遵循 Security 文档仅管理员可操作 ApplicationSet且project字段若被模板化管理员必须控制所有生成器的数据来源。深入阅读入口ApplicationSet 概述、生成器总览、Go 模板、安全说明。【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表