혹시 DevOps라는 말을 들어보셨나요?
Development(개발)와 Operations(운영)가 합쳐진 단어로, 소프트웨어 개발팀과 운영팀 간의 협업과 통합을 통해 소프트웨어 개발 및 배포 과정을 자동화하고 최적화하는 방법론입니다.
즉, 개발 주기 동안 빠른 피드백을 제공, 어플리케이션 배포 속도를 높이는 등 시스템 안정성을 강화하는 것을 목표로 두고 있습니다.

이번 시간에는 DevOps를 실제 서비스에 적용하기 위해 ArgoCD를 구축하는 방법에 대해 살펴보겠습니다.
GitOps란
먼저 ArgoCD에 대해 알아보기 전에 GitOps라는 개념을 알면 좋을 것 같습니다.
GitOps는 2017년 위브웍스(Weaveworks Inc) 에서 처음 정의한 용어로 프로젝트에 DevOps를 적용하는 방법론 중 하나입니다.
Git + Ops라는 단어를 합친 것으로, 애플리케이션의 상태 및 인프라 구성을 Git 리포지토리에서 관리하며, 이를 통해 Kubernetes와 같은 클러스터 환경에서 일관된 배포와 관리를 가능하게 합니다.

GitOps의 핵심은 시스템의 Manifest 요소를 Git에 저장 및 관리하고, 배포 시 Git에 저장된 Manifest를 이용하여 시스템에 배포합니다.
이를 통하여 Git을 “싱글 소스 오브 트루스(Single Source of Truth, 이하 SSOT)”로 활용합니다.
GitOps의 특징은 다음과 같습니다.
- 선언적 기술서 형태
- 구성들이 명령어로 관리되는 것이 아닌 일련의 사실로 구성되어 있으며, 이들을 통하여 시스템 구성을 보장합니다.
- 즉, 어떠한 시스템을 구성하는 과정을 명령어로 작성하지 않고 하나의 사실적 형태로 작성하여 시스템을 구성함으로써 OS 특징이나 사전 지식에 얽매이지 않고 시스템을 구성할 수 있는 장점이 있습니다.
- 단일 진실 공급원 (Single Source of Truth)
- 직역하면 ‘어떠한 상태의 결과(Truth)의 원인은 단 하나의 원천(Source)에서 기인한다’로 해석됩니다.
- 이를 시스템에 대입하면, 시스템 소스의 상태나 배포의 결과는 단 하나의 공급원에서 배포가 되었고 이로 인하여 발생합니다.
- 즉, 운영 환경에 적용되는 시스템 소스를 Git으로 지정하고 관리하여 와 운영 환경을 1:1로 결합하여 정합성 및 잘못된 시스템 소스 배포를 방지할 수 있습니다.
ArgoCD란

아르고CD 홈페이지 개요(Overview) 페이지에 다음과 같은 문장이 있습니다.
“Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.”
즉, ArgoCD는 Kubernetes 환경에서 GitOps 방식을 구현하기 위한 지속적 배포(CD, Continuous Delivery) 도구입니다.
Git에 저장된 Kubernetes Manifest 파일을 모니터링하면서 변경 사항이 발생하면 소스와 Kubernetes 클러스터의 상태를 동기화하는 역할을 수행합니다.
주요 기능 및 장점
- GitOps 기반 배포 자동화
- Git 저장소의 상태와 Kubernetes 클러스터의 실제 상태를 지속적으로 모니터링하여 두 상태가 불일치할 경우, 이를 감지하여 자동으로 동기화하거나 수동으로 동기화를 실행할 수 있습니다.
- 이를 통해 클러스터의 선언적 상태를 항상 유지할 수 있습니다.
- Git을 이용한 배포 버전 관리
- 각 버전이 Git 저장소에 기록되어 있기 때문에 이를 통하여 관리할 수 있습니다. 이에 따라 버전 업데이트 시, 이력을 통하여 업데이트 여부 및 내용을 파악할 수 있습니다.
- 또 업데이트 후 문제 발생 시, Git명령어 중 반영 내용을 롤백하는 명령어인 ‘git revert’를 이용하여 Git을 롤백함으로써 시스템을 이전 버전으로 돌아갈 수 있습니다.
- 웹 UI 및 CLI 제공
- ArgoCD 시스템을 확인할 수 있는 UI 및 명령줄 도구(CLI)를 제공하고 있습니다. 이를 통하여 어플리케이션 상태, 동기화 상태, 배포 기록 등을 시각적으로 모니터링이 가능합니다.
도입 배경과 필요성

