ArgoCD

과거에는 Kubernetes 환경을 수동적으로 관리하고, Application과 Kubernetes를 따로 관리하는 경우가 많았습니다. 이로 인해 Application과 Kubernetes간의 불일치가 발생하게 되었고, 배포 및 운영 과정에서 문제가 발생할 가능성이 높았습니다.

이런 문제를 해결하기 위해 Argo CD는 Kubernetes 환경에서 GitOps를 구현하기 위한 도구로, 선언적(declarative) 방식으로 애플리케이션을 관리하고 자동으로 배포할 수 있도록 도와줍니다. GitOps는 Git Repository를 애플리케이션 환경의 SSOT(single source of truth)으로 사용하는 운영 방법입니다.

Argo CD는 Git Repository에 저장된 Kubernetes 매니페스트를 읽고 이를 바탕으로 애플리케이션을 Kubernetes 클러스터에 배포하며, 상태를 지속적으로 동기화하고 모니터링합니다. ArgoCD는 현재 활발하게 Contribution이 이루어지고 있는 프로젝트로서 현업에서도 많이 사용되는 도구입니다. ArgoCD는 아래와 같은 주요 특징을 가지게 됩니다.

ArgoCD 주요 특징

  1. GitOps 기반 배포: Argo CD는 Git 리포지토리에 정의된 애플리케이션의 현재 상태와 실제 클러스터의 상태를 지속적으로 비교하고, 불일치가 발생하면 자동으로 동기화하여 원하는 상태로 복구합니다.

  2. 지원하는 매니페스트 형식: Argo CD는 YAML, JSON 등의 Kubernetes 매니페스트뿐만 아니라 Helm, Kustomize, Ksonnet 같은 템플릿 엔진도 지원합니다. 이를 통해 다양한 방식으로 애플리케이션 구성을 관리할 수 있습니다.

  3. 자동화된 동기화: 애플리케이션이 Git 리포지토리에서 업데이트되면, Argo CD는 자동으로 클러스터에 변경 사항을 배포하여 Git 상태와 클러스터 상태를 일치시킵니다.

  4. 롤백 및 히스토리 관리: 배포된 애플리케이션의 이전 버전으로 쉽게 롤백할 수 있습니다. Git 커밋 기록을 통해 애플리케이션의 변경 사항 히스토리를 관리하고 추적할 수 있습니다.

  5. 모니터링 및 경고: 애플리케이션의 상태를 모니터링하고, 원하는 상태와 실제 상태가 불일치할 때 경고를 보냅니다. 이는 Kubernetes 리소스의 라이프사이클을 자동으로 관리하는 데 유용합니다.

  6. 멀티 클러스터 지원: Argo CD는 여러 Kubernetes 클러스터를 동시에 관리할 수 있으며, 이를 통해 멀티 클러스터 배포 및 관리를 중앙에서 쉽게 할 수 있습니다.

  7. Self-Healing 기능: Argo CD는 애플리케이션의 선언적 상태와 실제 상태를 지속적으로 모니터링하여, 클러스터에서 수동으로 변경된 사항이 있으면 자동으로 복구합니다.

ArgoCD Architecture

아키텍처 구성

위 그림을 보시면 ArgoCD를 구성하는 다양한 컴포넌트를 확인할 수 있습니다. 크게 4가지의 컴포넌트로 구성되어있습니다.

  • API Server: REST API를 통해 외부와의 인터페이스를 제공하며, UI 및 CLI에서 명령을 처리합니다.

  • Git Repository: Git Repository는 애플리케이션의 상태를 정의하는 매니페스트 파일들을 저장합니다.

  • Kubernetes Cluster: 애플리케이션이 배포되는 실제 클러스터입니다.

  • Repo Server: Git Repository와 상호작용하여 애플리케이션 매니페스트를 가져오고, 이를 Kubernetes에 적용할 준비를 합니다.

ArgoCD 관리 단위

Argo CD의 관리 단위는 애플리케이션(Application), 프로젝트(Project), 그리고 클러스터(Cluster)로 나눌 수 있습니다. 이를 통해 애플리케이션 배포와 관리, 접근 제어, 리소스 할당 등의 작업을 유연하게 처리할 수 있습니다.

1. 애플리케이션(Application)

Argo CD에서 가장 기본적인 관리 단위는 애플리케이션입니다. Argo CD에서 애플리케이션은 Git 리포지토리에 저장된 Kubernetes 매니페스트 파일들의 집합을 의미하며, 이를 통해 실제 Kubernetes 클러스터에 배포되는 리소스를 정의합니다.

2. 프로젝트(Project)

프로젝트는 여러 애플리케이션을 그룹으로 묶고, 이 그룹에 대한 접근 권한과 자원을 제어하는 단위입니다. 이를 통해 다양한 팀이 Argo CD를 사용하더라도 각 팀이 관리하는 애플리케이션과 리소스를 서로 격리하여 관리할 수 있습니다.

3. 클러스터(Cluster)

클러스터는 Argo CD가 애플리케이션을 배포할 수 있는 Kubernetes 클러스터입니다. Argo CD는 멀티 클러스터 환경에서 여러 클러스터를 관리할 수 있으며, 애플리케이션을 특정 클러스터에 배포하도록 지정할 수 있습니다.

4. 기타 관리 단위

  • 소스 리포지토리(Source Repository): Argo CD는 Git 리포지토리를 통해 애플리케이션 매니페스트를 관리합니다. 리포지토리 내에서 하나의 리포지토리에 여러 애플리케이션의 매니페스트가 있을 수 있으며, 각 애플리케이션은 특정 디렉토리나 브랜치를 지정할 수 있습니다.

  • 네임스페이스(Namespace): Argo CD 애플리케이션은 Kubernetes 클러스터의 특정 네임스페이스에 배포됩니다. 프로젝트 수준에서 사용할 수 있는 네임스페이스를 제약할 수 있습니다.

관리 단위 간의 관계

  • 애플리케이션프로젝트에 속하며, 클러스터소스 리포지토리에 의존해 Kubernetes 리소스를 배포합니다.

  • 프로젝트는 여러 애플리케이션을 포함하고 있으며, 애플리케이션의 배포 클러스터와 리소스 사용을 제한하거나 제어하는 역할을 합니다.

  • 클러스터는 애플리케이션이 배포되는 Kubernetes 클러스터이며, 프로젝트 단위로 클러스터 사용을 제한할 수 있습니다.

ArgoCD의 동작 과정

ArgoCD는 위에서 말씀드린 것과 같이 GitOps, 즉 Git Repository에서 관리되는 매니페스트와 실제 배포된 매니페스트가 동일하도록 만들 수 있습니다. 이 과정을 Github Action과 EKS를 사용하게 된다면 아래 그림과 같이 구성됩니다.

Pull based GitOps using ArgoCD
  1. 개발자(Developer)는 Application 코드를 수정해서 Pull Request를 생성한 후, Merge가 됩니다.

  2. Merge Event로 트리거된 Github Action이 수행되고, 빌드 결과물인 Image가 ECR에 Push 됩니다.

  3. Github Action에서 빌드 결과물을 Push 한 이후, 배포되는 매니페스트를 관리하는 Repository에 Image tag를 갱신합니다.

  4. ArgoCD가 AutoSync인 경우, 변경된 매니페스트를 감지해서 Target이 되는 EKS Cluster에 배포 단위인 Application을 배포해서 매니페스트를 동기화합니다.

Reference : https://argo-cd.readthed. cs.io/en/stable/

Last updated