딜라이트룸 DevOps 1탄: Argo CD 넌 뭐니?

ArgoCD란 무엇인가?

Chris Lee
DelightRoom
9 min readDec 19, 2023

--

열일하는 Argo CD

서론

안녕하세요. 딜라이트룸에서 백엔드 개발을 맡고있는, Infra Group 소속의 Chris 입니다. 저희 그룹에서는 백엔드 서비스들을 더욱 체계적으로 운용하고 효율적으로 배포하기 위해 다양한 DevOps 관련 기술을 탐구하고 있습니다. 특히 그 중에서 가장 핵심 구성 요소중 하나라고 할 수 있는 배포 관리 도구인 Argo CD를 수 년전부터 도입하여 활용해오고 있는데요. 이 글을 통해 더 많은 분들이 Argo CD의 장점을 알고 사용해보셨으면 하는 생각이 들어 본 글을 작성하게 되었습니다. Argo CD 도입한 배경, 주요 특징, 그리고 딜라이트룸에서의 활용 사례에 대해 말씀드리고자 합니다.

이 글은 독자들께서 Kubernetes와 관련된 기본적인 지식과 경험을 가지고 있음을 가정하고 쓰여졌습니다. 하지만 기술적으로 깊이 들어가고 있지는 않기 때문에 관련 지식이 많지 않으시더라도 Argo CD와 GitOps에 대한 어느정도의 이해는 얻어가실 수 있으리라 생각합니다.

ArgoCD란 무엇인가?

ArgoCD는 Kubernetes 환경에서의 애플리케이션 배포와 관리를 지원하는 도구로, GitOps 원칙에 기반하여 설계되었습니다. 기본적으로 Git 저장소에 기록된 애플리케이션의 상태를 Kubernetes 클러스터와 동기화하는 역할을 수행합니다. 이를 통해 배포의 전체 상태와 변화 과정을 Git을 통해 효과적으로 추적하고 관리할 수 있습니다.

도입 배경

딜라이트룸의 기술 스택 중 Kubernetes는 알라미 서비스 API, 내부 서비스, 데이터 파이프라인 등이 동작하는 중요한 기반 환경입니다. 이러한 컴포넌트들의 안정적인 배포는 비즈니스에 있어 핵심 요소이며, 여기에는 다음과 같은 고려사항들이 있습니다:

  1. Git 저장소에 기록된 상태와 Kubernetes 클러스터의 현재 상태는 일치해야 합니다.
  2. 대표적인 배포 방식은 이미지를 빌드하여 컨테이너 레지스트리에 업로드한 후, k8s 리소스로 정의하고 적용하는 것입니다. 그러나 이 방식에는 변경 사항이 있을 때마다 새롭게 적용해야하는 번거로움이 있습니다.
  3. 상태 일치성 검증이 수작업을 필요로 하며, 이는 번거롭기만 할 뿐더러 실수의 여지도 큽니다. 따라서 GitOps 방식을 통한 자동화된 동기화 방식의 도입이 필요하다고 판단하였습니다.

이러한 배경 하에 몇가지 관련 도구들(Flux, Jenkins X, ArgoCD, Tekton 등)을 탐색 해 보았고, 이 중 ArgoCD가 가장 적합하다고 판단하게 되었습니다.

Argo CD의 선택 이유

Argo CD를 선정한 주요 이유는 다음과 같습니다:

  1. Git과 Kubernetes 상태의 효율적인 동기화
  2. 간결하면서도 직관적인 설치 및 운영 경험
  3. 다양한 도구(helm, kustomize 등)와의 원활한 연동
  4. Declarative한 관리의 편리성
  5. 활발한 커뮤니티 지지 및 빠른 기능 업데이트

이런 장점들로 인해 Argo CD는 딜라이트룸의 Kubernetes 환경에 가장 적합한 배포 도구로 선정되었습니다.

사용을 시작할 때에는 그 정도 까지는 아니었지만 현재 Argo CD는 오픈소스 GitOps 배포 도구중에 현재 거의 de-facto standard로 여겨질 만큼 광범위하게 사용되고 있습니다.

