Kubernetes GitOps와 ArgoCD: 선언형 배포·드리프트 감지·Argo Rollouts

개요

Kubernetes는 선언형이지만, 사람이 노트북에서 kubectl apply를 실행하는 순간 그 선언은 Git이 아니라 개인의 손끝에 있게 된다. 누가·언제·무엇을 배포했는지 추적이 흐려지고, 클러스터 상태와 저장소가 어긋난다. GitOps는 Git 저장소를 시스템의 유일한 진실 원천(Single Source of Truth)으로 삼고, 클러스터가 그 저장소 상태로 스스로 수렴하도록 만드는 운영 모델이다. ArgoCD는 이를 구현하는 대표 도구이며, Argo Rollouts는 Kubernetes에 Canary/Blue-Green 같은 점진 배포를 더한다. 이는 Kubernetes - 개요와 아키텍처의 수렴 루프를 클러스터 경계 밖(Git)까지 확장한 것이다.

핵심 개념과 원리

GitOps의 네 가지 원칙

GitOps는 다음 원칙 위에 선다.

원칙의미
선언형(Declarative)시스템의 원하는 상태 전체를 선언적으로 기술한다
버전 관리·불변그 상태를 Git에 저장하고 커밋으로 이력·불변성을 확보한다
자동 적용(Pull)에이전트가 승인된 상태를 자동으로 클러스터에 반영한다
지속적 수렴실제 상태를 감시하며 선언 상태로 계속 되돌린다

Push vs Pull 모델

전통적 CI/CD는 push 방식이다. 파이프라인이 클러스터 밖에서 kubectl/helm으로 클러스터에 변경을 밀어 넣는다. 이 경우 CI 시스템이 클러스터 자격증명을 보유해야 하고, 클러스터는 자신이 무엇이어야 하는지 능동적으로 알지 못한다.

GitOps는 pull 방식이다. 클러스터 안에서 도는 에이전트(ArgoCD)가 Git을 폴링해 원하는 상태를 스스로 당겨와 적용한다. 장점은 다음과 같다.

  • 외부 CI에 클러스터 자격증명을 노출하지 않아 보안 표면이 줄어든다.
  • 클러스터가 항상 “Git = 원하는 상태”를 기준으로 자기 상태를 검증한다.
  • Git 이력이 곧 배포 감사 로그가 되고, 롤백은 git revert로 끝난다.

ArgoCD와 Application CRD

ArgoCD는 클러스터에 상주하며 Git 저장소와 클러스터 상태를 비교하는 GitOps 컨트롤러다. 핵심은 Application이라는 CRD로, “어떤 Git 저장소·경로의 매니페스트를, 어느 클러스터·네임스페이스에 배포할지”를 선언한다.

ArgoCD는 각 Application에 대해 상태를 두 축으로 표시한다.

  • Sync 상태: Synced(Git과 클러스터 일치) / OutOfSync(불일치)
  • Health 상태: Healthy / Progressing / Degraded(리소스 실제 건강도)

동기화 정책은 수동(사람이 승인 후 sync)과 자동(automated)으로 나뉜다. 자동 정책에 prune(Git에서 삭제된 리소스를 클러스터에서도 제거)과 selfHeal(수동 변경을 자동 되돌림)을 켜면 완전한 자동 수렴이 된다. Helm·Kustomize 저장소도 그대로 지원한다(Kubernetes - Helm과 Operator).

드리프트 감지(drift detection)

드리프트는 Git 선언과 클러스터 실제 상태가 어긋난 상황이다. 누군가 kubectl edit로 복제본 수를 바꾸거나 이미지를 임의로 교체하면 발생한다. ArgoCD는 주기적으로(그리고 웹훅 이벤트로) 둘을 비교해 드리프트를 OutOfSync로 표시한다. selfHeal이 켜져 있으면 이런 임의 변경을 자동으로 Git 상태로 되돌려 “Git이 진실”이라는 불변식을 강제한다. 이로써 클러스터에 대한 유일한 정당한 변경 경로가 Git 커밋으로 통일된다.

