[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만으로 모든 배포 완료