mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 14:56:23 +00:00
421 lines
9.6 KiB
Markdown
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
|
|
```
|