본문 바로가기
카테고리 없음

쿠버네티스 환경에서 GitOps + Progressive Delivery를 결합한 배포 자동화 체계 구축

by frontier12 2025. 5. 28.



(Argo CD + Argo Rollouts + Kustomize + Notification Integration)



🧠 왜 GitOps만으로는 충분하지 않은가?

GitOps는 “Git에 선언하고, 자동 동기화하라”는 이상적인 접근입니다. 하지만 다음 문제들이 자주 발생합니다:

문제 상황 설명
새로운 이미지 적용 시 장애 가능성 Git 상태는 최신이지만, 롤아웃 중 실패 감지 없음
점진적 트래픽 분산 불가능 kubectl rollout은 무조건 100% 적용
알림·인사이트 연동 어려움 Git만 보고는 배포 실패/성공 알기 어려움

이를 해결하기 위해 Progressive Delivery, 즉 점진적 배포 전략이 필요하며,
이를 GitOps와 결합하여 안정성 + 자동화 + 추적성을 동시에 확보할 수 있습니다.



🔧 핵심 기술 스택 구성

구성요소 역할
Argo CD GitOps 기반 선언적 배포
Argo Rollouts Canary / Blue-Green 배포 제어
Kustomize 환경별 YAML 차등 적용
Argo Notifications Slack/Teams/Discord 등 연동
Prometheus/Grafana 자동화된 헬스 체크 기준 제공




📁 디렉토리 구조 예시

├── base/
│   ├── deployment.yaml
│   ├── service.yaml
├── overlays/
│   ├── dev/
│   │   └── kustomization.yaml
│   ├── prod/
│   │   └── kustomization.yaml
├── rollout/
│   └── rollout.yaml




🧪 Argo Rollouts 예시: Canary 전략

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: myapp
spec:
  strategy:
    canary:
      steps:
        - setWeight: 10
        - pause: { duration: 2m }
        - setWeight: 30
        - pause: { duration: 5m }
        - setWeight: 100
  selector:
    matchLabels:
      app: myapp
  template:
    spec:
      containers:
        - name: myapp
          image: myorg/myapp:1.2.3

→ 10% → 30% → 100% 순으로 트래픽 증가
→ Prometheus metric 기반 자동 rollback 가능



🧬 Kustomize로 환경별 차이 관리

# overlays/prod/kustomization.yaml
resources:
  - ../../base
  - ../../rollout/rollout.yaml

patchesStrategicMerge:
  - image-prod.yaml

→ prod와 dev는 서로 다른 rollout 규칙 및 이미지 사용 가능



📣 Argo Notifications 예시 (Slack)

trigger:
  - name: on-sync-failed
    condition: app.status.sync.status == 'OutOfSync'
    template: slack-alert

template:
  - name: slack-alert
    slack:
      channels: ["#deploy-alerts"]
      message: |
        🚨 *{{app.metadata.name}}* 배포 실패!
        상태: {{app.status.sync.status}}




📊 Prometheus + Argo 연동으로 자동 헬스체크

metrics:
  - name: http-success-rate
    interval: 10s
    query: |
      sum(rate(http_requests_total{status=~"2.."}[1m]))
        /
      sum(rate(http_requests_total[1m]))
    threshold: 0.95

→ 성공률이 95% 이하로 떨어지면 자동 rollback



📈 Argo CD Sync 옵션 설정

syncPolicy:
  automated:
    prune: true
    selfHeal: true
  syncOptions:
    - CreateNamespace=true
    - ApplyOutOfSyncOnly=true

→ Git과 실제 클러스터 상태가 어긋나면 자동 복구
→ 선언적으로 운용 가능



🧠 실전 팁

과제 전략
Canary 배포 후 장애 감지 못함 Prometheus + Rollouts에 alert 조건 설정
배포 히스토리 추적 어려움 Argo UI로 배포, 롤백, Sync 상태 전부 추적
서로 다른 팀이 하나의 GitOps 관리 앱별 AppProject 분리 + RBAC 설정
이미지 Digest 기반 배포 필요 argocd-image-updater 연동하여 자동 PR




🧩 결론: 선언적 구성 + 동적 배포 전략 = GitOps 2.0

단순히 Git에 YAML만 저장하는 시대는 끝났습니다.
이제는 선언적 구성과 동적인 점진적 배포 로직을 함께 다루는 시대로 진입했습니다.
• GitOps는 “상태 선언”에 불과합니다.
• Rollouts는 “변화 과정 제어”를 보완합니다.
• Prometheus는 “헬스 기준”을 제공합니다.
• Notifications는 “사람에게 명확한 신호”를 줍니다.

이 네 가지를 결합한 자동화 시스템이 진정한 GitOps의 완성형입니다.

원하신다면 GitHub Actions로 이미지 PR 자동화, Argo CD App-of-Apps 패턴 설명도 이어드릴 수 있습니다.