Overview
ArgoCD ApplicationSet 작성방법에 대해서 알아보려고 한다.
2023.05.17 - [IaC/CI CD Tool] - ArgoCD란?
2023.08.09 - [IaC/CI CD Tool] - ArgoCD Install AWS & GCP
ArgoCD ApplicationSet이란?
ApplicationSet은 다수의 환경이나 클러스터에 Application을 쉽게 배포할 수 있도록 한다.
각 환경에 대해 Application을 수동으로 정의하여 템플릿으로 만들 수 있다.
핵심 사항 및 주요 기능
- 1. Templating
- 2. Generators
- 3. Dynamic Update
- 4. DRY Principle
1. Templating
ArgoCD Application Template을 정의할 수 있고 ApplicationSet은 특정 파라미터를 변경하여 여러 개의 Application을 생성할 수 있다. 예를 들어 스테이징 및 프로덕션 환경이 있을 수 있으며 둘 모두에 대한 응용 프로그램을 생성하는 단일 템플릿이 있을 수 있다.
2. Generators
ApplicationSet은 템플릿에 대입되는 파라미터를 생성하기 위해 생성기를 사용한다.
List Generator
List Generator를 사용하여 여러 클러스터 또는 네임스페이스에 동일한 어플리케이션을 배포할 수 있다.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: guestbook-appset
spec:
generators:
- list:
items:
- cluster: staging
url: https://staging-cluster-api-server
- cluster: production
url: https://production-cluster-api-server
template:
metadata:
name: 'guestbook-{{cluster}}'
spec:
source:
repoURL: 'https://github.com/my-org/guestbook.git'
targetRevision: HEAD
destination:
server: '{{url}}'
namespace: 'guestbook'
Cluster Generator
Cluster Generator는 ArgoCD에서 관리하는 클러스터를 대상으로 어플리케이션을 생성한다.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: cluster-generator-example
spec:
generators:
- clusters:
selector:
matchLabels:
argocd.argoproj.io/secret-type: cluster
template:
metadata:
name: '{{name}}-app'
spec:
project: default
source:
repoURL: 'https://github.com/my-org/my-repo.git'
targetRevision: HEAD
destination:
server: '{{server}}'
namespace: 'default'
Git Generator
Git Generator를 사용하면 Git 레포지토리의 특정 경로에 따라 어플리케이션을 동적으로 생성할 수 있다.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: guestbook-appset
spec:
generators:
- git:
repoURL: 'https://github.com/my-org/app-repo.git'
directories:
- 'clusters/*/apps/'
template:
metadata:
name: '{{path.basename}}'
spec:
source:
repoURL: 'https://github.com/my-org/app-repo.git'
path: '{{path}}'
destination:
server: 'https://kubernetes.default.svc'
namespace: 'default'
Matrix Generator
Matrix Generator는 기존의 여러 Generator 출력을 사용하여 그들 간의 Cartesian Product(곱집합)을 생성하는데 사용된다.
따라서 여러 파라미터 조합에 대한 어플리케이션을 생성하는 것이 가능하다.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: matrix-example
spec:
generators:
- matrix:
generators:
- list:
items:
- cluster: cluster1
url: https://cluster1-api-server
- cluster: cluster2
url: https://cluster2-api-server
- list:
items:
- app: app1
repo: https://github.com/my-org/app1.git
- app: app2
repo: https://github.com/my-org/app2.git
template:
metadata:
name: '{{app}}-on-{{cluster}}'
spec:
source:
repoURL: '{{repo}}'
targetRevision: HEAD
destination:
server: '{{url}}'
namespace: 'default'
3. Dynamic Update(동적 업데이트)
Generator의 소스가 변경되면(예를 들어, Git Generator에서 사용하는 Git 저장소에 새로운 디렉토리가 추가되면)
ApplicationSet은 자동으로 새로운 ArgoCD 어플리케이션을 생성하거나 변경된 내용을 기반으로 기존의 어플리케이션을 업데이트 또는 삭제할 수 있다.
4. DRY Principle(DRY 원칙)
ApplicationSet을 사용하면 DRY(Don't Repeat Yourself) 원칙을 따른다. 어플리케이션의 공통 구조를 한 번 정의한 다음 차이점을 매개 변수화한다.
- Maintainability(유지 보수성)
- Readability(가독성)
- Resuability(재사용성)
- Bug Reduction or Decrease in Bugs(버그감소)
DRY는 "Don't Repeat Yourself" 의 약자로, 소프트웨어 개발에서 중복을 최소화하자는 원칙이다.
중복된 코드, 기능 또는 로직이 프로젝트 내에서 여러 번 반복되는 것을 피하도록 강조하며 이를 통해 유지 보수성을 향상시키고 버그의 가능성을 줄일 수 있다.
ArgoCD ApplicationSet 활용
아래의 링크에 ArgoCD ApplicationSet 예시를 정의해 놓았다.
EKS / GCP / Onpremise 3개의 예시로 나누어서 설명해보려고 한다.
EKS용 ArgoCD ApplicationSet
aws-applicationset.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: aws-appicationset
spec:
generators:
- matrix:
generators:
- list:
elements:
- cluster: somaz-eks
url: https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.sk1.ap-northeast-2.eks.amazonaws.com # EKS url
values:
environment: dev1
project: somaz-aws
- cluster: somaz-eks
url: https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.sk1.ap-northeast-2.eks.amazonaws.com # EKS url
values:
environment: dev2
project: somaz-aws
- git:
repoURL: git@github.com:somaz94/helm-chart-template.git
revision: HEAD
directories:
- path: aws/eks_fargate_use_efs/* # path
template:
metadata:
name: '{{values.environment}}-{{values.project}}-{{path.basename}}'
spec:
project: '{{cluster}}'
source:
repoURL: git@github.com:somaz94/helm-chart-template.git
targetRevision: HEAD
path: '{{path}}'
helm:
version: v3
valueFiles:
- '{{path.basename}}.values.yaml'
destination:
server: '{{url}}'
namespace: '{{values.environment}}-{{path.basename}}'
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
GKE용 ArgoCD ApplicationSet
gcp-applicationset.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: gcp-appicationset
spec:
generators:
- matrix:
generators:
- list:
elements:
- cluster: somaz-gke
url: https://1.1.1.1 # ClusterIP
values:
environment: dev1
project: somaz-gcp
- git:
repoURL: git@github.com:somaz94/helm-chart-template.git
revision: HEAD
directories:
- path: gcp/gke_use_nfs_server/* # Path
template:
metadata:
name: '{{values.environment}}-{{values.project}}-{{path.basename}}'
spec:
project: '{{cluster}}'
source:
repoURL: git@github.com:somaz94/helm-chart-template.git
targetRevision: HEAD
path: '{{path}}'
helm:
version: v3
valueFiles:
- '{{path.basename}}.values.yaml'
destination:
server: '{{url}}'
namespace: '{{values.namespace}}-{{path.basename}}'
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
Onpremise Cluster용 ArgoCD ApplicationSet
onpremise-applicationset.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: onpremise-appicationset
spec:
generators:
- matrix:
generators:
- list:
elements:
- cluster: master-node.somaz.link # your cluster name
url: https://xx.xx.xxx.xx:6443 # your cluster url
values:
project: somaz-onpremise
environment: dev1
- git:
repoURL: git@github.com:somaz94/helm-chart-template.git # your source repo
revision: HEAD
directories:
- path: onpremise/ke-use-nfs-server/*
template:
metadata:
name: '{{values.environment}}-{{values.project}}-{{path.basename}}'
spec:
project: '{{values.project}}'
source:
repoURL: git@github.com:somaz94/helm-chart-template.git
targetRevision: HEAD
path: '{{path}}'
helm:
version: v3
valueFiles:
- '{{path.basename}}.values.yaml'
destination:
server: '{{url}}'
namespace: '{{values.project}}-{{path.basename}}'
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
Reference
https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/
https://github.com/somaz94/helm-chart-template/tree/main/argocd-applicationset
'IaC > CI CD Tool' 카테고리의 다른 글
4. Github Action (With Matrix Strategy) (2) | 2024.03.12 |
---|---|
Argo Workflow란? (2) | 2024.02.09 |
5. GitLab ArgoCD 연동 (0) | 2023.08.10 |
ArgoCD 설치 AWS & GCP (0) | 2023.08.09 |
4. GitLab 버전 업그레이드 (0) | 2023.08.08 |