ArgoCD ApplicationSet多集群动态交付架构
ArgoCD ApplicationSet是GitOps工作流中解决多集群应用交付的核心控制器。当运维团队需要将同一应用部署到数十个Kubernetes集群时,手动创建Application资源既低效又易出错。ApplicationSet通过模板化生成多个Application资源,结合集群清单动态匹配目标集群,实现”一套配置、多集群分发”的自动化交付模式。
ApplicationSet的核心工作流程:Controller监听ApplicationSet资源变更,根据Generator生成Application列表,每个Application绑定一个目标集群和命名空间。集群注册信息存储在ArgoCD的Secret资源中,ApplicationSet通过cluster决策器自动发现可用集群。
Git Generator实现代码仓库驱动交付
Git Generator从Git仓库的目录结构或文件动态生成Application。适合微服务架构下每个服务独立仓库、独立部署的场景:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: microservices-git
namespace: argocd
spec:
goTemplate: true
generators:
- git:
repoURL: https://git.company.com/platform/services.git
revision: main
directories:
- path: services/*
template:
metadata:
name: '{{.path.basename}}'
spec:
project: default
source:
repoURL: https://git.company.com/platform/services.git
targetRevision: main
path: '{{.path.path}}/k8s'
destination:
server: https://kubernetes.default.svc
namespace: '{{.path.basename}}'
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Git Generator监听仓库目录变化,新增服务目录后ApplicationSet自动生成对应Application,ArgoCD执行同步部署。服务下线只需删除目录,ApplicationSet的prune策略会自动清理对应资源。
Cluster Generator实现多集群动态分发
Cluster Generator从ArgoCD注册的集群列表中动态生成Application,每个集群一个Application实例:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: platform-multi-cluster
namespace: argocd
spec:
goTemplate: true
generators:
- clusters:
selector:
matchLabels:
env: production
template:
metadata:
name: 'platform-{{.name}}'
spec:
project: default
source:
repoURL: https://git.company.com/platform/manifests.git
targetRevision: main
path: overlays/{{.name}}
helm:
valueFiles:
- values.yaml
- values-{{.name}}.yaml
destination:
server: '{{.server}}'
namespace: platform
syncPolicy:
automated:
prune: true
selfHeal: true
Cluster Generator通过selector筛选集群标签,支持按环境(env: staging/production)、区域(region: cn-east/cn-west)等维度过滤。新集群注册到ArgoCD后只需打上对应标签,ApplicationSet自动将其纳入交付范围。
Matrix Generator组合多维度生成策略
实际生产中常需将Git Generator和Cluster Generator组合——多个微服务分别部署到多个集群。Matrix Generator实现两个Generator的笛卡尔积:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: services-to-clusters
namespace: argocd
spec:
goTemplate: true
generators:
- matrix:
generators:
- git:
repoURL: https://git.company.com/platform/services.git
revision: main
directories:
- path: services/*
- clusters:
selector:
matchLabels:
env: production
template:
metadata:
name: '{{.path.basename}}-{{.name}}'
spec:
project: default
source:
repoURL: https://git.company.com/platform/services.git
targetRevision: main
path: '{{.path.path}}/k8s'
helm:
parameters:
- name: cluster.name
value: '{{.name}}'
destination:
server: '{{.server}}'
namespace: '{{.path.basename}}'
syncPolicy:
automated:
prune: true
selfHeal: true
Matrix Generator生成Application数量=服务数x集群数。10个服务x5个集群=50个Application,全部由一套ApplicationSet配置管理。任何新增服务或集群的变更都会自动触发对应的Application创建和同步。
Sync策略与冲突处理
多集群交付中需注意的Sync冲突场景:
同一命名空间中不同ApplicationSet生成的Application可能声明相同资源。ArgoCD通过project隔离解决冲突——不同项目下的Application资源互不可见。建议每个团队独立project,通过project的sourceRepos和destination限制可部署的仓库和集群范围。
Sync波次控制(Sync Waves)用于管理资源部署顺序。通过annotation argocd.argoproj.io/sync-wave指定波次编号,编号小的先部署:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
annotations:
argocd.argoproj.io/sync-wave: "1"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-server
annotations:
argocd.argoproj.io/sync-wave: "2"
多集群场景下,若某个集群同步失败,ArgoCD会标记该Application为Degraded状态,但不影响其他集群的同步。可通过ArgoCD Notification触发告警,运维人员收到通知后排查特定集群的同步问题。
Progressive Delivery与金丝雀发布
ApplicationSet配合Argo Rollouts可实现多集群金丝雀发布。在Wave 1中指定金丝雀集群(如canary: true标签),先发布到金丝雀集群验证,确认无异常后再全量同步到所有生产集群:
spec:
generators:
- clusters:
selector:
matchLabels:
canary: "true"
template:
spec:
source:
helm:
parameters:
- name: image.tag
value: v2.0.0-rc1
金丝雀验证通过后,更新主ApplicationSet的image.tag参数,所有生产集群自动同步到新版本。验证失败则回退image.tag到旧版本,ArgoCD自动执行同步回退。整个发布过程完全在GitOps框架下运行,所有变更通过Git commit触发,审计日志完整可追溯。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/argocdapplicationset-duo-ji-qun-dong-tai-jiao-fu-yu-gitops/