현재 비즈스프링에서 제공하는 제품 중 Growth Platform(이하 그로쓰플랫폼)이 MSA(MicroService Application) 형식으로 Kubernetes 기반에서 서비스하고 있습니다.
즉 웹페이지, 로그인, 필요 데이터 획득(리소스, 리포트) 등을 서비스 단위로 클러스터 서버를 구성하여 필요시마다 해당 서버를 호출하여 프로세스 처리를 하고 있습니다.
문제는 서비스 내용이 변경될 때마다, 혹은 서비스가 늘어날 때마다 변경된 내용들을 모두 반영해야 하는데 서비스 개수가 많아질수록 발생할 수 있는 오류를 관리하기가 어렵습니다.
예를 들어 변경된 내용의 일부만 반영되고, 일부는 실수 혹은 일시적인 오류로 인하여 누락이 되는 상황이 발생할 수도 있습니다. 이런 경우에는 하나하나 일일이 서버에 접근하여 반영되었는지 확인해야만 할 것입니다.
이러한 이유로 CI/CD에 대한 필요성을 느끼게 되었고, 이를 구축하기 위해 ArgoCD를 구성하게 되어 인프라 관리를 더욱더 효율적으로 할 수 있게 되었습니다.
ArgoCD 세팅을 위한 환경 설정
비즈스프링 그로쓰플랫폼 서비스가 Istio를 사용하고 있어 Istio Gateway > Istio Virtual Service 순서대로 설치하여 외부에서 접근이 가능하도록 할 예정입니다.
2. argoCD를 설치합니다.
배포가 완료되면 kubectl 명령어로 배포된 리소스들을 확인할 수 있습니다.

3. Ingress gateway와 Virtual Service를 작성하여 배포합니다.
4. 웹 접속을 위해 계정을 확인합니다.
5. 초기 어드민 계정으로 접속을 한 후, 비밀번호를 업데이트 합니다.
6. 웹 페이지로 이동하여 로그인합니다.

ArgoCD를 이용한 배포 자동화 및 CI/CD 통합
이제 설치까지 완료하였으니 ArgoCD를 이용한 배포 자동화 및 CI/CD 통합을 하도록 하겠습니다.
현재 그로쓰플랫폼은 다음과 같은 순서로 Kubernetes 클러스터 서버 배포를 하고 있습니다.
- 변경 사항 저장(Commit and Push)
- Git Action을 통하여 Kubernetes Container 이미지 생성
- Container Registry에 이미지 업로드
- 서버에서 Registry에 저장된 이미지 Pull
- Container rollout 하여 적용
이 중 3~5번의 특성으로 인하여 이미지가 업로드된 후 배포 처리를 할 수 있도록 설정해야 합니다.
즉, 자동 배포가 그로쓰플랫폼 소스가 변경될 때가 아닌 Container Registry에 업로드가 완료된 상태에서 실행이 되어야 합니다. 문제는 이미지가 Github Action이 실행되어야 생성되므로 ArgoCD로 자동 배포는 어려운 점이 있습니다.
이러한 점을 해결하기 위해 ArgoCD가 체크하는 전용 브랜치에 배포된 클러스터 내용을 저장하면서 내용 변경 시 Kubernetes가 배포되도록 설정하여 사용할 수 있습니다.
이에 대해서 알아보도록 하겠습니다.
Github Action 세팅
1. Git에서 ArgoCD가 참조하게 될 전용 브랜치를 생성합니다.

2. 배포된 클러스터와 이미지 태그를 저장하고 있는 Yaml을 생성합니다.
- images
- name: ECR 이미지명
- newName: Kubernetes 이미지명
- newTag: 이미지 태그, 수정시마다 태그가 변경됨
3. 해당 Kustomization을 이용하기 위해 Github Action workflow Yaml을 수정합니다.
Kubernetes 이미지를 Registry에 업로드하는 Build, tag, and push image env 작업이 끝난 후 Kustomize를 이용하여 각 이미지의 태그를 변경, 해당 브랜치를 Push 하는 것을 확인할 수 있습니다.
ArgoCD 세팅
1. ArgoCD 웹 페이지로 이동하여 로그인 후, ArgoCD가 관리하는 가장 큰 단위인 프로젝트를 생성합니다.


