4、ApplicationSet 生成器详解(一):List 生成器、Cluster 生成器、Git 生成器
ApplicationSet 的核心价值在于通过 生成器(Generators) 动态创建多个 ArgoCD Application。生成器决定了 ApplicationSet 的“输入参数”,每个参数组合会生成一个独立的 Application。本章深入剖析三种最基础的生成器:List 生成器、Cluster 生成器 和 Git 生成器,它们是构建多环境、多集群发布流水线的基石。
4.1 生成器工作模型总览
所有生成器遵循统一的输出模型:生成一组 key:value 参数,ApplicationSet 模板中的 {{key}} 占位符会被替换为实际值。下图展示了生成器与 ApplicationSet 模板的协作关系:
4.2 List 生成器:静态参数定义
List 生成器是最简单、最直接的生成器。它通过 YAML 列表直接定义一组静态参数,适合用于环境数量固定、集群信息已知的场景。
4.2.1 基本语法
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: myapp-list
spec:
generators:
- list:
elements:
- name: dev
namespace: dev-ns
cluster: https://kubernetes.default.svc
- name: prod
namespace: prod-ns
cluster: https://prod-cluster.example.com
template:
metadata:
name: '{{name}}-app'
spec:
project: default
source:
repoURL: https://git.example.com/myapp.git
targetRevision: HEAD
path: '{{name}}'
destination:
server: '{{cluster}}'
namespace: '{{namespace}}'
4.2.2 参数引用规则
| 参数来源 | 引用方式 | 示例值 |
|---|---|---|
| elements 中的 key | {{key}} |
{{name}} → dev |
| 嵌套字段 | {{parent.child}} |
{{cluster.name}} |
特殊变量 elements |
{{elements}} |
返回整个元素对象 |
- 开发/测试/预发/生产环境固定为 4 套,且集群地址不变。
- 需要为每个环境指定不同的 Helm values 文件路径。
- 快速原型验证,不想引入外部数据源。
4.3 Cluster 生成器:动态集群发现
Cluster 生成器自动从 ArgoCD 管理的集群列表中读取信息,为每个注册的集群生成一个 Application。它消除了手动维护集群列表的负担,特别适合多集群联邦场景。
4.3.1 工作原理
ArgoCD 内部维护一个集群 Secret 列表(存储在 argocd 命名空间中)。Cluster 生成器会查询这些 Secret,并将每个 Secret 中的 name、server、labels、annotations 等字段暴露为模板参数。
spec:
generators:
- clusters: {} # 选择所有集群
template:
metadata:
name: '{{name}}-app'
spec:
source:
repoURL: https://git.example.com/myapp.git
path: '{{name}}'
destination:
server: '{{server}}'
namespace: default
4.3.2 集群选择器
通过 selector 字段可以按标签过滤集群,实现精细化控制:
spec:
generators:
- clusters:
selector:
matchLabels:
environment: production
region: us-east-1
template:
# ... 模板内容
4.3.3 可用参数
| 参数名 | 来源 | 说明 |
|---|---|---|
{{name}} |
Secret 名称 | 集群在 ArgoCD 中的显示名称 |
{{server}} |
Secret 数据 | 集群 API Server 地址 |
{{labels.key}} |
Secret 标签 | 自定义标签值 |
{{annotations.key}} |
Secret 注解 | 自定义注解值 |
https://kubernetes.default.svc)。如果不需要在本地集群部署,请通过 selector 或 exclude 字段显式过滤。
4.4 Git 生成器:仓库驱动参数
Git 生成器从 Git 仓库的目录结构或文件内容中提取参数,实现“代码即配置”的声明式管理。它有两种工作模式:目录模式 和 文件模式。
4.4.1 目录模式(Directory)
扫描仓库中指定路径下的子目录,每个子目录生成一个 Application。子目录名称作为 {{path.basename}} 参数。
spec:
generators:
- git:
repoURL: https://git.example.com/myapp.git
revision: HEAD
directories:
- path: 'environments/*'
template:
metadata:
name: '{{path.basename}}-app'
spec:
source:
repoURL: https://git.example.com/myapp.git
path: '{{path}}'
destination:
server: https://kubernetes.default.svc
namespace: '{{path.basename}}'
假设仓库结构如下:
environments/
├── dev/
│ └── deployment.yaml
├── staging/
│ └── deployment.yaml
└── prod/
└── deployment.yaml
生成器会创建 3 个 Application,分别对应 dev、staging、prod 目录。
4.4.2 文件模式(File)
读取仓库中指定路径下的 JSON 或 YAML 文件,将文件内容解析为参数。每个文件生成一个 Application。
spec:
generators:
- git:
repoURL: https://git.example.com/myapp.git
revision: HEAD
files:
- path: 'config/*.json'
template:
metadata:
name: '{{appName}}-app'
spec:
source:
repoURL: https://git.example.com/myapp.git
path: '{{sourcePath}}'
destination:
server: '{{clusterServer}}'
namespace: '{{namespace}}'
假设 config/dev.json 内容:
{
"appName": "myapp-dev",
"sourcePath": "overlays/dev",
"clusterServer": "https://dev-cluster.example.com",
"namespace": "dev"
}
生成器会将 JSON 中的每个字段暴露为模板参数。
4.4.3 两种模式对比
| 维度 | 目录模式 | 文件模式 |
|---|---|---|
| 参数来源 | 目录名称 | 文件内容(JSON/YAML) |
| 灵活性 | 低,仅能获取路径信息 | 高,可定义任意参数 |
| 适用场景 | 环境结构统一,仅环境名不同 | 每个环境有独立配置参数 |
| 文件变更影响 | 新增/删除目录触发 | 修改文件内容触发 |
4.5 三种生成器对比总结
| 特性 | List 生成器 | Cluster 生成器 | Git 生成器 |
|---|---|---|---|
| 数据源 | YAML 静态列表 | ArgoCD 集群 Secret | Git 仓库目录/文件 |
| 动态性 | 静态,需手动修改 | 自动发现集群变化 | 自动响应仓库变更 |
| 参数丰富度 | 自定义 key-value | 集群元数据 + 标签 | 目录名或文件内容 |
| 典型场景 | 固定环境列表 | 多集群联邦部署 | GitOps 仓库驱动 |
| 学习成本 | 低 | 中 | 中高 |
- 团队刚接触 AppSet,环境数量少且固定 → List 生成器
- 管理 10+ 集群,需要自动感知集群加入/退出 → Cluster 生成器
- 希望完全通过 Git 仓库驱动发布,实现“PR 即部署” → Git 生成器