[CL] v3 배포 문서화 - 100-hours-a-week/6-nemo-wiki GitHub Wiki

2. 배포

🚀 V3 배포 방식 개요

V3는 GitOps + Helm Chart 기반 완전 자동화 배포로 전환했습니다. 기존 V1/V2의 수동/스크립트 기반 배포에서 벗어나 Cloud Repository 중심의 선언적 배포를 구현했습니다.

📋 배포 아키텍처

🏗️ 배포 구성 요소

배포 스택:
  - Infrastructure: Terraform (AWS 리소스)
  - Application: ArgoCD + Helm Charts
  - Source: GitHub Repository (6-nemo-cloud)
  - Image Registry: AWS ECR
  - Monitoring: Discord Notifications

🔄 배포 플로우 전체 구조

1. Developer 코드 변경
   ↓
2. Cloud Repository (6-nemo-cloud) 업데이트
   ↓  
3. ArgoCD가 infra/applications 브랜치 모니터링
   ↓
4. Helm Chart 변경사항 감지
   ↓
5. EKS 클러스터에 자동 배포
   ↓
6. Discord 알림 발송

🛠️ 실제 배포 과정

1단계: 인프라 구성 (Terraform - 1회성)

# 최초 인프라 배포
cd v3/terraform/prod
terraform init
terraform plan  
terraform apply

Terraform이 자동 설치하는 구성요소:

  • EKS 클러스터 + 노드 그룹
  • ArgoCD (Helm Chart)
  • ArgoCD Image Updater
  • AWS Load Balancer Controller
  • External Secrets Operator
  • Route53, RDS, Bastion 등

2단계: ArgoCD Application 등록 (1회성)

# ArgoCD Applications 생성
kubectl apply -f v3/k8s/backend-app.yaml
kubectl apply -f v3/k8s/frontend-app.yaml
kubectl apply -f v3/k8s/kafka-app.yaml
kubectl apply -f v3/k8s/redis-app.yaml
kubectl apply -f v3/k8s/zookeeper-app.yaml
kubectl apply -f v3/k8s/sentinel-app.yaml
kubectl apply -f v3/k8s/discord-notifications.yaml

3단계: 일상 배포 프로세스 (GitOps)

🎯 실제 배포 방법

# 1. Cloud Repository에서 Helm Chart 수정
cd v3/helm-charts/backend
vim values-backend.yaml  # 이미지 태그 변경

# 2. Git 커밋 & 푸시
git add .
git commit -m "🚀 Backend: update to prod-20250728-1500"
git push origin infra/applications

# 3. ArgoCD가 자동으로 감지하여 배포 진행
# 4. Discord 알림으로 배포 상태 확인

📦 Helm Chart 기반 배포 구조

디렉토리 구조

v3/helm-charts/
├── backend/
│   ├── Chart.yaml
│   ├── values-backend.yaml     # 배포 설정
│   └── templates/
│       ├── deployment.yaml
│       ├── service.yaml
│       └── serviceaccount-external-secret.yaml
├── frontend/
│   ├── Chart.yaml  
│   ├── values-frontend.yaml    # 배포 설정
│   └── templates/
├── kafka/
├── redis/
├── zookeeper/
└── sentinel/

실제 Helm Values 예시 (Backend)

# v3/helm-charts/backend/values-backend.yaml
backend:
  serviceAccount:
    name: backend
  image:
    repository: 084375578827.dkr.ecr.ap-northeast-2.amazonaws.com/backend
    tag: prod-20250714-1752  # 👈 이 부분을 수정하여 배포
  replicas: 3
  imagePullSecrets:
    - name: regcred
  env:
    KAFKA_BOOTSTRAP_SERVERS: "kafka-headless.kafka.svc.cluster.local:9092"
    SPRING_KAFKA_BOOTSTRAP_SERVERS: "kafka-headless.kafka.svc.cluster.local:9092"

ArgoCD Application 설정

# v3/k8s/backend-app.yaml  
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: backend
  namespace: argocd
spec:
  source:
    repoURL: https://github.com/100-hours-a-week/6-nemo-cloud.git
    targetRevision: infra/applications  # 👈 이 브랜치 모니터링
    path: v3/helm-charts/backend
    helm:
      valueFiles:
        - values-backend.yaml
  destination:
    server: https://kubernetes.default.svc
    namespace: application
  syncPolicy:
    automated:
      prune: true      # 불필요한 리소스 자동 제거
      selfHeal: true   # 수동 변경 시 자동 복구

🤖 ArgoCD 자동 동기화

Git 기반 자동 배포 설정

# ArgoCD Application annotations
annotations:
  # Discord 알림 설정
  notifications.argoproj.io/subscribe.on-deployed.discord: ""
  notifications.argoproj.io/subscribe.on-health-degraded.discord: ""
  notifications.argoproj.io/subscribe.on-sync-succeeded.discord: ""

GitOps 동기화 플로우

1. Cloud Repository 변경사항 커밋
   └── infra/applications 브랜치에 Push
   
2. ArgoCD가 Git 변경사항 감지 (자동 폴링)
   └── Helm Chart 변경 확인
   
3. 현재 상태와 원하는 상태 비교
   └── Kubernetes 리소스 Diff 계산
   
4. EKS 클러스터에 변경사항 적용
   └── Rolling Update 방식으로 배포
   
5. Discord 알림 발송
   └── "✅ Backend 배포 완료!"

📱 Discord 알림 시스템

알림 설정

# v3/k8s/discord-notifications.yaml
notifications:
  - on-deployed: "🚀 **Application Deployed Successfully!**"
  - on-health-degraded: "⚠️ **Application Health Degraded!**"  
  - on-sync-succeeded: "✅ **Sync Completed Successfully!**"

실제 알림 메시지 예시

🚀 Backend 배포 완료!
- Application: backend
- Status: Synced, Healthy
- Repository: 6-nemo-cloud
- Revision: infra/applications
- Image: prod-20250728-1500

V3 배포 방식의 핵심 특징

GitOps 철학:

  • Git이 Single Source of Truth
  • 모든 변경사항이 Git에 기록
  • Pull 방식 배포 (ArgoCD가 Git 모니터링)

선언적 배포:

  • 원하는 상태(Desired State)를 Helm Chart로 선언
  • ArgoCD가 현재 상태와 비교하여 자동 조정
  • 실시간 드리프트 감지 및 복구

완전 자동화:

  • Git 변경사항 → 자동 배포까지 완전 무인화
  • 수동 서버 접속 및 스크립트 실행 불필요
  • Git Push만으로 모든 배포 완료