ApplicationSet解决什么问题
ArgoCD通过Application资源实现GitOps持续交付,但每个应用、每个环境都需要手动创建Application对象。管理50个微服务乘以4个环境等于200个Application CRD,手动维护不现实。ApplicationSet控制器自动根据模板生成多个Application,是ArgoCD多集群多环境交付的核心组件。
Git Directory生成器详解
Git Directory生成器扫描Git仓库中的目录结构,每个目录自动生成一组Application参数。适合微服务目录按服务名组织的场景。
仓库结构:
git-repo/
clusters/
dev/
service-a/
kustomization.yaml
service-b/
kustomization.yaml
prod/
service-a/
kustomization.yaml
service-b/
kustomization.yaml
ApplicationSet定义:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: microservices
namespace: argocd
spec:
goTemplate: true
generators:
- git:
repoURL: https://github.com/org/git-repo.git
revision: HEAD
directories:
- path: clusters/*/*
template:
metadata:
name: '{{ .path.basename }}-{{ .path.segments[1] }}'
spec:
project: default
source:
repoURL: https://github.com/org/git-repo.git
targetRevision: HEAD
path: '{{ .path.path }}'
destination:
server: https://kubernetes.default.svc
namespace: '{{ .path.segments[1] }}'
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
goTemplate模式下,.path.basename是目录名(service-a),.path.segments[1]是第二层目录(dev/prod),组合生成唯一的Application名称。
Cluster生成器实现多集群自动注册
Cluster生成器根据ArgoCD中已注册的集群列表自动生成Application。新集群注册后,ApplicationSet自动为其创建对应应用。
spec:
generators:
- clusters:
selector:
matchLabels:
env: production
template:
metadata:
name: '{{ .nameNormalized }}-backend'
spec:
project: default
source:
repoURL: https://github.com/org/backend.git
targetRevision: HEAD
path: overlays/{{ .metadata.labels.env }}
destination:
server: '{{ .server }}'
namespace: backend
集群注册时打上标签:
argocd cluster add prod-cluster-1 \
--label env=production \
--label region=us-east
argocd cluster add prod-cluster-2 \
--label env=production \
--label region=eu-west
两个集群都会自动获得backend应用的部署。
Matrix生成器组合多维度
实际场景需要同时按集群和Git目录两个维度生成Application。Matrix生成器将多个生成器做笛卡尔积:
spec:
goTemplate: true
generators:
- matrix:
generators:
- git:
repoURL: https://github.com/org/services.git
revision: HEAD
directories:
- path: services/*
- clusters:
selector:
matchLabels:
argocd.argoproj.io/instance-type: managed
template:
metadata:
name: '{{ .path.basename }}-{{ .nameNormalized }}'
spec:
project: default
source:
repoURL: https://github.com/org/services.git
targetRevision: HEAD
path: '{{ .path.path }}/overlays/{{ .metadata.labels.env }}'
destination:
server: '{{ .server }}'
namespace: '{{ .path.basename }}'
5个服务目录乘以3个集群等于15个Application,全部自动生成和管理。
ApplicationSet的Sync策略与冲突处理
当Git目录结构变化(新增或删除服务目录)时,ApplicationSet控制器会自动创建或删除对应Application。这个行为由syncPolicy控制。
需要注意的冲突场景:如果手动修改了由ApplicationSet生成的Application,下次reconcile时这些修改会被模板覆盖。规范做法是所有变更通过Git仓库进行,禁止直接操作生成的Application。
# 检查ApplicationSet生成的Application状态
kubectl get applications -n argocd \
-l argocd.argoproj.io/application-set-name=microservices
# 强制触发reconcile
kubectl apply -f applicationset.yaml --force
生产环境最佳实践
1. 使用goTemplate替代旧版template,避免模板变量冲突
2. ApplicationSet与Application分属不同命名空间或项目,避免权限越界
3. 大规模场景(100+ Application)将reconcile间隔从默认30秒调整为120秒,降低API Server压力
4. 配置resource hooks执行升级前健康检查
5. 对生产集群模板增加手动同步确认策略
6. 监控ApplicationSet控制器的reconcile耗时和错误率,及时发现问题
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/argocdapplicationset-dong-tai-jiao-fu-shi-zhan-git-mu-lu/