3. ArgoCD ApplicationSet 概述

ApplicationSet 控制器是 ArgoCD 生态中用于实现“模板化多集群/多环境部署”的核心组件。它通过 Generators(生成器) 动态生成多个 ArgoCD Application 资源,从而将 GitOps 从单应用管理扩展到大规模、多租户、多集群的场景。在《AppSet 准入策略覆盖 GitOps 高风险变更》课程中,理解 ApplicationSet 的工作原理是制定准入策略的前提。

3.1 ApplicationSet 控制器的作用

ApplicationSet 控制器的主要职责是:监听一个 ApplicationSet 自定义资源(CR),根据其定义的模板和生成器,自动创建、更新或删除一组 ArgoCD Application 资源。它解决了以下核心问题:

  • 消除重复配置:无需为每个集群或环境手动编写几乎相同的 Application YAML。
  • 动态扩缩:当生成器(如 Git 分支、集群列表)发生变化时,控制器自动调整 Application 实例。
  • 策略执行点:ApplicationSet 本身可以作为准入控制的边界,通过模板注入通用标签、注解或同步策略。
  • 多集群一致性:确保所有目标集群上的应用配置基于同一套模板和参数。
关键概念: ApplicationSet 是一个“应用的工厂”,Generators 是“原料输入”,Template 是“产品模具”,而生成的 Application 是“最终产品”。
ApplicationSet 控制器工作流程 ApplicationSet 控制器工作流程 ApplicationSet CR Generators Template Application 实例 控制器监听 ApplicationSet CR,Generators 提供参数集合,Template 渲染出多个 Application 资源

3.2 Generators 类型介绍

Generators 是 ApplicationSet 的核心扩展点。不同的 Generator 决定了 Application 实例的“数量”和“参数”。以下是生产环境中常用的几种 Generator 类型:

Generator 类型 数据来源 典型场景 变更触发条件
List YAML 内联列表 少量固定环境(dev/staging/prod) 手动编辑 ApplicationSet YAML
Git Git 仓库目录/文件 基于 Git 分支或目录结构生成应用 Git 仓库内容变更(分支/标签/文件)
Cluster ArgoCD 管理的集群列表 多集群部署(每个集群一个实例) ArgoCD 集群 Secret 变更
SCM Provider GitHub/GitLab/Bitbucket 组织 自动发现仓库,为每个仓库创建应用 组织内仓库创建/删除
Matrix 组合两个 Generator 输出 多集群 × 多环境组合 任一子 Generator 变更
Pull Request Git 仓库的 PR/MR 预览环境(Review Apps) PR 创建/更新/关闭

3.3 核心 Generator 详解

3.3.1 List Generator

最基础的 Generator,直接在 ApplicationSet 定义中硬编码参数列表。适用于环境数量少且固定的场景。

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook
spec:
  generators:
  - list:
      elements:
        - cluster: engineering-dev
          url: https://kubernetes.default.svc
        - cluster: engineering-staging
          url: https://staging.example.com
  template:
    metadata:
      name: '{{cluster}}-guestbook'
    spec:
      project: default
      source:
        repoURL: https://git.example.com/guestbook.git
        targetRevision: HEAD
        path: guestbook
      destination:
        server: '{{url}}'
        namespace: guestbook

3.3.2 Git Generator

根据 Git 仓库中的目录结构或文件内容动态生成参数。有两种模式:

  • 目录模式(Directories):遍历仓库中的子目录,每个子目录生成一个 Application。
  • 文件模式(Files):读取仓库中指定路径的 JSON/YAML 文件内容作为参数。
准入策略关注点: Git Generator 允许通过 Git 提交直接控制 Application 的创建和参数。在准入策略中,需要审计 Git 仓库的目录结构变更和文件内容变更,防止通过新增目录或修改参数文件绕过审批。

3.3.3 Cluster Generator

自动查询 ArgoCD 中注册的所有集群(通过 argocd cluster add 或带有特定标签的 Secret),为每个集群生成一个 Application 实例。可以通过 selector 字段按标签过滤集群。

spec:
  generators:
  - clusters:
      selector:
        matchLabels:
          environment: production
  template:
    metadata:
      name: '{{name}}-app'  # {{name}} 来自集群 Secret 的 name 字段
    spec:
      source:
        repoURL: https://git.example.com/app.git
        targetRevision: HEAD
        path: '{{name}}'

3.3.4 SCM Provider Generator

自动发现指定 Git 组织(如 GitHub 组织)下的所有仓库,并为每个仓库生成 Application。它通过 API 与 Git 平台交互,支持按仓库名称或标签过滤。

高风险变更: SCM Provider Generator 的权限极高。一旦 ApplicationSet 被创建,它会在组织内自动为新仓库创建 ArgoCD Application。准入策略必须严格限制谁可以创建或修改使用 SCM Provider Generator 的 ApplicationSet,并审计其 API 的权限范围。
四种主要 Generator 数据流对比 四种主要 Generator 数据流对比 List Generator 内联 YAML 列表 → 固定数量 Application Git Generator Git 仓库目录/文件 → 动态数量 Application Cluster Generator ArgoCD 集群列表 → 每集群一个 Application SCM Provider Git 组织仓库列表 → 每仓库一个 Application Generator 选择对准入策略的影响 • List Generator:变更必须修改 ApplicationSet YAML,准入策略可直接审计该 CR 的变更。 • Git Generator:变更通过 Git 提交触发,准入策略需要审计 Git 仓库的目录/文件变更。 • Cluster Generator:变更通过集群 Secret 触发,准入策略需要审计 Secret 的创建和标签变更。 • SCM Provider Generator:变更通过 Git 平台 API 触发,准入策略需要审计 API 和仓库创建事件。

3.4 本章小结