What is ArgoCD

요약
ArgoCD는 Kubernetes 환경에서 GitOps를 실현하는 핵심 도구로, Git을 단일 진실 소스로 삼아 클러스터의 실제 상태를 자동 또는 수동으로 동기화한다. CI가 Docker 이미지 빌드와 tag 생성까지 담당한다면, ArgoCD는 Git의 변경 사항을 기준으로 배포를 수행하는 CD 역할에 집중한다. 이를 위해 argocd-server, repo-server, application-controller로 구성된 아키텍처가 Git 변경 감지, 템플릿 렌더링, Diff 계산, Sync 수행 등 전체 배포 과정을 자동화한다. 반드시 이해해야 하는 핵심은 “Git 변경이 곧 배포 변경”이며, kubectl 기반 수동 조작은 ArgoCD Self Heal에 의해 되돌려진다는 점이다.
실무에서는 서비스 단위 및 환경별(Application 단위)로 관리 구조를 세분화하여 Dev/Stage/Prod 간 Sync 정책을 다르게 구성한다. image tag 변경은 실제 배포를 트리거하는 핵심 요소이며, Helm chart나 values.yaml 변경 또한 Git 변경만으로 재배포가 이루어진다. Secret은 Git에 평문으로 저장할 수 없기 때문에 Sealed Secrets, External Secrets Operator, SOPS 등 외부 보안 시스템을 활용해 GitOps 구조에서도 안전하게 관리한다.
고급 기능으로는 Argo Rollouts를 통한 카나리·블루그린 배포, Multi-Cluster 전략, 환경별 Sync 정책 설계, Helm 기반 설정 분리 등 조직의 배포 안정성을 강화하는 다양한 요소들이 있다. ArgoCD는 단순 배포 도구가 아니라 운영 방식 자체를 선언형·자동화 기반으로 재정의하는 GitOps 엔진이며, 이를 정확히 이해하면 실무 배포 파이프라인에 적응하는데 도움이 된다.
Table of Contents
#ArgoCD란 무엇인가
###GitOps 개념과의 관계
GitOps는 무엇이며 왜 등장했는가
DevOps와 GitOps의 차이
ArgoCD가 GitOps를 실현하는 방식
###ArgoCD가 해결하는 문제들
기존 CI/CD 구조의 한계
배포의 일관성과 자동화 부족 문제
쿠버네티스 환경에서의 복잡성 해결
#ArgoCD의 구성 요소
###ArgoCD 아키텍처
argocd-server 역할
repo-server 역할
application-controller 역할
###ArgoCD Application 개념
왜 서비스별로 Application을 나누는가
환경별(dev/stage/prod)로 Application을 분리하는 이유
Monorepo 구조에서의 Application 묶음 관리
#GitOps 환경에서의 배포 흐름 이해
###master 변경 → 이미지 빌드 → tag 업데이트 → ArgoCD Sync
image tag란 무엇인가
tag는 언제 어떻게 변경되는가
CI와 CD의 역할 분리
###Helm Chart & values.yaml 변경에 따른 동작
Helm chart 구조 변경 시 ArgoCD가 감지하는 방식
values.yaml 변경이 자동으로 재배포되는 이유
개발자가 Jenkins/ArgoCD를 건드리지 않아도 배포가 되는 원리
#ArgoCD Sync 메커니즘의 깊은 이해
###자동 Sync vs 수동 Sync
두 방식의 실무적 차이점
환경별 추천 Sync 정책
###Prune, Self Heal, Diff 계산
Prune이 필요한 이유
Self Heal의 강력함과 주의점
ArgoCD가 Diff를 계산하는 방식
###OutOfSync, 롤백 동작 원리
OutOfSync는 무엇을 의미하는가
Sync를 통해 어떤 일이 일어나는가
Git 롤백과 ArgoCD 롤백의 차이
#실무 적용 사례와 고급 기능
###여러 클러스터를 관리하는 구조
관리 클러스터 vs 타깃 클러스터 구조
클러스터 추가 방법과 운영 전략
###Secret을 안전하게 관리하는 방법
Sealed Secrets
External Secrets Operator
SOPS
###ApplicationSet과 Argo Rollouts
ApplicationSet의 필요성과 구조
Rollouts로 카나리/블루그린 구현하기
###Monorepo에서 ArgoCD 운영하기
서비스 디렉토리 구조 설계
ApplicationSet 자동 생성 전략
서비스 변경만 배포하도록 구성하는 방법
ArgoCD란 무엇인가
ArgoCD는 쿠버네티스 환경에서 GitOps를 구현하기 위한 대표적인 오픈소스 CD(Continuous Delivery/Deployment) 도구이다. CI/CD라는 용어는 개발자가 자주 접하지만, 두 개념은 역할이 다르다. CI는 코드를 빌드하고 테스트하며 Docker 이미지를 생성하는 과정이고, CD는 이렇게 생성된 결과물을 실제 배포 환경에 반영하는 과정이다. ArgoCD는 CD만 담당하는 도구이며, Git에 있는 선언형 정의를 기준으로 쿠버네티스 클러스터의 상태를 지속적으로 유지한다.
GitOps 개념과의 관계
GitOps는 무엇이며 왜 등장했는가
GitOps는 인프라 및 애플리케이션 상태를 Git에 선언해두고, 이를 자동으로 클러스터에 반영하는 운영 방식이다. 전통적인 CI/CD 시스템은 Jenkins가 직접 클러스터에 접근해 배포를 “밀어넣는(push)” 방식이었으며, 이는 보안 및 관리 측면에서 여러 문제를 발생시켰다. 반면 GitOps는 Git을 단일 진실 소스(single source of truth)로 삼고, ArgoCD 같은 도구가 클러스터 내부에서 Git 상태를 “끌어오는(pull)” 방식으로 배포를 수행한다.
DevOps와 GitOps의 차이
DevOps는 개발과 운영의 협업을 위한 넓은 문화적 개념이다. GitOps는 이 철학을 Git 기반 자동화로 구체화한 기술적 실천 방법이다. 즉, DevOps가 개념이라면 GitOps는 그중 배포/운영을 실천하는 방식이며, ArgoCD는 이를 구현하는 핵심 도구이다.
ArgoCD가 GitOps를 실현하는 방식
ArgoCD는 Git에 선언된 상태(desired state)를 쿠버네티스 클러스터의 실제 상태(actual state)와 지속적으로 비교한다. 변경이 감지되면 OutOfSync 상태로 표시하고, 사용자가 수동 혹은 자동 Sync 정책에 따라 클러스터를 Git과 동일한 상태로 맞춘다. 결국 “Git에서 정의된 everything-as-code”가 실제 운영 환경을 결정하게 된다.
ArgoCD가 해결하는 문제들
기존 CI/CD 구조의 한계
기존 Jenkins 기반 CD는 다음과 같은 단점을 가진다:
Jenkins가 Kubernetes 클러스터에 직접 접근해야 함
배포 히스토리가 Git이 아니라 Jenkins에만 남음
Service별/환경별 배포 관리가 어려움
여러 클러스터를 관리하기 복잡함
배포의 일관성과 자동화 부족 문제
쿠버네티스는 환경 설정, Helm chart, values 등 서로 연결된 요소가 많다. 사람이 수동으로 배포하면 실수가 쉽게 일어난다. ArgoCD는 Git을 기준으로 자동으로 상태를 유지하기 때문에 일관성이 확보된다.
쿠버네티스 환경에서의 복잡성 해결
쿠버네티스는 Deployment, ReplicaSet, Pod, ConfigMap, Secret 등 수십 개의 리소스를 다뤄야 한다. ArgoCD는 이를 UI에서 시각화하고 diff를 제공하며, 에러가 나면 즉시 확인할 수 있도록 돕는다.
ArgoCD의 구성 요소
ArgoCD는 쿠버네티스 내부에서 동작하는 애플리케이션이며, 여러 내부 구성 요소가 협업하여 GitOps CD 기능을 제공한다. 이 구성 요소를 이해하면 ArgoCD가 어떻게 Git과 클러스터 상태를 지속적으로 동기화하는지 자연스럽게 이해할 수 있다.
ArgoCD 아키텍처
argocd-server 역할
ArgoCD의 진입점이다.
UI 대시보드를 제공해 애플리케이션 상태, Sync 여부, 리소스 구조 등을 시각적으로 확인할 수 있다.
CLI, REST API 요청을 받아 인증 및 인가 처리를 수행한다.
사용자의 Sync 요청, 롤백 요청 등을 받아 application-controller에게 전달한다.
즉, 사용자가 ArgoCD를 바라보는 모든 인터페이스(웹/UI/API)는 argocd-server를 통해 이루어진다.
repo-server 역할
repo-server는 GitOps의 핵심 엔진이다.
Git 리포지토리를 clone 혹은 pull 하여 최신 상태를 가져온다.
Helm chart, Kustomize, Jsonnet 등을 렌더링하여 실제 쿠버네티스 manifest를 생성한다.
이 manifest는 application-controller가 클러스터와 비교하는 기준이 된다.
repo-server를 별도 Pod로 운영하는 이유는 Git 렌더링 과정이 무겁기 때문이다. 분리함으로써 병렬 처리 및 성능을 확보할 수 있다.
application-controller 역할
ArgoCD의 두뇌이자 GitOps 동기화의 핵심이다.
repo-server가 렌더링한 manifest를 읽는다.
실제 클러스터 상태를 Kubernetes API를 통해 조회한다.
두 상태를 비교(Diff)하여 OutOfSync 여부를 판단한다.
Sync 정책에 따라 자동/수동으로 클러스터에 변경을 적용한다.
Health Check를 통해 Pod readiness, ReplicaSet 안정성 등을 모니터링한다.
application-controller가 있기 때문에 ArgoCD는 언제나 클러스터 상태를 Git과 동일하게 유지하려고 한다.
ArgoCD Application 개념
ArgoCD에서 가장 중요한 리소스가 바로 Application 이다. Application은 하나의 배포 단위를 의미하며, 어떤 Git 경로를 사용할지, 어떤 클러스터에 배포할지, 어떤 Helm values를 사용할지를 명확하게 정의한다.
왜 서비스별로 Application을 나누는가
서비스별 Application 분리는 GitOps의 핵심 원칙과 운영 효율성 모두에서 중요한 요소이다.
서비스별로 독립적으로 배포되어야 한다
각 서비스는 서로 다른 리소스(deployment/service/configmap 등)를 가진다
롤백, Sync, diff도 서비스 단위로 수행하는 것이 안전하다
오류가 발생했을 때 어느 서비스인지 구분 가능해야 한다
예를 들어 around-api, privacy-api, batch-service는 서로 완전히 별도의 실행 환경과 설정을 가지므로 각각을 Application으로 정의해야 한다.
환경별(dev/stage/prod)로 Application을 분리하는 이유
환경은 배포 전략이 다르고 위험도도 다르다. 따라서 동일 서비스라도 환경별로 Application을 따로 운영하는 것이 정석이다.
실무 기준으로 보면:
dev: 자동 sync, prune on
stage: 자동 sync 또는 제한적 자동 sync
prod: manual sync, prune off
또한 환경별 values.yaml을 적용해야 하므로 Application을 구분해주어야 한다.
Monorepo 구조에서의 Application 묶음 관리
Monorepo를 사용할 경우 다음과 같은 구조가 일반적이다:
이때 각 서비스 디렉토리를 기준으로 Application을 자동 생성하는 ApplicationSet을 활용한다. ApplicationSet은 Monorepo의 디렉토리 구조를 기반으로 서비스 수만큼의 Application을 자동 생성할 수 있어, 대규모 조직에서 효율적인 GitOps 구조를 만들 수 있다.
GitOps 환경에서의 배포 흐름 이해
ArgoCD를 제대로 이해하려면 GitOps 기반 배포가 어떤 흐름으로 이루어지는지 관점이 매우 중요하다. 특히 다음 두 가지가 중심이다:
이미지 태그(image tag) 변경 → 배포
Helm chart/values.yaml 변경 → 배포
master 변경 → 이미지 빌드 → tag 업데이트 → ArgoCD Sync
서비스의 코드가 변경되면 CI(Jenkins, GitHub Actions 등)가 다음을 수행한다:
코드를 빌드하여 Docker 이미지를 생성한다
새로운 image tag를 부여한다 (예: 1.4.3, git hash 기반 등)
Docker registry에 push한다
Helm values.yaml 또는 manifest에 새 tag로 업데이트한다
이 commit이 master에 merge
ArgoCD가 변경된 Git 상태를 감지
diff → OutOfSync → Sync → 배포
image tag란 무엇인가
image tag는 실행 가능한 Docker 이미지의 버전이며 서비스의 상태를 정의하는 핵심 값이다. Kubernetes Deployment는 image tag가 바뀌어야 rollout을 시작하기 때문에 태그 변경은 배포의 트리거 역할을 한다.
tag는 언제 어떻게 변경되는가
코드가 변경되어 새 build가 발생할 때
values.yaml이 변경되어 환경 설정이 바뀔 때
서비스 재배포가 필요할 때 대부분의 팀은 자동 빌드 시스템을 통해 tag를 생성하고 업데이트한다.
CI와 CD의 역할 분리
CI: Docker 이미지 생성, push, values.yaml 업데이트
CD(ArgoCD): 값이 업데이트된 Git을 읽고 배포 수행
GitOps에서는 배포의 최종 결정권이 CI가 아니라 Git에 있다.
Helm Chart & values.yaml 변경에 따른 동작
Helm Chart와 values.yaml은 쿠버네티스 환경에서 애플리케이션 구성을 정의하는 중요한 파일이다. 여기에는 환경변수, 포트, 이미지 정보, 리소스 설정 등 서비스 실행에 필수적인 설정이 포함된다. GitOps 환경에서 Helm Chart 변경이 발생하면 Jenkins나 ArgoCD를 수동으로 수정하지 않아도 재배포가 일어나는 이유는 바로 ArgoCD의 렌더링 및 Diff 감지 메커니즘 덕분이다.
Helm chart 구조 변경 시 ArgoCD가 감지하는 방식
Helm chart를 수정하면 두 가지 변화가 생긴다.
템플릿(template) 구조 변화
deployment.yaml, service.yaml 등 템플릿 구조가 바뀌면 ArgoCD는 렌더링된 결과물의 차이를 감지한다.
values.yaml 변화
replica 수, 환경 변수 등 값이 변경되면 템플릿에 적용된 실제 manifest가 달라지므로 diff가 발생한다.
ArgoCD는 이러한 변화를 다음 단계로 감지한다:
repo-server가 Git의 변경된 commit을 자동 감지
변경된 Helm chart를 다시 렌더링하여 manifest 생성
기존 클러스터 상태와 비교
차이가 있으면 OutOfSync 상태 표시
Sync 정책에 따라 자동 또는 수동으로 배포
따라서 Helm chart 변경은 Jenkins 개입 없이도 배포 트리거가 될 수 있다.
values.yaml 변경이 자동으로 재배포되는 이유
values.yaml은 서비스 동작에 필요한 실제 구성 값을 정의한다. 예를 들어 다음과 같다:
이 값이 변경되면:
Helm chart 렌더링 결과물이 변경되고
ArgoCD는 diff를 감지하여 OutOfSync로 표시한다
자동 Sync인 경우 즉시 재배포
수동 Sync인 경우 관리자가 버튼을 눌러 배포
즉, 개발자가 Jenkins나 kubectl을 직접 실행하지 않아도 Git에 변경이 있으면 ArgoCD가 이를 자동으로 감지하고 배포 프로세스를 시작한다. 이것이 GitOps 운영의 가장 큰 장점이다.
개발자가 Jenkins/ArgoCD를 건드리지 않아도 배포가 되는 원리
핵심 원리는 다음과 같다:
Git이 단일 진실 소스이다 ArgoCD는 Git 변경을 기준으로 클러스터 상태를 조정한다.
repo-server가 지속적으로 Git을 모니터링한다 변경이 발생하면 자동으로 manifest를 재생성한다.
application-controller가 diff를 감지한다 값이나 템플릿이 조금이라도 다르면 OutOfSync 상태가 된다.
자동 Sync 정책이 있는 경우 즉시 배포가 이루어진다
이 원리 덕분에 개발자는 배포 툴을 조작할 필요 없이 Git commit만 하면 된다. 특히 Dev 환경에서는 이 자동화가 개발 속도를 크게 높여준다.
ArgoCD Sync 메커니즘의 깊은 이해
ArgoCD의 Sync(Synchronization) 기능은 GitOps 운영의 핵심이다. Sync는 Git에 선언된 상태(Desired State)를 클러스터의 실제 상태(Actual State)와 맞추는 과정이다.
자동 Sync vs 수동 Sync
자동 Sync (Automatic Sync)
Git에 변경이 생기면 ArgoCD가 자동으로 Sync를 실행한다. 특징:
개발 속도 빠름
자동으로 배포가 이루어짐
Self Heal, Prune 옵션과 함께 사용하면 완전한 GitOps 구현 가능 실무에서는 dev, stage 환경에서 많이 사용된다.
수동 Sync (Manual Sync)
Git 변경은 감지하지만 Sync는 바로 실행하지 않는다. 특징:
운영자가 직접 Sync 버튼을 눌러야 배포가 진행
prod 환경에서 주로 사용
실수로 잘못된 설정이 배포되는 위험을 방지
환경별 추천 Sync 정책은 다음과 같다:
dev
automatic sync + prune + self-heal
stage
automatic 또는 manual (팀 정책에 따라)
prod
manual sync + prune off + self-heal on
Prune, Self Heal, Diff 계산
Prune이 필요한 이유
Prune은 Git에는 존재하지 않는 리소스를 클러스터에서 삭제하는 기능이다. 예를 들어 Git에서 ConfigMap을 제거하면 실제 클러스터에서도 삭제해야 한다. Prune이 없으면 “좀비 리소스”가 남아 오작동을 일으킬 수 있다.
다만 prod 환경에서 Prune은 신중해야 한다. Git commit 실수로 리소스를 지웠을 때 실제 리소스가 삭제되는 사고가 발생할 수 있기 때문이다.
Self Heal의 강력함과 주의점
Self Heal은 클러스터에서 사람이 kubectl로 수동 수정한 값을 ArgoCD가 즉시 감지하고 Git 상태로 되돌리는 기능이다. 실수나 임시 조작을 방지하기 때문에 강력하지만 다음 문제도 있다:
운영자가 수동 조작한 내용을 되돌려버릴 수 있음
긴급 패치가 필요한 상황에서는 임시로 기능을 끌 필요 있음
신입 개발자가 실수로 helm upgrade나 kubectl apply를 실행하더라도 Self Heal이 있으면 Git 기준으로 복원되기 때문에 조직 내 운영 규칙을 강하게 enforcing할 수 있다.
ArgoCD가 Diff를 계산하는 방식
ArgoCD는 다음 단계를 거쳐 diff를 계산한다:
repo-server에서 Git의 manifest 렌더링
Kubernetes API를 통해 실제 리소스 YAML 조회
운영에 필요 없는 필드(status, annotations 등) 제외
순수 값 차이만 비교
차이가 있으면 OutOfSync 발생
Diff 기능 덕분에 GitOps 운영에서 모든 변경이 투명해지고, 실수나 설정 누락이 줄어든다.
OutOfSync, 롤백 동작 원리
Sync와 함께 가장 많이 마주치는 상태가 바로 OutOfSync이다.
OutOfSync는 무엇을 의미하는가
OutOfSync는 다음을 의미한다:
Git 선언 값과 클러스터의 실제 값이 다르다
배포가 필요하다
또는 사람이 클러스터에 수동 수정했다
대표적인 OutOfSync 원인은 다음과 같다:
image tag 변경
values.yaml 변경
helm chart 템플릿 변경
사람이 kubectl edit, apply 등으로 수동 수정
Git에 리소스가 삭제되었는데 prune되지 않은 경우
Sync를 통해 어떤 일이 일어나는가
Sync가 실행되면:
Git에서 manifest 재생성
Diff 비교
변경된 부분만 apply
필요 시 신규 리소스 생성, 수정
prune 옵션 시 삭제까지 진행
Sync가 성공하면 상태는 Healthy / Synced로 표시된다.
Git 롤백과 ArgoCD 롤백의 차이
Git 롤백
Git commit을 revert
ArgoCD는 새로운 Git 상태를 읽고 Sync
가장 안전하고 GitOps 원칙에 맞음
ArgoCD UI 롤백
Application history에서 이전 revision 선택
해당 리소스를 직접 복원하여 Sync
Git 기록과 달라질 수 있어 주의 필요
실무에서는 Git 롤백 방식이 권장된다.
실무 적용 사례와 고급 기능
ArgoCD는 단순히 GitOps 배포 자동화 도구에 그치지 않는다. 규모가 있는 조직에서는 여러 클러스터를 운영하고, 안전한 비밀 관리(Secret), 대규모 서비스 운영, 카나리·블루그린 배포 등 고급 기능까지 필요하다. 이 Part에서는 실제 운영 환경에서 ArgoCD가 어떻게 활용되는지, 그리고 GitOps 관점에서 어떤 확장 기능을 사용해야 하는지를 다룬다.
여러 클러스터를 관리하는 구조
ArgoCD는 하나의 인스턴스만으로 여러 클러스터를 관리할 수 있다. 이것은 GitOps 환경에서 매우 중요한 기능이다. 관리되는 클러스터가 늘어나도 운영 복잡도를 크게 줄여준다.
관리 클러스터 vs 타깃 클러스터 구조
일반적으로 다음과 같은 구조를 사용한다:
관리 클러스터(Management Cluster)에 ArgoCD를 설치하고, Dev/Stage/Prod 같은 타깃 클러스터(Target Cluster)를 연결한다. 이 방식의 장점은 다음과 같다:
ArgoCD가 장애나 업데이트로 중단되더라도 Prod 클러스터는 영향을 받지 않는다
중앙에서 모든 클러스터 상태를 관찰하고 관리할 수 있다
RBAC와 보안 정책을 일원화하여 운영 가능
특히 Prod 클러스터에 ArgoCD를 직접 설치하지 않는 구조가 안전하게 운영되는 일반적인 패턴이다.
클러스터 추가 방법과 운영 전략
클러스터를 ArgoCD에 추가하려면 간단히 다음 명령을 수행한다:
ArgoCD는 해당 클러스터에 접근하기 위한 ServiceAccount, Role, RoleBinding을 자동 생성한다. 이 방식은 Multi-Cluster 환경에서 GitOps를 확장하는 데 매우 적합하다.
운영 전략은 다음과 같이 구분할 수 있다:
Dev/Stage: 자동 Sync + prune + self-heal
Prod: 수동 Sync + self-heal on + prune off
민감한 네임스페이스는 read-only 권한으로 제한
Secret을 안전하게 관리하는 방법
GitOps 방식에서는 모든 설정이 Git에 저장되지만, Secret만큼은 예외이다. 민감 정보를 Git에 그대로 올리는 것은 절대 금지이기 때문에 여러 암호화/외부 연동 전략이 필요하다.
Sealed Secrets
Sealed Secrets는 Secret을 공개키로 암호화해 Git에 저장할 수 있게 해준다. 복호화는 클러스터 내부 컨트롤러가 수행하며 외부에서는 원문을 확인할 수 없다.
장점:
GitOps 원칙 준수
설치와 사용이 간단
단점:
복호화 컨트롤러가 동작하지 않으면 Secret 생성 불가
External Secrets Operator (ESO)
요즘 가장 많이 사용되는 방식이다. Secret을 Git에 암호화된 형태로 저장하는 대신, AWS Secrets Manager, GCP Secret Manager 등 외부 저장소를 사용한다.
예시:
특징:
Git에는 Secret 정보가 저장되지 않음
보안팀 정책을 완벽하게 준수
Secret 회전(rotation)이 쉬움
ArgoCD는 ExternalSecret CRD만 관리
SOPS
SOPS는 특정 YAML 파일의 민감 정보 부분만 선택적으로 암호화할 수 있다. AWS KMS, GPG Key 등 다양한 키 관리 시스템과 연동된다.
장점:
세밀한 암호화 가능
GitOps와 완벽하게 통합
ApplicationSet과 Argo Rollouts
규모가 커질수록, ArgoCD Application을 하나씩 사람이 만들어주는 것은 불가능하다. 또한 배포 전략도 롤링 업데이트만으로는 충분하지 않을 수 있다. 이때 ApplicationSet과 Argo Rollouts가 필수 요소가 된다.
ApplicationSet의 필요성과 구조
ApplicationSet은 다음과 같은 환경에 특히 적합하다:
Monorepo에서 수십 개 서비스가 존재하는 경우
여러 지역/여러 클러스터에 동일 앱을 배포해야 하는 경우
매번 application yaml을 생성하는 대신 자동화가 필요한 경우
ApplicationSet은 “generator”를 기반으로 Application을 자동 생성한다. 예시:
이 설정은 services/* 안에 있는 모든 디렉토리를 Application으로 변환한다. 서비스가 추가되면 Application도 자동으로 생성된다.
Argo Rollouts로 카나리/블루그린 구현하기
ArgoCD는 배포 자체를 담당하지만, 롤링 업데이트 이상의 전략은 제공하지 않는다. 고급 배포 전략이 필요하다면 Argo Rollouts를 사용해야 한다.
Rollouts는 Deployment 대신 Rollout 리소스를 사용하며, 다음 기능을 제공한다:
카나리 배포
블루그린 배포
트래픽 분할 (Istio, NGINX, SMI 등)
메트릭 기반 자동 롤백
Pause/Resume 단계적 배포
예시 (카나리 전략):
실무에서는 다음과 같이 조합된다:
ArgoCD → GitOps 배포 자동화
Argo Rollouts → 배포 전략/트래픽 제어
Monorepo에서 ArgoCD 운영하기
Monorepo 구조는 코드가 한 레포에 모여 있어 관리가 명확하지만, 서비스별 배포 단위 분리가 필요하다. ArgoCD는 Monorepo 환경을 다루기에 매우 적합하며, ApplicationSet과 함께 사용하면 대규모 서비스도 쉽게 관리할 수 있다.
서비스 디렉토리 구조 설계
예시:
서비스별 소스와 배포 선언을 분리해두면 diff 계산 및 배포 단위가 명확해진다.
ApplicationSet 자동 생성 전략
ApplicationSet을 사용하면 디렉토리 기반 자동 Application 생성이 가능하다:
services/* → 각 서비스별 Application 생성
deployments/dev/* → dev 환경 Application 자동 생성
deployments/prod/* → prod 환경 Application 자동 생성
이 구조는 서비스가 10개든 100개든 관리 비용이 동일하다.
서비스 변경만 배포하도록 구성하는 방법
CI 단계에서 “어떤 서비스가 변경되었는가?”를 분석하고 해당 서비스의 values.yaml만 업데이트하여 commit하면 된다.
ArgoCD는 그 commit 변화만 감지해 필요한 서비스만 배포한다. 즉, Monorepo지만 불필요한 모든 서비스를 재배포하지 않는다.
ArgoCD를 적용했을 때의 전체 배포 흐름 정리
ArgoCD 기반 GitOps 배포는 다음 흐름으로 구성된다:
개발자가 코드를 수정하고 PR을 생성한다
master에 merge되면 CI(Jenkins/GitHub Actions)가 Docker 이미지를 빌드한다
새로운 image tag를 생성해 레지스트리에 push한다
CI 파이프라인이 Helm values.yaml(또는 manifest)에 새 tag를 업데이트한다
Git 변경 사항이 commit → master merge
ArgoCD repo-server가 Git 변경을 감지한다
Helm 템플릿을 렌더링하고 application-controller가 Diff를 계산한다
OutOfSync 발생
자동 또는 수동 Sync 실행
쿠버네티스에 새로운 배포가 적용되며 ArgoCD UI에서 Healthy/Synced 상태 확인
ArgoCD는 Git 변경을 기준으로 클러스터의 상태를 자동 조정하며, 오류 또는 수동 변경에 대해서도 즉시 감지하거나 자동 복구(Self Heal)한다.
신입 개발자가 반드시 알아야 할 핵심 개념
ArgoCD를 도입한 팀에서 신입 개발자가 빠르게 적응하려면 다음 개념을 반드시 이해해야 한다.
Git이 진실의 원천이다
ArgoCD 환경에서는 배포는 Git에서 결정된다. kubectl로 임의로 수정하는 것은 원칙적으로 금지되며, 모든 변경은 Git commit을 통해 이루어져야 한다.
이 구조를 이해하면 ArgoCD가 왜 Diff를 감지하고, 왜 Self Heal로 되돌리는지 명확해진다.
image tag는 배포 트리거이다
코드 변경이 실제 배포에 반영되려면 반드시 image tag가 변경되어야 한다. CI에서 tag를 생성하는 규칙을 조직마다 다르게 정의할 수 있으나 다음 원칙은 공통이다:
tag는 자동으로 증가해야 한다
tag는 한 번 생성되면 변경되지 않아야 한다 (immutable)
latest 사용 금지
ArgoCD는 이미지 빌드가 아니라 “tag 변경”을 기준으로 배포를 판단한다.
Helm chart 변경도 배포 트리거이다
Helm 템플릿이나 values.yaml이 바뀌면 그것 자체가 서비스 구성의 변화이기 때문에 ArgoCD는 diff를 감지하고 배포를 진행한다. 이는 Jenkins 개입 없이도 이루어지며, 개발자는 Git commit만 하면 된다.
환경별 Application 분리
개발/스테이지/운영 환경은 Sync 정책과 위험도가 완전히 다르다. 따라서 ArgoCD는 Application을 환경별로 분리해야 한다.
일반적인 구성은 다음과 같다:
around-api-dev
around-api-stage
around-api-prod
이렇게 구성하면 환경별 정책(자동 sync/mannual sync, prune 여부 등)을 명확하게 나눌 수 있다.
Secret은 Git에 올리지 않는다
GitOps에서 Secret은 반드시 암호화하거나 외부 비밀 저장소로 관리해야 한다.
신입 개발자는 다음 두 가지 방식 중 하나를 팀 정책에 따라 학습해야 한다:
Sealed Secrets
External Secrets Operator
둘 중 하나만 익혀도 GitOps 환경에서 비밀을 안전하게 유지할 수 있다.
실무에서 흔히 겪는 문제와 해결 방법
ArgoCD를 막 도입했거나 신입 개발자가 자주 겪는 문제들을 정리하면 다음과 같다.
개발자가 kubectl로 수정했는데 왜 원래대로 돌아오나요?
ArgoCD Self Heal 기능이 동작한 결과이다. Git과 클러스터 상태가 달라지면 ArgoCD는 자동으로 Git 상태로 복원한다.
해결 방법:
실무에서는 “kubectl 패치를 하지 않는다”는 운용 규칙을 명확히 한다.
긴급 패치가 필요한 경우 Self Heal 옵션을 일시적으로 끈 뒤 작업한다.
ArgoCD가 OutOfSync라고 뜨는데 왜 배포가 안 되나요?
가능한 원인은 다음과 같다:
Sync 정책이 manual이다
values.yaml만 변경되고 image tag는 변경되지 않았다
prune이 꺼져 있어서 리소스 삭제가 반영되지 않는다
helm chart 구조 변경으로 orphan 리소스가 남아있다
해결 방법:
UI에서 Sync 버튼을 눌러 배포 진행
또는 Git 상태를 다시 확인하여 commit 정상 여부 확인
prod에 위험한 변경이 들어가면 어떻게 하나요?
ArgoCD는 GitOps 기반이므로 Git 변경 자체가 배포의 기준이 된다. 따라서 prod에는 다음 정책을 반드시 둬야 한다:
prod branch는 보호(branched protected)
deploy 승인 절차 필수
manual sync + prune off
image tag는 immutable
운영자만 sync 권한 보유
이 구성대로라면 prod에서 실수로 큰 사고가 날 가능성이 줄어든다.
ArgoCD와 Monorepo 운영의 결합
Monorepo는 하나의 레포 안에 여러 서비스가 있는 구조로 대규모 조직에서 흔히 사용된다. ArgoCD는 다음 방식으로 Monorepo와 결합하면 효율이 매우 높아진다.
서비스 디렉토리 기준 Application 분리
예:
각 디렉토리가 하나의 Application이 된다.
이렇게 하면:
서비스별 배포가 독립된다
diff 범위가 명확하다
CI에서 어떤 서비스가 수정되었는지 쉽게 판단 가능
ApplicationSet을 사용한 자동 Application 생성
ApplicationSet의 git-directory generator를 사용하면 services/* 디렉토리의 개수만큼 자동으로 Application이 생성된다.
이 방식은 다음과 같은 이점이 있다:
서비스 추가 시 Application yaml 파일을 만들 필요가 없다
삭제하면 자동 제거
디렉토리 구조를 그대로 배포 단위로 활용
대규모 조직에서는 사실상 필수적인 기능이다.
변경된 서비스만 배포하는 구조 만들기
CI 단계에서 diff를 분석해 특정 서비스만 수정되었는지 판단한 다음, 해당 서비스의 Helm values.yaml만 업데이트하면 된다. ArgoCD는 Git 변경을 감지하여 해당 서비스만 OutOfSync 처리한다.
이런 방식 덕분에 Monorepo에서도 불필요한 재배포가 일어나지 않는다.
Last updated