1. ArgoCD란
ArgoCD(Argo Continuous Delivery)는 GitOps 원칙을 기반으로 Kubernetes 환경에서 애플리케이션 배포를 자동화하는 도구입니다. 애플리케이션의 실제 상태(Actual State)를 Git 저장소의 선언적 설정(Desired State)과 지속적으로 동기화하여, Git 저장소에 변경이 발생하면 자동으로 Kubernetes 클러스터에 반영합니다. ArgoCD의 주요 특징은 다음과 같습니다.
- GitOps 기반 배포: 모든 배포 설정과 변경 이력을 Git 저장소 하나에 관리하며, 모든 배포 이력 추적 가능
- Declarative Configuration: Helm, Kustomize, Jsonnet 등 다양한 방식 지원
- 자동 동기화: Git 커밋 시 자동 배포 및 롤백 지원
- UI/CLI/API 제공: 웹 대시보드, CLI, API를 통한 다양한 접근 가능
- RBAC & SSO 지원: LDAP, OIDC 등 다양한 인증 체계와 통합
결국 ArgoCD는 'Git 변경 = 자동 배포'의 흐름을 구축함으로써 운영자가 명령어를 직접 실행하지 않아도 안정적인 배포 자동화를 구현할 수 있도록 도와줍니다.
2. HA 모드가 필요한 이유
일반적인 ArgoCD 단일 인스턴스 환경에서는 하나의 서버가 모든 역할을 수행합니다.
이 경우 서버 다운, Pod 장애, 노드 장애 등의 상황이 발생하면 ArgoCD 서비스 전체가 중단될 수 있습니다.
특히 대규모 Kubernetes 클러스터나 다수의 애플리케이션을 관리하는 환경에서는 단일 서버로는 안정적인 운영이 어렵기 때문에 배포 신뢰성과 운영 효율성을 위해 고가용성(HA, High Availability) 구성을 권장합니다.
HA 모드가 필요한 대표적인 이유는 다음과 같습니다:
- 장애 복구 속도 향상: 하나의 인스턴스 장애 시, 다른 인스턴스가 즉시 트래픽을 이어받음
- 무중단 운영: 관리 서버 재시작이나 업데이트 중에도 ArgoCD UI 및 Sync 기능이 유지
- 확장성: 여러 인스턴스가 동시에 Sync 작업을 처리하여 성능 향상
- 안정적인 Git 동기화: Controller 또는 Repo Server 장애로 인한 동기화 지연 방지
3. ArgoCD HA 핵심 구성요소
ArgoCD HA 모드에서는 여러 컴포넌트가 수평 확장(Replication) 또는 클러스터링(Leader Election) 형태로 동작합니다.
핵심 구성요소는 다음과 같습니다.
| argocd-server | 사용자 요청 처리 (API/UI) | 여러 인스턴스 복제 + 로드밸런서 Leader Election 기반 1 active + N standby 구조 |
| argocd-repo-server | Git 저장소와 통신하여 매니페스트 렌더링 | |
| argocd-application-controller | 실제 상태와 Git 상태 동기화 | |
| argocd-redis & redis-ha | 캐시/세션 관리 | Sentinel 기반 HA 구성 (3 replica 권장) |
| argocd-dex-server | SSO 인증 관리 | 여러 replica로 확장 가능 (stateless) |

ArgoCD HA 환경에서는 단일 Pod 장애에도 영향을 최소화하며, 각 역할이 독립적으로 복구 가능한 구조를 가집니다.
4. ArgoCD 서버 설치 및 동작 확인 (HA+자체 관리)
실습 순서
- Argo CD를 HA 모드로 설치
- Argo CD가 자기 자신을 Application으로 관리하도록 등록
- 샘플 애플리케이션 Git 저장소에 커밋 → 자동 Sync 동작 확인
4-1. 실습 클러스터 설치 (HA를 위한 worker node 3대)
kind create cluster --name myk8s --image kindest/node:v1.32.8 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30000
hostPort: 30000
- containerPort: 30001
hostPort: 30001
- containerPort: 30002
hostPort: 30002
- containerPort: 30003
hostPort: 30003
- role: worker
- role: worker
- role: worker
EOF
4-2. yaml 파일 작성 및 배포
cat << EOF > resources/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: argocd
EOF
kubectl apply -f resources/namespace.yaml
wget https://raw.githubusercontent.com/argoproj/argo-cd/refs/heads/master/manifests/ha/install.yaml
mv install.yaml resources/
kubectl apply -f resources/install.yaml -n argocd

