hgzero/deploy/k8s/backend/README.md
2025-10-27 17:31:03 +09:00

421 lines
9.6 KiB
Markdown

# HGZero 백엔드 서비스 Kubernetes 배포 가이드
## 개요
이 가이드는 HGZero 백엔드 서비스(User, Meeting, Notification)를 Azure Kubernetes Service(AKS)에 배포하는 방법을 설명합니다.
## 배포 환경
- **ACR(Azure Container Registry)**: acrdigitalgarage02
- **AKS(Azure Kubernetes Service)**: aks-digitalgarage-02
- **네임스페이스**: hgzero
- **리소스 그룹**: rg-digitalgarage-02
## 서비스 구성
### 1. User Service
- **포트**: 8080
- **이미지**: acrdigitalgarage02.azurecr.io/hgzero/user-service:latest
- **기능**: 사용자 인증 및 관리, LDAP 연동
### 2. Meeting Service
- **포트**: 8081 (HTTP), 8082 (WebSocket)
- **이미지**: acrdigitalgarage02.azurecr.io/hgzero/meeting-service:latest
- **기능**: 회의 관리, WebSocket 통신
### 3. Notification Service
- **포트**: 8082
- **이미지**: acrdigitalgarage02.azurecr.io/hgzero/notification-service:latest
- **기능**: 알림 전송, 이메일 발송
## 리소스 할당
각 서비스는 다음과 같은 리소스를 사용합니다:
- **Requests**:
- CPU: 256m
- Memory: 256Mi
- **Limits**:
- CPU: 1024m
- Memory: 1024Mi
- **Replicas**: 1 (각 서비스)
## 사전 요구사항
1. **Azure CLI 설치**
```bash
# macOS
brew install azure-cli
# Windows
# Download from https://aka.ms/installazurecliwindows
# Linux
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
```
2. **kubectl 설치**
```bash
# macOS
brew install kubectl
# Windows
# Download from https://kubernetes.io/docs/tasks/tools/install-kubectl-windows/
# Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
```
3. **Azure 로그인**
```bash
az login
```
4. **ACR 로그인**
```bash
az acr login --name acrdigitalgarage02
```
## 배포 파일 구조
```
deploy/k8s/backend/
├── namespace.yaml # 네임스페이스 정의
├── configmap.yaml # ConfigMap (Redis, Mail 설정)
├── secret-template.yaml # Secret 템플릿 (민감 정보)
├── user-service.yaml # User Service 배포 매니페스트
├── meeting-service.yaml # Meeting Service 배포 매니페스트
├── notification-service.yaml # Notification Service 배포 매니페스트
├── deploy.sh # 배포 스크립트
├── undeploy.sh # 배포 해제 스크립트
├── create-secrets.sh # Secret 생성 스크립트
└── README.md # 이 문서
```
## 배포 절차
### 1단계: AKS 클러스터 접근 설정
```bash
# AKS credentials 가져오기
az aks get-credentials \
--resource-group rg-digitalgarage-02 \
--name aks-digitalgarage-02 \
--overwrite-existing
# 클러스터 연결 확인
kubectl cluster-info
```
### 2단계: 네임스페이스 생성
```bash
kubectl apply -f namespace.yaml
```
### 3단계: ConfigMap 생성
```bash
kubectl apply -f configmap.yaml
```
### 4단계: Secret 생성
옵션 A: 대화형 스크립트 사용 (권장)
```bash
./create-secrets.sh
```
옵션 B: 직접 생성
```bash
# Database Secret
kubectl create secret generic db-secret \
--from-literal=host=<DB_HOST> \
--from-literal=username=<DB_USERNAME> \
--from-literal=password=<DB_PASSWORD> \
--namespace=hgzero
# Azure Secret
kubectl create secret generic azure-secret \
--from-literal=eventhub-connection-string=<EVENTHUB_CONN> \
--from-literal=blob-connection-string=<BLOB_CONN> \
--namespace=hgzero
# Mail Secret
kubectl create secret generic mail-secret \
--from-literal=username=<MAIL_USERNAME> \
--from-literal=password=<MAIL_PASSWORD> \
--namespace=hgzero
```
### 5단계: 서비스 배포
옵션 A: 자동 배포 스크립트 사용 (권장)
```bash
./deploy.sh
```
옵션 B: 수동 배포
```bash
# ACR 연동 설정
az aks update \
-n aks-digitalgarage-02 \
-g rg-digitalgarage-02 \
--attach-acr acrdigitalgarage02
# 서비스 배포
kubectl apply -f user-service.yaml
kubectl apply -f notification-service.yaml
kubectl apply -f meeting-service.yaml
```
### 6단계: 배포 상태 확인
```bash
# Deployment 상태 확인
kubectl get deployments -n hgzero
# Pod 상태 확인
kubectl get pods -n hgzero
# Service 확인
kubectl get services -n hgzero
# 상세 정보 확인
kubectl describe deployment user-service -n hgzero
```
## 배포 확인 및 테스트
### Pod 로그 확인
```bash
# User Service 로그
kubectl logs -f deployment/user-service -n hgzero
# Meeting Service 로그
kubectl logs -f deployment/meeting-service -n hgzero
# Notification Service 로그
kubectl logs -f deployment/notification-service -n hgzero
```
### Health Check
```bash
# User Service health check
kubectl port-forward svc/user-service 8080:8080 -n hgzero
curl http://localhost:8080/actuator/health
# Meeting Service health check
kubectl port-forward svc/meeting-service 8081:8081 -n hgzero
curl http://localhost:8081/actuator/health
# Notification Service health check
kubectl port-forward svc/notification-service 8082:8082 -n hgzero
curl http://localhost:8082/actuator/health
```
### Pod 내부 접속
```bash
# Pod 내부로 접속하여 디버깅
kubectl exec -it deployment/user-service -n hgzero -- /bin/sh
```
## 배포 해제
### 전체 서비스 삭제
```bash
./undeploy.sh
```
### 개별 서비스 삭제
```bash
kubectl delete -f user-service.yaml
kubectl delete -f meeting-service.yaml
kubectl delete -f notification-service.yaml
```
### Secret 및 ConfigMap 삭제
```bash
kubectl delete configmap redis-config mail-config -n hgzero
kubectl delete secret db-secret azure-secret mail-secret -n hgzero
```
### 네임스페이스 삭제
```bash
kubectl delete namespace hgzero
```
## 트러블슈팅
### Pod가 시작되지 않는 경우
```bash
# Pod 상태 확인
kubectl get pods -n hgzero
# Pod 상세 정보 확인
kubectl describe pod <pod-name> -n hgzero
# Pod 로그 확인
kubectl logs <pod-name> -n hgzero
# 이전 컨테이너 로그 확인 (재시작된 경우)
kubectl logs <pod-name> -n hgzero --previous
```
### 이미지 Pull 오류
```bash
# ACR 연동 상태 확인
az aks show -n aks-digitalgarage-02 -g rg-digitalgarage-02 --query "servicePrincipalProfile"
# ACR 재연동
az aks update -n aks-digitalgarage-02 -g rg-digitalgarage-02 --attach-acr acrdigitalgarage02
# ImagePullSecret 확인
kubectl get serviceaccount default -n hgzero -o yaml
```
### Secret 관련 오류
```bash
# Secret 존재 확인
kubectl get secrets -n hgzero
# Secret 내용 확인
kubectl get secret db-secret -n hgzero -o yaml
# Secret 재생성
kubectl delete secret db-secret -n hgzero
./create-secrets.sh
```
### 네트워크 연결 문제
```bash
# Service Endpoint 확인
kubectl get endpoints -n hgzero
# DNS 확인
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup user-service.hgzero.svc.cluster.local
# 네트워크 정책 확인
kubectl get networkpolicies -n hgzero
```
### 리소스 부족 문제
```bash
# 노드 리소스 사용량 확인
kubectl top nodes
# Pod 리소스 사용량 확인
kubectl top pods -n hgzero
# 리소스 제한 조정 (필요 시)
kubectl edit deployment user-service -n hgzero
```
## 업데이트 및 롤링 배포
### 이미지 업데이트
```bash
# 새 이미지 태그로 업데이트
kubectl set image deployment/user-service \
user-service=acrdigitalgarage02.azurecr.io/hgzero/user-service:v2.0.0 \
-n hgzero
# 롤아웃 상태 확인
kubectl rollout status deployment/user-service -n hgzero
# 롤아웃 히스토리 확인
kubectl rollout history deployment/user-service -n hgzero
```
### 롤백
```bash
# 이전 버전으로 롤백
kubectl rollout undo deployment/user-service -n hgzero
# 특정 revision으로 롤백
kubectl rollout undo deployment/user-service --to-revision=2 -n hgzero
```
## 모니터링
### Kubernetes Dashboard
```bash
# Dashboard 접근
az aks browse -n aks-digitalgarage-02 -g rg-digitalgarage-02
```
### 리소스 모니터링
```bash
# 실시간 리소스 사용량 모니터링
watch kubectl top pods -n hgzero
# 이벤트 모니터링
kubectl get events -n hgzero --sort-by='.lastTimestamp'
```
## 보안 권장사항
1. **Secret 관리**
- Secret은 절대 Git에 커밋하지 마세요
- Azure Key Vault 통합을 고려하세요
- Secret rotation 정책을 수립하세요
2. **네트워크 보안**
- Network Policy를 활용하여 Pod 간 통신을 제한하세요
- Service Mesh 도입을 고려하세요
3. **이미지 보안**
- 정기적으로 이미지 스캔을 수행하세요
- 최소 권한 원칙을 적용하세요
## 성능 최적화
1. **Auto Scaling 설정**
```bash
kubectl autoscale deployment user-service \
--cpu-percent=70 \
--min=1 \
--max=5 \
-n hgzero
```
2. **리소스 조정**
- 실제 사용량에 따라 requests/limits를 조정하세요
- HPA(Horizontal Pod Autoscaler) 설정을 고려하세요
## 참고 자료
- [Azure Kubernetes Service 문서](https://docs.microsoft.com/azure/aks/)
- [Kubernetes 공식 문서](https://kubernetes.io/docs/)
- [kubectl 치트시트](https://kubernetes.io/docs/reference/kubectl/cheatsheet/)
## 지원 및 문의
문제 발생 시 다음 정보를 수집하여 보고해주세요:
```bash
# 진단 정보 수집
kubectl get all -n hgzero > hgzero-resources.txt
kubectl describe pods -n hgzero > hgzero-pods-detail.txt
kubectl logs deployment/user-service -n hgzero > user-service.log
kubectl logs deployment/meeting-service -n hgzero > meeting-service.log
kubectl logs deployment/notification-service -n hgzero > notification-service.log
```