- Project Name: ArgoCD에 표기될 프로젝트명입니다.
- Description: 프로젝트 설명입니다.
2. ArgoCD가 소스를 참조할 레포지토리를 등록합니다.


- Choose your connection method: 레포지토리를 접속하는 방법을 선택합니다. 상황에 맞게 선택하면 됩니다. 여기서는 Github code URL을 이용할 것이어서 VIA HTTPS를 선택합니다.
- Type: 접속 종류를 선택합니다.
- Project: 레포지토리가 소속될 프로젝트를 선택합니다.
- Repository URL: 레포지토리의 URL을 입력합니다. Github code URL을 입력합니다.
- Username: 해당 레포지토리 접근하기 위한 Github 계정명을 입력합니다.
- Password: 해당 레포지토리 접근하기 위한 Github 계정 비밀번호를 입력합니다.
3. ArgoCD가 작동하기 위해 Application(이하 어플리케이션)을 등록합니다. 어플리케이션은 프로젝트에 속하는 가장 작은 단위입니다.


- Application Name: ArgoCD에 표기될 어플리케이션명입니다.
- Project Name: 어플리케이션이 소속될 프로젝트를 선택합니다.
- Sync Policy: 레포지토리와 Kubernetes 클러스터를 동기화 정책을 선택합니다.
- Manual: 수동으로 동기화합니다. 동기화 버튼을 클릭하면 동기화를 실행합니다.
- Automatic: 자동으로 동기화합니다. 대개 CI/CD 운영 시 해당 옵션을 선택합니다.
- Repository URL: 레포지토리의 URL을 선택합니다. 위 과정에서 등록한 레포지토리 목록만 나옵니다.
- Revision: 배포 대상이 될 레포지토리의 Branch를 지정합니다.
- Path: 레포지토리의 디렉토리를 지정합니다.
- Cluster URL: 배포 대상이 될 Kubernetes Cluster를 지정합니다.
- Namespace: 배포 대상이 존재하는 네임스페이스를 지정합니다.
해당 정보들을 입력하고 저장 버튼을 누르면 어플리케이션이 생성됩니다.

배포
- 수정한 Workflow가 있는 브랜치에 Commit and Push를 합니다.
- Workflow가 실행되는 과정에서 ArgoCD Metadata 업데이트가 진행되는 것을 확인할 수 있습니다.
- Metadata 업데이트가 완료되면, dev-charts 브랜치로 진입하여 Commit and Push가 일어났는지 확인합니다.
- Commit and Push가 발생했다면 ArgoCD 웹 페이지로 진입 > Applications > 생성한 application 진입 > App health, Sync status, Last sync 등을 확인하여 배포되었는지 확인할 수 있습니다.
- 배포한 서비스로 이동하여 이상 없이 배포되었는지 확인합니다.
실시간 모니터링 및 알람 설정
배포 성공 시 알람 구성 방법
ArgoCD의 배포 사항을 사용자에게 알리는 “Argo CD Notifications”을 이용하여 배포 사항을 텔레그램으로 전송할 수 있습니다.
이에 대해 알아보겠습니다.
텔레그램 봇 생성 과정은 해당 페이지에서 확인 가능합니다.
- @BotFather를 통하여 텔레그램 토큰을 획득합니다.
- 모니터링 내용을 받을 채널을 생성합니다.
- 채널의 ID를 획득합니다.
- Argo CD Notifications을 설치합니다.
5. Argo CD Notifications Trigger를 설치합니다.
6. 텔레그램 토큰을 저장할 Secret을 설정합니다.
7. argocd_notifications-secret을 이용하여 configmap을 설정합니다.
8. 마지막으로 Application에 Notification Trigger를 설정해줍니다.
9. Git Commit and Push를 하여 알람이 오는지 확인합니다.

이상으로, ArgoCD를 이용하여 CI/CD를 구축하는 프로세스에 대해 정리해보았습니다.
프로세스에 대해 궁금한 점이 있다면 언제든지 문의 해주시길 바랍니다.
감사합니다.