4、ApplicationSet 生成器详解(一):List 生成器、Cluster 生成器、Git 生成器

ApplicationSet 的核心价值在于通过 生成器(Generators) 动态创建多个 ArgoCD Application。生成器决定了 ApplicationSet 的“输入参数”,每个参数组合会生成一个独立的 Application。本章深入剖析三种最基础的生成器:List 生成器、Cluster 生成器 和 Git 生成器,它们是构建多环境、多集群发布流水线的基石。

4.1 生成器工作模型总览

所有生成器遵循统一的输出模型:生成一组 key:value 参数,ApplicationSet 模板中的 {{key}} 占位符会被替换为实际值。下图展示了生成器与 ApplicationSet 模板的协作关系:

ApplicationSet 生成器工作模型 List 生成器 静态参数列表 Cluster 生成器 ArgoCD 集群列表 Git 生成器 仓库目录/文件 参数集 [{name: dev, env: dev}, {name: prod, env: prod}] [{cluster: prod-cluster}, {cluster: staging-cluster}] [{path: ./dev, env: dev}, {path: ./prod, env: prod}] 模板 name: {{name}} dest: {{cluster}} path: {{path}} env: {{env}} ...
核心原则:生成器只负责“生成参数”,不关心 Application 的具体内容。同一个模板可以搭配不同生成器,实现从静态列表到动态发现的灵活切换。

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 注解 自定义注解值
注意:Cluster 生成器不会自动排除本地集群(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 生成器