설치 및 운용 접근법

새로운 기술 도입 시 복잡한 설정은 종종 초기 도입의 진입 장벽이 될 수 있습니다. 딜라이트룸에서 Argo CD 도입 초기, 우리는 명료한 공식 설치 가이드를 따라 빠르게 설치 및 테스트를 먼저 진행 해 보았습니다.

Kustomize와 Declarative 운용 전환

시간이 흘러, IaC의 도입과 함께 Argo CD의 관리 방식을 체계적이고 선언형으로 전환하고자하는 의지가 생겼습니다. 이를 위해 `kustomize`를 활용하여 Argo CD 전체 상태 (각종 설정, Application 혹은 ApplicationSet 정의 등)를 명세화 하여 git 저장소에 담아두고, 한번에 bootsraping할 수 있도록 꾸몄습니다. 이 과정에서 다음 Declarative Setup 가이드를 주된 참조 자료로 활용하였습니다.

ArgoCD의 재귀적 운용

ArgoCD의 유연성은 그 자체를 ArgoCD로 관리하는 재귀적 운용도 가능하게 합니다. 이 접근법은 설정과 관리를 보다 체계적으로 할 수 있는 장점을 가집니다. 여러 조직에서도 이 방식의 활용 사례가 있지만, 딜라이트룸에서는 아직 이 단계까지의 도입을 고려 중에 있습니다.

활용 사례

1. 일반적인 백엔드 서비스 배포

현대의 DevOps 환경에서는 다양한 스테이지(dev, stg, prod 등)를 거치며 소프트웨어를 빠르게, 안전하게 배포하는 것이 일반화 되어 있습니다. 환경에 따라 다양한 설정값 이를테면 이미지 태그, 자원 제약사항, 스케일링 옵션, 환경 변수 등을 변경해가며 배포되어야 합니다. ArgoCD를 이용하면 이를 어렵지 않게 지원할 수 있습니다.

가장 기초적인 방법으로 ArgoCD의 Application를 환경에 따라 한벌씩 만드는 방식을 시도해 볼 수 있습니다. Application은 ArgoCD에서 배포의 가장 기본이 되는 단위라고 보시면 됩니다. 하나의 Application은 클러스터에 배포되어야 할 각종 resource의 위치, 배포 방법, 목표 네임스페이스나 클러스터 등 다양한 설정 정보를 담고 있습니다.

더 발전된 방법으로 ArgoCD의 ApplicationSet를 활용해 볼 수 있습니다. ApplicationSet은 쉽게 말해 Application을 템플릿화 하여 자동으로 생성할 수 있게 해주는 도구입니다. 하나의 Application을 다양한 환경에 다르게 배포할 때 필요한 반복적인 작업을 최소화 해 주는 것이지요. 더 자세한 내용이 궁금하시면 다음 공식 문서를 참고해보시기 바랍니다.

저희가 실제로 Application과 ApplicationSet를 어떻게 사용하였는지, 기술적인 세부사항에 대해서는 별도의 글에서 다루어 보도록 하겠습니다.

2. 모든 클러스터에 기반이 되는 서비스 배포하기

몇몇 종류의 기반이 되는 공통 서비스들(예를 들어 ingress-controller, agents for observability, autoscaler 등)은 클러스터의 종류와 상관 없이 전반적으로 배포되어야 할 필요가 있습니다.

위에서 언급한 ApplicationSet은 이러한 배포 문제를 해결하는데 있어 매우 유용한 도구입니다. 단순한 일괄 배포 외에도 환경별로 다른 설정값을 적용할 필요가 있는데요. 추가적인 helm values 파일이나 ConfigMap을 활용하여 동일한 서비스를 배포하면서 환경마다 특정 설정을 적용할 수 있습니다.

이렇게 ArgoCD와 ApplicationSet를 활용하면, 다양한 클러스터에 필요한 서비스들을 효과적으로, 일관되게 배포하는 것이 가능합니다. 역시 후속 글에서 더 자세한 기술적인 사항들을 다루도록 하겠습니다.