4-3. 원격 리포지터리(github)에 커밋, 푸시
git add . && git commit -m "Deploy Argo CD " && git push -u origin main
4-4. argocd cli 설치 및 로그인
VERSION=$(curl -L -s https://raw.githubusercontent.com/argoproj/argo-cd/stable/VERSION)
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/download/v$VERSION/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64
argocd version --client
kubectl port-forward svc/argocd-server -n argocd 8080:80
argocd login 127.0.0.1:8080 --username admin --password Bf6456s5UgZ0NEvI
4-5. argocd repo 등록 및 argocd application 생성 (자기 자신을 애플리케이션으로 관리)
argocd repo add https://github.com/ria-choi/argocd-sample-app \
--username ria-choi \
--password PASSWORD
cat <<EOF | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: argocd
namespace: argocd
spec:
project: default
source:
path: resources
repoURL: https://github.com/ria-choi/argocd-sample-app
targetRevision: main
syncPolicy:
automated: {}
destination:
namespace: argocd
server: https://kubernetes.default.svc
EOF
kubectl get applications.argoproj.io -n argocd -owide
NAME SYNC STATUS HEALTH STATUS REVISION PROJECT
argocd Synced Healthy 73cbd5d8bfae25c3937ffefd589c8b84c2ca9142 default
4-6. 커밋으로 argocd 자동 적용 되는지 확인 (networkpolicy 삭제하고 변화보기)
[networkpolicy 삭제 전 상태]
kubectl get networkpolicies.networking.k8s.io -n argocd
NAME POD-SELECTOR AGE
argocd-application-controller-network-policy app.kubernetes.io/name=argocd-application-controller 29m
argocd-applicationset-controller-network-policy app.kubernetes.io/name=argocd-applicationset-controller 29m
argocd-dex-server-network-policy app.kubernetes.io/name=argocd-dex-server 29m
argocd-notifications-controller-network-policy app.kubernetes.io/name=argocd-notifications-controller 29m
argocd-redis-ha-proxy-network-policy app.kubernetes.io/name=argocd-redis-ha-haproxy 29m
argocd-redis-ha-server-network-policy app.kubernetes.io/name=argocd-redis-ha 29m
argocd-repo-server-network-policy app.kubernetes.io/name=argocd-repo-server 29m
argocd-server-network-policy app.kubernetes.io/name=argocd-server 29m
.... resources/install.yaml에서 networkpolicy 지우기....
[commit 후 networkpolicy 목록 확인]
git add . && git commit -m "Delete Network Policy Resource" && git push -u origin main
argocd app sync argocd --prune --force # 바로 sync 실행
kubectl get networkpolicies.networking.k8s.io -n argocd
No resources found in argocd namespace.
5. ArgoCD 컴포넌트별 고가용성 상세 설정 방법
Argo CD는 대부분의 컴포넌트가 무상태(stateless)로 설계되어 있어, 레플리카 수만 늘려도 손쉽게 고가용성 구성이 가능합니다.
5.1 API 서버 (argocd-server)
- 사용자 요청을 처리하는 API와 UI 서버입니다.
- stateless 구조이기 때문에 Replica 수만 늘리면 손쉽게 확장 및 고가용성 구성이 가능합니다.
- 트래픽은 Ingress나 LoadBalancer로 분산시키면 됩니다.
- 또한 ARGOCD_API_SERVER_REPLICAS 환경변수를 사용하면 무차별 대입(Brute-force) 공격에 대한 제한 계산을 Replica 단위로 분산시킬 수 있습니다. 즉, Replica 수를 늘릴수록 로그인 시도 제한이 분산되어 보안성과 안정성이 함께 향상됩니다.
5-2. 리포지터리 서버 (argocd-repo-server)
- Git에서 매니페스트를 생성하는 역할을 담당하며, Argo CD에서 가장 리소스를 많이 사용하는 컴포넌트입니다.
- 애플리케이션이 수천 개 규모라면 서버 10대 이상이 필요할 수 있으며, 각 인스턴스당 CPU 4~5개, 메모리 8~10 GB 할당이 권장됩니다.
- 일반적인 환경에서는 Replica 3개 구성이 안정적입니다.
- 매니페스트 생성 지연을 방지하기 위해 timeout 설정(ARGOCD_EXEC_TIMEOUT)도 조정해 주는 것이 좋습니다.
5-3. 애플리케이션 컨트롤러 (argocd-application-controller)
- Argo CD의 핵심 엔진으로, Git 상태와 클러스터 상태를 동기화합니다.
- v1.8 이후부터 여러 Replica 구성이 가능해졌으며, 각 인스턴스가 클러스터별로 나뉘어 작업을 병렬 처리합니다.
- 대규모 환경에서는 Sharding을 활용해 Controller 부하를 나누는 것이 효율적입니다.
5-4. Redis 서버
- 일회성 캐시이지만, 매니페스트를 캐싱하여 성능을 크게 개선합니다.
- 커밋 SHA를 키로 사용하기 때문에 새로운 커밋이 있을 때만 캐시가 갱신됩니다.
- 3개 레플리카(마스터 1 + 슬레이브 2) 와 HAProxy 구성이 일반적입니다.
5-5. Dex 서버
- 외부 인증(OIDC, LDAP, SSO 등)을 위임받아 처리하는 컴포넌트입니다.
- 인메모리 캐시 기반이라 일반적으로 하나의 인스턴스만 사용합니다.
- Dex가 잠시 중단되더라도 Argo CD 자체 동작은 유지되며, 로그인만 일시적으로 제한됩니다.
'CI&CD' 카테고리의 다른 글
| [CI/CD] OpenLDAP + KeyCloak + Argo CD + Jenkins 구축 과정 (1) | 2025.11.23 |
|---|---|
| [ArgoCD] Vault 플러그인으로 인증 관리하기 (0) | 2025.11.11 |
| [CI/CD] Tekton + ArgoCD로 만드는 CI/CD 파이프라인 (1) | 2025.11.01 |
| [Helm] ConfigMap 변경 감지 기반 자동 롤링 업데이트 구현 (0) | 2025.10.22 |
| [Shipwright] Docker 없이 Kubernetes에서 컨테이너 이미지 빌드하기 (0) | 2025.10.16 |