Argo Rollouts: 점진 배포

기본 Deployment의 RollingUpdate는 트래픽 비중을 세밀히 제어하거나 지표를 보고 자동 판단하지 못한다(Kubernetes - Pod와 워크로드). Argo Rollouts는 Deployment를 대체하는 Rollout 리소스를 제공해 다음을 가능케 한다.

  • Canary: 트래픽을 5% → 25% → 100%처럼 단계적으로 늘리며 각 단계에서 대기·검증.
  • Blue-Green: 새 버전을 미리 띄워두고 트래픽을 일괄 전환, 문제 시 즉시 복귀.
  • Analysis: 각 단계에서 Prometheus 등 지표를 쿼리해 SLO 위반 시 자동 롤백(progressive delivery).

이로써 배포 전략(배포 전략 - Rolling·Blue-Green·Canary)이 수동 절차가 아니라 선언형 리소스로 인코딩된다.

실전

ArgoCD Application 선언

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: web
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myorg/deploy.git
    targetRevision: main
    path: apps/web/overlays/prod          # Kustomize/Helm 경로
  destination:
    server: https://kubernetes.default.svc
    namespace: web
  syncPolicy:
    automated:
      prune: true        # Git에서 지운 리소스 자동 삭제
      selfHeal: true     # 드리프트 자동 복구
    syncOptions:
      - CreateNamespace=true
argocd app list
argocd app get web                # Sync/Health 상태 확인
argocd app sync web               # 수동 동기화
argocd app history web            # 배포 이력
argocd app rollback web <id>      # 이전 상태로 복귀(또는 git revert)

Argo Rollouts Canary

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata: { name: api }
spec:
  replicas: 5
  strategy:
    canary:
      steps:
        - setWeight: 20            # 트래픽 20%를 새 버전으로
        - pause: { duration: 5m }  # 5분 관찰
        - setWeight: 50
        - pause: {}                # 수동 승인 대기
        - setWeight: 100
      analysis:                    # 지표 기반 자동 판단
        templates:
          - templateName: error-rate
  selector:
    matchLabels: { app: api }
  template:
    metadata: { labels: { app: api } }
    spec:
      containers:
        - name: api
          image: myorg/api:1.5.0

함정과 베스트 프랙티스

  • kubectl apply 직접 실행 금지: GitOps 환경에서 수동 변경은 드리프트를 만들고 selfHeal에 곧 덮어써진다. 모든 변경은 PR/커밋으로.
  • 애플리케이션 코드와 배포 매니페스트 저장소 분리: 앱 저장소와 배포(config) 저장소를 나눠야 이미지 태그 업데이트가 앱 CI를 재트리거하는 루프를 피한다.
  • Secret은 그대로 커밋 금지: SealedSecrets·External Secrets로 암호화해 저장한다(Kubernetes - 설정과 스토리지).
  • prune 활성화는 신중히: 실수한 커밋이 리소스 대량 삭제로 이어질 수 있다. 스테이징에서 먼저 검증한다.
  • Argo Rollouts는 트래픽 라우팅 통합 필요: 정밀한 가중치 분배는 Ingress/서비스 메시(Gateway API·Istio) 연동이 있어야 정확하다(Kubernetes - 서비스와 네트워킹).
  • 자동 롤백 지표 정의: analysis 없이 pause만 쓰면 결국 사람 판단에 의존한다. SLO 지표를 명시해 자동화한다.

정리

GitOps는 Git을 단일 진실 원천으로 삼는 pull 기반 운영 모델로, 클러스터 자격증명 노출을 줄이고 배포 이력을 Git 커밋으로 통일한다. ArgoCD는 Application CRD로 원하는 상태를 선언하고 드리프트를 감지·복구하며, Argo Rollouts는 Canary/Blue-Green과 지표 기반 자동 판단(progressive delivery)을 Kubernetes에 더한다. 배포 전략 자체의 이론적 비교는 배포 전략 - Rolling·Blue-Green·Canary, 배포 대상 패키징은 Kubernetes - Helm과 Operator에서 다룬다.