大家好!今天,我们将详细探讨 ArgoCD ApplicationSet 及其核心 Generator,它们在 Kubernetes 环境中极大地简化了多集群和多应用的管理。
它不仅仅是部署单个应用程序,更是解决“如果集群有100个怎么办?”或“如果预发布和生产环境不同怎么办?”等问题的终极工具。

1. 什么是 ApplicationSet? 🤔
ArgoCD 的基本单元 Application 资源连接一个源(Git)和一个目标(Cluster)。然而,随着需要管理的服务数量增加,Application YAML 文件也会呈指数级增长。
ApplicationSet 就像一个“鲷鱼烧模具”。它通过一个名为 Generator 的引擎动态生成多个 Application。
2. Generator 类型详细分析 🔍
Generator 决定了“基于什么数据来创建 Application?”我们将重点介绍四种最常用的类型。
① List Generator: 最直观的开始 📋
以最简单的形式,直接在 YAML 中明确指定要生成的列表。
- 用途: 当管理对象数量少且明确时。
- 优点: 直观且易于配置。
📝 代码示例及说明
YAML
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: my-apps
namespace: argocd
spec:
generators:
- list:
# 将要生成的元素定义为列表。
elements:
- cluster: engineering-dev
url: https://kubernetes.default.svc # 本地集群
- cluster: engineering-prod
url: https://1.2.3.4 # 远程集群
template:
metadata:
# 动态使用上面 elements 中定义的 {{cluster}} 变量。
name: '{{cluster}}-guestbook'
spec:
project: default
source:
repoURL: https://github.com/argoproj/argocd-example-apps.git
targetRevision: HEAD
path: guestbook
destination:
server: '{{url}}' # {{url}} 变量将在此处替换。
namespace: guestbook
② Cluster Generator: 多集群管理的核心 ☸️
它自动读取在 ArgoCD 中注册的集群信息并部署应用程序。
- 用途: 当您希望在每次添加集群时自动部署应用程序时。
- 特点: 可以通过标签选择器(labelSelector)筛选出特定的集群。
📝 代码示例及说明
YAML
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: cluster-scoped-app
spec:
generators:
- clusters:
# 仅针对 ArgoCD 中带有 'env: staging' 标签的集群。
selector:
matchLabels:
env: staging
template:
metadata:
# {{name}} 将自动映射到 ArgoCD 中注册的集群名称。
name: '{{name}}-monitoring'
spec:
project: default
source:
repoURL: https://github.com/my-repo/monitoring.git
targetRevision: main
path: charts/prometheus
destination:
# {{server}} 将替换为集群的 API 服务器地址。
server: '{{server}}'
namespace: monitoring
③ Git Generator: Git 仓库结构即配置 📂
它通过检测 Git 仓库中的文件内容或目录结构来生成应用程序。
- 用途: 当通过文件夹结构管理应用程序时,例如 apps/app-a, apps/app-b。
- 类型:
- Directory: 探索特定路径下的子目录。
- File: 读取 JSON/YAML 文件内容并用作变量。
📝 代码示例(基于目录)
YAML
spec:
generators:
- git:
repoURL: https://github.com/my-org/infra.git
revision: HEAD
# 查找 'services/*' 路径下的所有目录。
directories:
- path: services/*
template:
metadata:
# 目录名(例如:auth-service)将成为应用程序名。
name: '{{path.basename}}'
spec:
source:
repoURL: https://github.com/my-org/infra.git
targetRevision: HEAD
path: '{{path}}' # 使用 Git 中的实际路径。
destination:
server: https://kubernetes.default.svc
namespace: '{{path.basename}}'
④ Matrix Generator: 终极组合 🧬
组合(乘法)两个或多个 Generator。例如,当您想将
“所有应用程序 (Git Gen)”
部署到
“所有集群 (Cluster Gen)”
时使用。
- 工作方式: 如果有列表 A [1, 2] 和列表 B [a, b],结果将是 [1-a, 1-b, 2-a, 2-b]。
📝 代码示例(集群 x Git 组合)
YAML
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: matrix-deploy
spec:
generators:
- matrix:
generators:
# 1. 选择目标集群(开发、生产)
- clusters:
selector:
matchLabels:
tier: backend
# 2. 要部署的应用程序列表(基于 Git 文件)
- git:
repoURL: https://github.com/my-repo/configs.git
revision: HEAD
files:
- path: "config/**/config.json"
template:
metadata:
# 结果:生成 'dev-cluster-api-server', 'prod-cluster-api-server' 等
name: '{{name}}-{{customer}}'
spec:
project: default
source:
repoURL: https://github.com/my-repo/apps.git
targetRevision: HEAD
path: app-chart
helm:
# JSON 文件中定义的参数可以作为 Helm 值传递!
parameters:
- name: "customerName"
value: "{{customer}}"
destination:
server: '{{server}}'
namespace: '{{customer}}'
⑤ Merge Generator: 条件覆盖 🔗
与 Matrix 类似,但它基于相同的键合并数据。当您只想在特定环境中稍微更改设置时非常有用。
3. 实战技巧:何时使用哪种 Generator?💡
| 情况 | 推荐 Generator |
| — | — |
| 刚开始使用 ArgoCD 且不喜欢手动管理 | List |
| 集群持续增加的多集群环境 | Clusters |
| 单个 Git 仓库中有多个微服务代码 | Git (Directory) |
| 需要为每个客户(SaaS)部署到不同的集群 | Matrix |
—
4. 注意事项和最佳实践 ⚠️
- 利用 Dry-run: 在部署 ApplicationSet 之前,请检查 argocd-appset-controller 日志,或者先进行小规模测试。否则,可能会同时创建数百个错误的应用程序。
- 命名空间管理: 尽管 ApplicationSet 本身应位于 argocd 命名空间中,但请确保生成的 Application 的目标命名空间得到适当分离。
- 保留资源: 删除 ApplicationSet 时,可以通过策略设置决定是否同时删除实际部署的资源(Pod、Service 等)。在生产环境中应谨慎操作。
5. 总结 🏁
ApplicationSet 不仅仅是减少重复性工作,它更是实现
基础设施即代码 (Infrastructure as Code)
完美控制的核心工具。虽然 Matrix Generator 的复杂性初次接触可能有些陌生,但一旦构建完成,运营效率将提升数十倍。
哪种 Generator 适合您的环境?现在就尝试一下吧!🛠️
发表回复