Argo CD를 사용해보며 느낀 장, 단점

장점

Argo CD를 통한 GitOps practice의 가장 큰 장점 중 하나는 “코드 = 클러스터 상태”라는 점입니다. 이를 통해 현재의 클러스터 상태를 명확하게 파악하고, 소통의 어려움 없이 이를 관리할 수 있습니다. 예를 들면, 한 개발자가 로컬에서 kubectl로 특정 manifest를 적용하고, 또 다른 개발자가 다른 manifest를 적용할 때 어느 것이 실제로 적용되었는지 혼란이 생길 수 있습니다. 여러 명의 개발자가 있을 경우, 이러한 변화를 트래킹하는 것은 거의 불가능해집니다. 그러나 Argo CD를 사용하면, 이러한 문제를 쉽게 극복할 수 있습니다.

이외에도, Argo CD는 여러 Kubernetes 리소스로 구성된 애플리케이션을 ‘Application’이라는 단위로 관리하며, 그 위에 ‘project’라는 개념까지 제공하여 다양한 서비스들의 배포 상태의 관리를 체계적으로 할 수 있게 돕습니다.

마지막으로 2023년 현재로서는 ArgoCD는 매우 활발한 오픈소스 프로젝트로, IBM, Intuit과 같은 글로벌 대기업들도 포함된 많은 사용자들에게 인정받고 있습니다 (다음 참조: https://github.com/argoproj/argo-cd/blob/master/USERS.md). 보안 측면에서도 다양한 설정이 가능하여, 필요에 따라 강력한 보안 체계를 구축할 수 있습니다.

단점

실제 운용 환경에 적용을 해보면서 느낀 단점도 있습니다.

가장 체감되었던 점은 클러스터 전체의 상태를 완전히 선언적(declarative)으로 만들기가 어렵다는 것입니다. 이를테면 애플리케이션 간의 디펜던시가 있을 경우 배포 순서를 Argo CD 내에서 지정할 수 없기 때문에, 이로 인해 발생하는 문제들을 직접 해결해야만 합니다. 또한 DB, Ingress Controller 등 외부 기술 스택을 가져다가 사용해야 하는 경우 동일한 문제가 발생할 여지가 큽니다. 기술에 따라 배포에 있어 고유의 방식들이 있고, 이들이 항상 선언적으로 말끔하게 떨어지지는 않습니다. 이 문제는 시간이 지나면 자동으로 해결되는 경우도 있지만, 그 전까지는 명령형(imperative)의 요소를 배포 과정에 포함시켜야 할 수도 있습니다.

또한, Argo CD는 Kubernetes의 기본 구성 요소도 아니고, 상용 솔루션도 아닌 third-party 오픈소스 프로젝트입니다. 이 말은 직접 설치부터 운영까지 모든 것을 책임져야 함을 의미합니다. 문제 발생 시 공식적인 지원을 받기는 어렵고, 커뮤니티 지원에 의존해야 합니다. UI나 사용법도 상용 솔루션에 비해 직관적이지 않을 수 있습니다. 다행히, Argo CD를 기반으로 한 상용 GitOps 솔루션도 시장에 존재하므로, 필요에 따라 선택하여 사용할 수 있습니다.

결론

지금까지 딜라이트룸의 백엔드 DevOps를 관통하고 있는 Argo CD와 GitOps에 대해서 소개드렸습니다. Argo CD는 딜라이트룸의 Kubernetes 환경에서의 배포 프로세스를 보다 효율적으로 만들어 주었습니다. 자동화된 동기화를 통해 안정성과 효율성을 동시에 추구할 수 있게 되었습니다. 앞으로 백엔드 인프라를 구축하고자 하는 다른 분들에게도 이 글의 내용이 조금이나마 도움이 되었으면 합니다. 후속 글에서는 실제 코드와 곁들여 구체적인 적용 사례를 소개드리겠습니다.

⏰ 딜라이트룸에서 알라미와 함께 아침을 바꿀 분들을 모십니다

🙌딜라이트룸의 다양한 채널들을 팔로우하고 빠르게 소식을 받아보세요!

--

--