PaaS/CI CD

App of Apps Pattern 이란? 그리고 ArgoCD에는 어떻게 정의해야 하나

armyost 2022. 6. 2. 06:58
728x90

App of Apps 패턴은 사실 원래 있던 구조 였다. 레거시로 거슬러 올라가면 Parrent 모듈에 Sub모듈이 있는 프로젝트가 그랬듯이 요즘 대두되는 App of Apps 패턴도 종속관계를 이용한 배포구성이다. 다만 요즘에는 어플리케이션이 인프라 레벨까지 배포컨트롤이 가능한 컨테이너 Base로 구현되다 보니, 레거시 보다 확장된 범위의 자원을 App of Apps 패턴으로 관리하고 있다. 

 

토스뱅크도 배포 대상의 환경이 Kubernetes로 되어 있어 App of Apps 패턴을 적용하여 관련 리소스를 일괄 배포한다고 한다. (아래 링크 참조)

https://armyost.tistory.com/240

 

토스뱅크의 쿠버네티스 기반 CI/CD 환경

관련링크 : https://www.youtube.com/watch?v=gF1wfTCDyI8 주요내용 개발 환경 : Testbed, Dev 환경으로 이루어져 있다. Testbed : 아무런 트래픽 없음(형상조합을 위한 환경인듯) Dev : 테스트 트래픽 발생 Live..

armyost.tistory.com

 

App of Apps 패턴은 특별한 것이 아니며, 이 종속관계를 이용하여 어플리케이션과 관련 어플리케이션 혹은 관련 리소스를 패키지로 배포하자는 개념이다. 

 

사실 용어는 중요하지 않고, 많은 PaaS플랫폼에서 어떤식으로 이 패턴서비스를 제공하느냐 인데, ArgoCD사용자들이 App of Apps 패턴을 보편적으로 사용하고 있는 것으로 보인다.

 

ArgoCD의 해당 패턴 배포시 Parent App은 다음과 같이 정의한다. 

 

Root App

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: root-app
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: default
    name: in-cluster
  project: default
  source:
    path: apps
    repoURL: https://github.com/argoproj/argocd-example-apps
    targetRevision: HEAD

Line 14에서 path : apps를 보면  Application을 정의하고 있는 RootApp의 k8s manifest를 받기위한 Source Repository를 정의하고 있다.

 

Chile App

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: helm-guestbook
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: helm-guestbook
    name: dev-cluster
  project: default
  source:
    path: helm-guestbook
    repoURL: https://github.com/argoproj/argocd-example-apps
    targetRevision: HEAD

Line 14에서 path : helm-guestbook 을 통해 Chile App 배포에 필요한 패키지를 helm Chart를 통해 배포코자한다. 이 부분은 helm이 꼭아니더라도 kustomize나 k8s manifest를 그냥 나열하는 방식으로도 대체할 수 있다. 

중요한점은 여기서부터 배포 대상환경이 나뉜다는 점이다. dev 클러스터가 Line11에 지명된것을 볼수 있다. 즉 Root App은 in-Cluster라는 ArgoCD가 설치된 클러스터에 설치되고 Chile는 DevOps 프로세스상에 필요한 환경에다가 붓는것이다. 

 

숙련된 사용자들은 App of Apps 패턴 정의시 다음과 같은 기준을 권장한다.

1) Create a project for each app bundle

2) Create environment-specific app bundles and projects

3) Keep Application definitions in a separate repo