Files
jovies/deploy/argocd/DEPLOY_GUIDE.md
Mayne0213 fa8d65d6da REFACTOR(app): migrate to argocd
- Add Kustomize base and prod overlay structure
- Optimize resources for 2GB RAM environment (100Mi/200Mi)
- Add ArgoCD Application manifest
- Remove old k8s manifests (replaced by Kustomize)
- Add comprehensive deployment guide
2025-11-23 10:18:21 +09:00

293 lines
5.8 KiB
Markdown

# Jovies ArgoCD 배포 가이드 (2GB RAM 환경)
## 전제조건
- ✅ ArgoCD 설치됨
- ✅ K3s 클러스터 실행 중
- ✅ GHCR에 이미지 푸시 권한
## 현재 리소스 설정 (2GB 최적화)
```yaml
Jovies Pod:
replicas: 1
resources:
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 200Mi
cpu: 150m
```
### 예상 메모리 사용량
```
시스템: ~300Mi
K3s: ~300Mi
ArgoCD: ~800Mi
Traefik: ~50Mi
Jovies: ~100Mi (최대 200Mi)
────────────────────────────
총합: ~1,550Mi
여유: ~500Mi ✅
```
## 배포 단계
### 1. ArgoCD에 Application 등록
```bash
cd /Users/minjo/home/mayne/projects/jovies
# Application 생성
kubectl apply -f deploy/argocd/application.yaml
```
### 2. 배포 상태 확인
```bash
# Application 상태 확인
kubectl get application jovies -n argocd
# 출력 예시:
# NAME SYNC STATUS HEALTH STATUS
# jovies Synced Healthy
```
### 3. Pod 상태 확인
```bash
# Jovies namespace의 Pod 확인
kubectl get pods -n jovies
# 상세 로그 확인
kubectl logs -n jovies -l app=jovies-app -f
```
### 4. Service 확인
```bash
# Service 정보 확인
kubectl get svc -n jovies
# 출력:
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
# jovies-service ClusterIP 10.43.xxx.xxx <none> 80/TCP
```
## ArgoCD UI 접근
### 포트포워딩으로 접근
```bash
# ArgoCD 서버 포트포워딩
kubectl port-forward svc/argocd-server -n argocd 8080:443
# 브라우저에서 https://localhost:8080 접속
```
### 초기 비밀번호 확인
```bash
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
echo
```
- **Username**: `admin`
- **Password**: 위 명령어 출력값
## 배포 워크플로우
```
1. 개발자가 코드 변경 후 main 브랜치에 push
2. GitHub Actions가 Docker 이미지 빌드 & GHCR에 푸시
(태그: latest, main, main-{sha})
3. ArgoCD가 매니페스트 변경 감지 (3분마다)
4. 자동으로 Kubernetes에 배포 (selfHeal: true)
5. Rolling Update로 무중단 배포
```
## 수동 동기화
필요 시 수동으로 동기화:
```bash
# kubectl 사용
kubectl patch app jovies -n argocd --type merge -p '{"operation":{"sync":{}}}'
# 또는 ArgoCD CLI 사용 (설치되어 있다면)
argocd app sync jovies
```
## 이미지 업데이트
### 방법 1: GitHub Actions (자동)
```yaml
# .github/workflows/build.yml이 자동으로:
# 1. 이미지 빌드
# 2. GHCR에 푸시 (latest 태그)
# 3. ArgoCD가 자동 감지하여 배포
```
### 방법 2: 수동 이미지 태그 변경
```bash
# kustomization.yaml 수정
cd deploy/k8s/overlays/prod
vi kustomization.yaml
# newTag를 원하는 버전으로 변경
images:
- name: ghcr.io/mayne0213/jovies
newTag: main-abc1234 # ← 변경
# Git에 커밋 & 푸시
git add .
git commit -m "Update jovies to main-abc1234"
git push
# ArgoCD가 자동으로 감지하여 배포
```
## 트러블슈팅
### Pod가 CrashLoopBackOff 상태
```bash
# Pod 로그 확인
kubectl logs -n jovies -l app=jovies-app --tail=100
# Pod 상세 정보
kubectl describe pod -n jovies -l app=jovies-app
# 일반적인 원인:
# 1. 이미지를 찾을 수 없음 → GHCR 권한 확인
# 2. 환경변수 누락 → ConfigMap/Secret 확인
# 3. Health check 실패 → 포트 3000 확인
```
### ArgoCD Sync 실패
```bash
# Application 상태 확인
kubectl get app jovies -n argocd -o yaml
# ArgoCD 로그 확인
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-application-controller --tail=100
```
### 메모리 부족 (OOMKilled)
```bash
# Pod 상태 확인
kubectl get pod -n jovies -l app=jovies-app
# 마지막 종료 이유 확인
kubectl describe pod -n jovies -l app=jovies-app | grep -A 5 "Last State"
# OOMKilled가 보이면 리소스 증가 필요:
# deploy/k8s/overlays/prod/deployment-patch.yaml 수정
resources:
limits:
memory: "300Mi" # 200Mi → 300Mi로 증가
```
## 롤백
### ArgoCD UI에서 롤백
1. ArgoCD UI 접속
2. `jovies` 애플리케이션 클릭
3. `HISTORY`
4. 이전 버전 선택 후 `ROLLBACK` 클릭
### CLI로 롤백
```bash
# 히스토리 확인
kubectl get app jovies -n argocd -o yaml | grep -A 10 "history:"
# 특정 리비전으로 롤백 (예: revision 3)
argocd app rollback jovies 3
```
## 모니터링
### 리소스 사용량 확인
```bash
# Pod 리소스 사용량
kubectl top pod -n jovies
# Node 전체 리소스 사용량
kubectl top node
# 출력 예시:
# NAME CPU(cores) MEMORY(bytes)
# jovies-app-xxx 10m 120Mi
```
### 메모리 압박 확인
```bash
# 전체 메모리 사용량 모니터링
watch -n 5 'kubectl top node && echo "---" && kubectl top pod -A | head -20'
```
### 로그 스트리밍
```bash
# 실시간 로그 확인
kubectl logs -n jovies -l app=jovies-app -f --tail=100
# 여러 Pod의 로그를 모두 보기
kubectl logs -n jovies -l app=jovies-app --all-containers=true -f
```
## 정리 (삭제)
```bash
# ArgoCD Application 삭제 (리소스도 함께 삭제됨)
kubectl delete -f deploy/argocd/application.yaml
# 또는 직접 삭제
kubectl delete app jovies -n argocd
# Namespace도 삭제하려면
kubectl delete namespace jovies
```
## 다음 단계
메모리가 충분해지면 (4GB+):
1. **Replica 증가**
```yaml
spec:
replicas: 2 # 고가용성
```
2. **리소스 증가**
```yaml
resources:
requests:
memory: "256Mi"
limits:
memory: "512Mi"
```
3. **ArgoCD Image Updater 추가**
- 자동으로 새 이미지 감지
- Git 커밋 없이 배포 가능
4. **Monitoring Stack 추가**
- Prometheus
- Grafana
- Alert Manager