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 是“最终产品”。
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 的权限范围。