IaC/CI CD Tool

ArgoCD ApplicationSet이란? (작성 방법)

Somaz 2023. 10. 6. 21:30
728x90
반응형

Overview

ArgoCD ApplicationSet 작성방법에 대해서 알아보려고 한다.

출처 : https://blog.argoproj.io/introducing-the-applicationset-controller-for-argo-cd-982e28b62dc5

 

 

2023.05.17 - [IaC/CI CD Tool] - ArgoCD란?

 

ArgoCD란?

Overview 오늘은 ArgoCD에 대해 공부해보려고 한다. ArgoCD란? Argo CD 는 Kubernetes를 위한 선언적 GitOps 지속적 배포 도구이다. 그렇다면 왜 ArgoCD를 사용해야 할까? 애플리케이션 정의, 구성 및 환경은 선

somaz.tistory.com

2023.08.09 - [IaC/CI CD Tool] - ArgoCD Install AWS & GCP

 

ArgoCD Install AWS & GCP

Overview 오늘은 ArgoCD AWS GCP 설치 방법에 대해서 알아보려고 한다. 2023.05.17 - [IaC/CI CD Tool] - ArgoCD란? ArgoCD란? Overview 오늘은 ArgoCD에 대해 공부해보려고 한다. ArgoCD란? Argo CD 는 Kubernetes를 위한 선언적

somaz.tistory.com

 


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

728x90
반응형

'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