ArgoCD ApplicationSet解决的大规模GitOps痛点
ArgoCD原生通过Application CRD管理应用部署,每新增一个应用或集群都需要手动创建Application资源。当组织拥有数十个微服务和多个Kubernetes集群时,手工维护成百上千个Application资源不仅效率低下,还容易引入配置漂移。
ApplicationSet Controller作为ArgoCD的扩展组件,通过模板化机制自动生成Application资源。核心思路是:定义一个ApplicationSet模板,配合Generator(生成器),根据不同维度(集群列表、Git目录结构、矩阵组合等)批量生成Application,实现一次定义、多集群多应用自动同步。
ApplicationSet核心Generator详解
Cluster Generator
根据ArgoCD管理的集群列表生成Application,适合同一应用多集群部署场景:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: webapp-multi-cluster
namespace: argocd
spec:
generators:
- clusters:
selector:
matchLabels:
env: production
template:
metadata:
name: '{{name}}-webapp'
spec:
source:
repoURL: https://git.example.com/devops/webapp-manifests.git
targetRevision: main
path: overlays/{{name}}
destination:
server: '{{server}}'
namespace: webapp
syncPolicy:
automated:
prune: true
selfHeal: true
{{name}}和{{server}}是Cluster Generator自带的模板变量,分别替换为集群名称和API Server地址。配合cluster label selector,可以精准控制目标集群范围。
Git Directory Generator
扫描Git仓库的目录结构,每个目录生成一个Application,适合多应用mono-repo场景:
spec:
generators:
- git:
repoURL: https://git.example.com/devops/manifests.git
revision: main
directories:
- path: apps/*
template:
metadata:
name: '{{path.basename}}'
spec:
source:
repoURL: https://git.example.com/devops/manifests.git
targetRevision: main
path: '{{path}}'
destination:
server: https://kubernetes.default.svc
namespace: '{{path.basename}}'
Matrix Generator
组合多个Generator的输出做笛卡尔积,实现集群与应用的全排列生成:
spec:
generators:
- matrix:
generators:
- clusters:
selector:
matchLabels:
stage: prod
- git:
repoURL: https://git.example.com/devops/apps.git
revision: main
directories:
- path: services/*
template:
metadata:
name: '{{name}}-{{path.basename}}'
spec:
source:
repoURL: https://git.example.com/devops/apps.git
targetRevision: main
path: '{{path}}/overlays/{{name}}'
destination:
server: '{{server}}'
namespace: '{{path.basename}}'
ApplicationSet与ArgoCD多集群架构集成
多集群GitOps的关键是ArgoCD集群注册。ArgoCD通过集群Secret注册远端集群,ApplicationSet的Cluster Generator直接读取这些注册信息:
apiVersion: v1
kind: Secret
metadata:
name: cluster-prod-east
namespace: argocd
labels:
argocd.argoproj.io/secret-type: cluster
env: production
region: east
stringData:
name: prod-east
server: https://api.prod-east.example.com
config: |
{
"bearerToken": "<token>",
"tlsClientConfig": {
"insecure": false,
"caData": "<base64-ca>"
}
}
集群Secret中的label同时被Cluster Generator的selector使用,实现按环境、区域、业务线等维度的灵活过滤。
Progressive Delivery与ApplicationSet滚动发布
ApplicationSet支持渐进式交付策略,通过strategy字段控制生成的Application的同步顺序:
spec:
strategy:
type: RollingSync
rollingSync:
steps:
- matchExpressions:
- key: region
operator: In
values: [east]
- matchExpressions:
- key: region
operator: In
values: [west]
template:
metadata:
labels:
region: '{{metadata.labels.region}}'
RollingSync策略先同步east区域集群,全部健康后再同步west区域。如果east集群部署失败,west集群不会开始同步,实现了多集群的渐进式发布,降低爆炸半径。
ApplicationSet生产环境排障与最佳实践
模板变量调试:当生成的Application不符合预期时,使用kubectl get applicationset -o yaml查看status字段中的生成结果列表,确认Generator的参数替换是否正确。
防止Application爆炸:Git Directory Generator扫描到意外目录时会生成多余Application。用path的glob模式精确匹配,避免扫描到.git等隐藏目录。配合syncPolicy.prune可以在Generator不再产出某Application时自动清理对应资源。
权限边界:ApplicationSet Controller默认使用argocd-server的权限,在多租户场景下需要通过policy字段限制每个ApplicationSet可生成的目标集群和命名空间,防止跨租户越权部署。
Webhook触发:默认每3分钟轮询Git仓库。配置Git Webhook可以实现秒级响应变更,在ApplicationSet的template中引用revision变量确保每次Git push触发对应分支的同步。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/argocdapplicationset-dong-tai-sheng-cheng-ying-yong-yu-duo/