반응형
ArgoCD 기본 개념과 원리
ArgoCD란?
ArgoCD는 Kubernetes를 위한 선언적(Declarative) GitOps 지속적 배포(CD) 도구입니다. Git 저장소에 정의된 애플리케이션 매니페스트를 기반으로 Kubernetes 클러스터의 실제 상태를 원하는 상태와 자동으로 동기화합니다.
GitOps 패러다임
GitOps의 핵심 원칙
- 선언적 구성: 모든 애플리케이션과 인프라 설정을 YAML 등의 선언적 형태로 정의
- Git을 단일 진실 공급원으로 사용: 모든 변경사항은 Git 저장소를 통해 관리
- 자동화된 배포: Git 변경사항을 감지하여 자동으로 클러스터에 적용
- 지속적인 동기화: 실제 상태와 원하는 상태 간의 차이를 지속적으로 감지하고 수정
CI/CD 분리와 ArgoCD의 역할
CI와 CD의 명확한 분리
CI (Continuous Integration) - 별도 처리
코드 변경 → Git Push → CI 파이프라인 (Jenkins/GitHub Actions/GitLab CI)
→ 빌드/테스트 → 컨테이너 이미지 생성 → 이미지 레지스트리 Push
→ 매니페스트 파일의 이미지 태그 업데이트 → Git Push
CD (Continuous Deployment) - ArgoCD 담당
매니페스트 변경 감지 → ArgoCD Sync → Kubernetes 클러스터 배포
기존 CI/CD와의 차이점
기존 Push 방식 (CI/CD)
개발자 → Git Push → CI 파이프라인 → 빌드/테스트 → 클러스터에 직접 배포
GitOps Pull 방식 (ArgoCD)
개발자 → Git Push → ArgoCD Agent가 변경사항 감지 → 클러스터 내부에서 배포
ArgoCD가 감지하는 변경사항
ArgoCD는 다음 두 가지 방식으로 변경을 감지합니다:
- 매니페스트 파일 변경: YAML 파일 자체가 변경될 때
- 이미지 태그 변경: 매니페스트 내 이미지 태그가 업데이트될 때
# CI 파이프라인이 이 부분을 업데이트
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: airflow-worker
image: myregistry/airflow:v2.5.1 # ← 이 태그가 변경되면 ArgoCD가 감지
중요: 소스 코드만 변경되어도 CI 과정 없이 바로 배포되지는 않습니다. 반드시 CI를 통해 이미지를 빌드하고 매니페스트를 업데이트해야 ArgoCD가 배포를 수행합니다.
ArgoCD의 핵심 구성 요소
1. Repository
Git 저장소와 ArgoCD를 연결하는 설정입니다.
apiVersion: v1
kind: Secret
metadata:
name: private-repo
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
stringData:
type: git
url: https://github.com/company/data-infrastructure
username: token
password: ghp_xxxxxxxxxxxx
데이터 엔지니어링에서의 Repository 구조 예시:
data-infrastructure/
├── airflow/
│ ├── dags/
│ └── helm-values/
├── kafka/
│ └── cluster-config/
├── spark/
│ └── applications/
└── monitoring/
└── prometheus-rules/
2. Project
팀별, 환경별 권한 관리와 정책을 정의합니다.
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: data-engineering
namespace: argocd
spec:
description: "데이터 엔지니어링 팀 프로젝트"
# 허용된 소스 저장소
sourceRepos:
- 'https://github.com/company/data-infrastructure'
- 'https://github.com/company/airflow-dags'
# 배포 가능한 클러스터와 네임스페이스
destinations:
- namespace: 'data-*'
server: https://kubernetes.default.svc
- namespace: airflow
server: https://prod-cluster-api
# 허용된 Kubernetes 리소스
namespaceResourceWhitelist:
- group: 'apps'
kind: Deployment
- group: 'batch'
kind: CronJob
- group: ''
kind: ConfigMap
# 거부된 리소스 (보안상 중요)
namespaceResourceBlacklist:
- group: ''
kind: Secret
3. Application
실제 배포 단위를 정의합니다.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: airflow-production
namespace: argocd
spec:
project: data-engineering
source:
repoURL: https://github.com/company/data-infrastructure
path: airflow/production
targetRevision: main
# Helm 사용 시
helm:
valueFiles:
- values-prod.yaml
parameters:
- name: image.tag
value: "v2.5.1"
destination:
server: https://prod-cluster-api
namespace: airflow
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
retry:
limit: 3
backoff:
duration: 5s
factor: 2
maxDuration: 3m
ArgoCD의 동작 원리
1. 동기화 프로세스
Git Repository → ArgoCD Controller → Kubernetes API → 실제 리소스 생성/수정
2. 상태 감지 및 Drift Detection
- 원하는 상태 (Desired State): Git 저장소에 정의된 매니페스트
- 실제 상태 (Live State): Kubernetes 클러스터의 현재 상태
- Drift: 두 상태 간의 차이를 실시간으로 감지
3. Health Check
- 배포된 리소스의 상태를 지속적으로 모니터링
- Healthy, Progressing, Degraded, Suspended 등의 상태로 분류
Sync 정책 상세
1. 자동 동기화 (Automated Sync)
syncPolicy:
automated:
prune: true # 매니페스트에서 제거된 리소스 자동 삭제
selfHeal: true # 수동으로 변경된 리소스 자동 복구
syncOptions:
- CreateNamespace=true # 네임스페이스 자동 생성
- PrunePropagationPolicy=foreground # 삭제 정책
- PruneLast=true # 다른 리소스 생성 후 정리 작업
2. 수동 동기화 (Manual Sync)
syncPolicy:
# automated 섹션 없음 = 수동 동기화
syncOptions:
- CreateNamespace=true
retry:
limit: 5
backoff:
duration: 5s
maxDuration: 10m
Health Check 메커니즘
1. 기본 Health Check
ArgoCD는 Kubernetes 리소스의 상태를 다음과 같이 분류합니다:
- Healthy: 모든 리소스가 정상 동작
- Progressing: 배포 진행 중
- Degraded: 일부 리소스에 문제 발생
- Suspended: 의도적으로 중단된 상태
2. 커스텀 Health Check
데이터 파이프라인을 위한 커스텀 헬스체크 예시:
# argocd-cm ConfigMap에 추가
data:
resource.customizations.health.batch_CronJob: |
hs = {}
if obj.status ~= nil then
if obj.status.lastScheduleTime ~= nil then
hs.status = "Healthy"
hs.message = "CronJob is scheduled and running"
else
hs.status = "Progressing"
hs.message = "CronJob created but not yet scheduled"
end
else
hs.status = "Progressing"
hs.message = "CronJob is being created"
end
return hs
3. 외부 시스템 Health Check
# Airflow DAG의 헬스체크를 위한 커스텀 리소스
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: airflow-dag-monitor
spec:
source:
repoURL: https://github.com/company/monitoring
path: airflow-healthcheck
# 외부 Airflow API를 호출하여 DAG 상태 확인하는 Job 배포
Rollback 기능
1. 기본 Rollback
# CLI를 통한 롤백
argocd app rollback airflow-production
# 특정 리비전으로 롤백
argocd app rollback airflow-production --revision 5
2. 자동 Rollback 설정
# Application spec에 추가
spec:
syncPolicy:
automated:
prune: true
selfHeal: true
# 실패 시 자동 롤백
retry:
limit: 3
backoff:
duration: 5s
factor: 2
maxDuration: 3m
3. 데이터 파이프라인에서의 Rollback 전략
# 단계적 롤백을 위한 여러 Application 구성
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: data-pipeline-stage1
spec:
# Kafka 설정 먼저 롤백
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: data-pipeline-stage2
spec:
# Spark 애플리케이션 롤백
syncPolicy:
syncOptions:
- Prune=false # 데이터 유실 방지
데이터 엔지니어링에서의 ArgoCD 활용
1. 데이터 파이프라인 배포
# Apache Airflow DAG 배포 예시
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: airflow-dags
spec:
source:
repoURL: https://github.com/company/data-pipelines
path: airflow/dags
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: airflow
2. 환경별 배포 관리
- 개발환경: 빠른 반복과 실험을 위한 자동 동기화
- 스테이징: 프로덕션과 유사한 환경에서의 검증
- 프로덕션: 수동 승인 후 배포를 통한 안정성 확보
3. 데이터 인프라 관리
- Kafka, Spark, Elasticsearch 등 데이터 처리 도구들의 설정 관리
- ConfigMap, Secret을 통한 환경별 설정 분리
- 버전 관리를 통한 인프라 변경사항 추적
ArgoCD의 주요 장점
1. 가시성 (Visibility)
- 웹 UI를 통한 배포 상태 실시간 모니터링
- Git 커밋과 배포 상태의 직관적인 연결
- 리소스 간의 의존성 시각화
2. 보안성 (Security)
- 클러스터 외부에서 내부로의 직접 접근 불필요
- Git 저장소 기반의 권한 관리
- 모든 변경사항의 Git 이력 추적
3. 복구 가능성 (Recoverability)
- Git 기반의 버전 관리로 언제든 이전 상태로 롤백 가능
- 선언적 구성으로 재현 가능한 배포
- 자동 self-healing 기능
4. 확장성 (Scalability)
- 멀티 클러스터 환경에서의 중앙 집중식 관리
- 수백 개의 애플리케이션과 클러스터 동시 관리 가능
실제 사용 시나리오
시나리오 1: 데이터 파이프라인 코드 변경
- 데이터 엔지니어가 Airflow DAG 코드 수정
- Git 저장소에 Push
- ArgoCD가 변경사항 감지
- 새로운 DAG가 Airflow에 자동 배포
- 실시간으로 배포 상태 확인 가능
시나리오 2: 장애 상황에서의 복구
- 실수로 Kubernetes 리소스 직접 삭제
- ArgoCD가 Drift 감지
- Git 저장소의 매니페스트를 기반으로 자동 복구
- 시스템이 원하는 상태로 자동 복원
결론
ArgoCD는 단순한 배포 도구를 넘어서 데이터 엔지니어링 팀이 안정적이고 추적 가능한 방식으로 데이터 인프라와 파이프라인을 관리할 수 있게 해주는 핵심 도구입니다. GitOps 패러다임을 통해 코드와 인프라의 일관성을 보장하고, 복잡한 데이터 환경에서도 신뢰할 수 있는 배포 프로세스를 구축할 수 있습니다.
반응형
'Data Platform > ArgoCD' 카테고리의 다른 글
[ArgoCD] 사용 방법 (0) | 2025.06.23 |
---|---|
[ArgoCD] 클러스터 아키텍처 w.장애 극복 시나리오 (0) | 2025.06.23 |