phonebill/design/backend/physical/physical-architecture-dev.md
2025-09-09 01:12:14 +09:00

526 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 물리 아키텍처 설계서 - 개발환경
## 1. 개요
### 1.1 설계 목적
- 통신요금 관리 서비스의 **개발환경** 물리 아키텍처 설계
- MVP 단계의 빠른 개발과 검증을 위한 최소 구성
- 비용 효율성과 개발 편의성 우선
### 1.2 설계 원칙
- **MVP 우선**: 빠른 개발과 검증을 위한 최소 구성
- **비용 최적화**: Spot Instances, Pod 기반 백킹서비스 활용
- **개발 편의성**: 복잡한 설정 최소화, 빠른 배포
- **단순성**: 운영 복잡도 최소화
### 1.3 참조 아키텍처
- 마스터 아키텍처: design/backend/physical/physical-architecture.md
- HighLevel아키텍처정의서: design/high-level-architecture.md
- 논리아키텍처: design/backend/logical/logical-architecture.md
- 유저스토리: design/userstory.md
## 2. 개발환경 아키텍처 개요
### 2.1 환경 특성
- **목적**: 빠른 개발과 검증
- **사용자**: 개발팀 (5명)
- **가용성**: 95% (월 36시간 다운타임 허용)
- **확장성**: 제한적 (고정 리소스)
- **보안**: 기본 보안 (복잡한 보안 설정 최소화)
### 2.2 전체 아키텍처
📄 **[개발환경 물리 아키텍처 다이어그램](./physical-architecture-dev.mmd)**
**주요 구성 요소:**
- NGINX Ingress Controller → AKS 기본 클러스터
- 애플리케이션 Pod: Auth, Bill-Inquiry, Product-Change, KOS-Mock Service
- 백킹서비스 Pod: PostgreSQL (Local Storage), Redis (Memory Only)
## 3. 컴퓨팅 아키텍처
### 3.1 Azure Kubernetes Service (AKS) 구성
#### 3.1.1 클러스터 설정
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| Kubernetes 버전 | 1.29 | 안정화된 최신 버전 |
| 서비스 계층 | Basic | 비용 최적화 |
| Network Plugin | Azure CNI | Azure 네이티브 네트워킹 |
| Network Policy | Kubernetes Network Policies | 기본 Pod 통신 제어 |
| Ingress Controller | NGINX Ingress Controller | 오픈소스 Ingress |
| DNS | CoreDNS | 클러스터 DNS |
#### 3.1.2 노드 풀 구성
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| VM 크기 | Standard_B2s | 2 vCPU, 4GB RAM |
| 노드 수 | 2 | 고정 노드 수 |
| 자동 스케일링 | Disabled | 비용 절약을 위한 고정 크기 |
| 최대 Pod 수 | 30 | 노드당 최대 Pod |
| 가용 영역 | Zone-1 | 단일 영역 (비용 절약) |
| 가격 정책 | Spot Instance | 70% 비용 절약 |
### 3.2 서비스별 리소스 할당
#### 3.2.1 애플리케이션 서비스
| 서비스 | CPU Requests | Memory Requests | CPU Limits | Memory Limits | Replicas |
|--------|--------------|-----------------|------------|---------------|----------|
| Auth Service | 50m | 128Mi | 200m | 256Mi | 1 |
| Bill-Inquiry Service | 100m | 256Mi | 500m | 512Mi | 1 |
| Product-Change Service | 100m | 256Mi | 500m | 512Mi | 1 |
| KOS-Mock Service | 50m | 128Mi | 200m | 256Mi | 1 |
#### 3.2.2 백킹 서비스
| 서비스 | CPU Requests | Memory Requests | CPU Limits | Memory Limits | Storage |
|--------|--------------|-----------------|------------|---------------|---------|
| PostgreSQL | 500m | 1Gi | 1000m | 2Gi | 20GB (Azure Disk Standard) |
| Redis | 100m | 256Mi | 500m | 1Gi | Memory Only |
#### 3.2.3 스토리지 클래스 구성
| 스토리지 클래스 | 제공자 | 성능 | 용도 | 백업 정책 |
|----------------|--------|------|------|-----------|
| managed-standard | Azure Disk | Standard HDD | 개발용 데이터 저장 | 수동 백업 |
| managed-premium | Azure Disk | Premium SSD | 미사용 (비용 절약) | - |
## 4. 네트워크 아키텍처
### 4.1 네트워크 구성
#### 4.1.1 네트워크 토폴로지
📄 **[개발환경 네트워크 다이어그램](./network-dev.mmd)**
| 네트워크 구성요소 | 주소 대역 | 용도 | 특별 설정 |
|-----------------|----------|------|-----------|
| Virtual Network | phonebill-vnet-dev | 전체 네트워크 | Azure CNI 사용 |
| Public Subnet | 10.0.1.0/24 | Load Balancer, Ingress | 인터넷 연결 |
| Application Subnet | 10.0.2.0/24 | 애플리케이션 Pod | Private 통신 |
| Data Subnet | 10.0.3.0/24 | 데이터베이스, 캐시 | 제한적 접근 |
| Management Subnet | 10.0.4.0/24 | 모니터링, 관리 | 개발용 도구 |
#### 4.1.2 네트워크 보안
**기본 Network Policy:**
| 정책 유형 | 설정 | 설명 |
|-----------|------|---------|
| Default Policy | ALLOW_ALL_NAMESPACES | 개발 편의성을 위한 허용적 정책 |
| Complexity Level | Basic | 단순한 보안 구성 |
**Database 접근 제한:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| 허용 대상 | Application Tier Pods | tier: application 레이블 |
| 프로토콜 | TCP | 데이터베이스 연결 |
| 포트 | 5432, 6379 | PostgreSQL, Redis 포트 |
### 4.2 서비스 디스커버리
| 서비스 | 내부 주소 | 포트 | 용도 |
|--------|-----------|------|------|
| Auth Service | auth-service.phonebill-dev.svc.cluster.local | 8080 | 사용자 인증 API |
| Bill-Inquiry Service | bill-inquiry-service.phonebill-dev.svc.cluster.local | 8080 | 요금 조회 API |
| Product-Change Service | product-change-service.phonebill-dev.svc.cluster.local | 8080 | 상품 변경 API |
| PostgreSQL | postgresql.phonebill-dev.svc.cluster.local | 5432 | 메인 데이터베이스 |
| Redis | redis.phonebill-dev.svc.cluster.local | 6379 | 캐시 서버 |
## 5. 데이터 아키텍처
### 5.1 데이터베이스 구성
#### 5.1.1 주 데이터베이스 Pod 구성
**기본 설정:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| 컨테이너 이미지 | bitnami/postgresql:16 | 안정화된 PostgreSQL 16 |
| CPU 요청 | 500m | 기본 CPU 할당 |
| Memory 요청 | 1Gi | 기본 메모리 할당 |
| CPU 제한 | 1000m | 최대 CPU 사용량 |
| Memory 제한 | 2Gi | 최대 메모리 사용량 |
**스토리지 구성:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| 스토리지 클래스 | managed-standard | Azure Disk Standard |
| 스토리지 크기 | 20Gi | 개발용 충분한 용량 |
| 마운트 경로 | /bitnami/postgresql | 데이터 저장 경로 |
| 백업 전략 | Azure Backup | 일일 자동 백업 |
**데이터베이스 설정값:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| 최대 연결 수 | 100 | 동시 연결 제한 |
| Shared Buffers | 256MB | 공유 버퍼 크기 |
| Effective Cache Size | 1GB | 효과적 캐시 크기 |
| Work Memory | 4MB | 작업 메모리 |
#### 5.1.2 캐시 Pod 구성
**기본 설정:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| 컨테이너 이미지 | bitnami/redis:7.2 | 최신 안정 Redis 버전 |
| CPU 요청 | 100m | 기본 CPU 할당 |
| Memory 요청 | 256Mi | 기본 메모리 할당 |
| CPU 제한 | 500m | 최대 CPU 사용량 |
| Memory 제한 | 1Gi | 최대 메모리 사용량 |
**메모리 설정:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| 데이터 지속성 | Disabled | 개발용, 재시작 시 데이터 손실 허용 |
| 최대 메모리 | 512MB | 메모리 사용 제한 |
| 메모리 정책 | allkeys-lru | LRU 방식 캐시 제거 |
| TTL 설정 | 30분 | 기본 캐시 만료 시간 |
### 5.2 데이터 관리 전략
#### 5.2.1 데이터 초기화
**Kubernetes Job을 통한 데이터 초기화:**
- 데이터베이스 스키마 생성: auth, bill_inquiry, product_change 스키마
- 초기 사용자 데이터: 테스트 계정 생성 (admin, developer, tester)
- 기본 상품 데이터: KOS 연동을 위한 샘플 상품 정보
- 권한 설정: 개발팀용 기본 권한 설정
**실행 절차:**
```yaml
# 데이터 초기화 Job
apiVersion: batch/v1
kind: Job
metadata:
name: data-init-job
spec:
template:
spec:
containers:
- name: init-container
image: bitnami/postgresql:16
env:
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: postgresql-secret
key: postgres-password
command: ["/bin/bash"]
args:
- -c
- |
psql -h postgresql -U postgres -f /scripts/init-schema.sql
psql -h postgresql -U postgres -f /scripts/sample-data.sql
restartPolicy: OnFailure
```
**검증 방법:**
```bash
# 초기화 확인
kubectl exec -it postgresql-0 -- psql -U postgres -c "SELECT COUNT(*) FROM users;"
kubectl exec -it postgresql-0 -- psql -U postgres -c "SELECT COUNT(*) FROM products;"
```
#### 5.2.2 백업 전략
| 서비스 | 백업 방법 | 주기 | 보존 전략 | 참고사항 |
|--------|----------|------|-----------|----------|
| PostgreSQL | Azure Disk Snapshot | 일일 | 7일 보관 | 개발용 데이터 자동 백업 |
| Redis | 없음 | - | 메모리 전용 | 재시작 시 캐시 재구성 |
| Application Logs | Azure Monitor Logs | 실시간 | 14일 보관 | 디버깅용 로그 |
## 6. KOS-Mock 서비스
### 6.1 KOS-Mock 구성
#### 6.1.1 서비스 설정
**KOS-Mock 서비스 구성:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| 컨테이너 이미지 | kos-mock:latest | 개발환경용 Mock 서비스 |
| 포트 | 8080 | HTTP REST API |
| 헬스체크 | /health | 서비스 상태 확인 |
| 데이터베이스 | PostgreSQL | Mock 데이터 저장 |
**제공 API:**
| API 경로 | 메소드 | 용도 | 응답 시간 |
|---------|--------|------|-----------|
| /api/v1/bill-inquiry | POST | 요금 조회 Mock | 100-500ms |
| /api/v1/product-change | POST | 상품 변경 Mock | 200-1000ms |
| /api/v1/customer-info | GET | 고객 정보 Mock | 50-200ms |
| /health | GET | 헬스 체크 | 10ms |
#### 6.1.2 Mock 데이터 설정
**Mock 응답 패턴:**
| 응답 타입 | 비율 | 지연시간 | 용도 |
|-----------|------|---------|------|
| 성공 응답 | 80% | 100-300ms | 정상 케이스 테스트 |
| 지연 응답 | 15% | 1-3초 | 타임아웃 테스트 |
| 오류 응답 | 5% | 100ms | 오류 처리 테스트 |
## 7. 보안 아키텍처
### 7.1 개발환경 보안 정책
#### 7.1.1 기본 보안 설정
**보안 계층별 설정값:**
| 계층 | 설정 | 수준 | 설명 |
|------|------|------|----------|
| L4 네트워크 보안 | Network Security Group | 기본 | 기본 Azure NSG 규칙 |
| L3 클러스터 보안 | Kubernetes RBAC | 기본 | 개발팀 전체 접근 권한 |
| L2 애플리케이션 보안 | JWT 인증 | 기본 | 개발용 고정 시크릿 |
| L1 데이터 보안 | TLS 1.2 | 기본 | Pod 간 암호화 통신 |
**관리 대상 시크릿:**
| 시크릿 이름 | 용도 | 순환 정책 | 저장 위치 |
|-------------|------|----------|----------|
| postgresql-secret | PostgreSQL 접근 | 수동 | Kubernetes Secret |
| redis-secret | Redis 접근 | 수동 | Kubernetes Secret |
| jwt-signing-key | JWT 토큰 서명 | 수동 | Kubernetes Secret |
| kos-mock-config | KOS-Mock 설정 | 수동 | Kubernetes ConfigMap |
#### 7.1.2 시크릿 관리
**시크릿 관리 전략:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| 관리 방식 | Kubernetes Secrets | 기본 K8s 내장 방식 |
| 암호화 방식 | etcd 암호화 | 클러스터 레벨 암호화 |
| 접근 제어 | RBAC | 네임스페이스별 접근 제어 |
| 감사 로그 | Enabled | Secret 접근 로그 기록 |
### 7.2 Network Policies
#### 7.2.1 기본 정책
**Network Policy 설정:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| Policy 이름 | dev-basic-policy | 개발환경 기본 정책 |
| Pod 선택자 | app=phonebill | 애플리케이션 Pod 대상 |
| Ingress 규칙 | 동일 네임스페이스 허용 | 개발환경 편의상 허용적 정책 |
| Egress 규칙 | 외부 시스템 허용 | KOS-Mock 서비스 접근 허용 |
## 8. 모니터링 및 로깅
### 8.1 기본 모니터링
#### 8.1.1 Kubernetes 기본 모니터링
**모니터링 스택 구성:**
| 구성요소 | 도구 | 상태 | 설명 |
|-----------|------|------|----------|
| 메트릭 서버 | Metrics Server | Enabled | 기본 리소스 메트릭 수집 |
| 대시보드 | Kubernetes Dashboard | Enabled | 웹 기반 클러스터 관리 |
| 로그 수집 | kubectl logs | Manual | 수동 로그 확인 |
**기본 알림 임계값:**
| 알림 유형 | 임계값 | 대응 방안 | 알림 대상 |
|-----------|----------|-----------|----------|
| Pod Crash Loop | 5회 연속 재시작 | 개발자 Slack 알림 | 개발팀 |
| Node Not Ready | 5분 이상 | 노드 상태 점검 | 인프라팀 |
| High Memory Usage | 85% 이상 | 리소스 할당 검토 | 개발팀 |
| Disk Usage | 80% 이상 | 스토리지 정리 | 인프라팀 |
#### 8.1.2 애플리케이션 모니터링
**헬스체크 설정:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| Liveness Probe | /actuator/health/liveness | Spring Boot Actuator |
| Readiness Probe | /actuator/health/readiness | 트래픽 수신 준비 상태 |
| 체크 주기 | 30초 | 상태 확인 간격 |
| 타임아웃 | 5초 | 응답 대기 시간 |
**수집 메트릭 유형:**
| 메트릭 유형 | 도구 | 용도 | 보존 기간 |
|-----------|------|------|----------|
| JVM Metrics | Micrometer | 가상머신 성능 모니터링 | 7일 |
| HTTP Request Metrics | Micrometer | API 요청 통계 | 7일 |
| Database Pool Metrics | HikariCP | DB 연결 풀 상태 | 7일 |
| Custom Business Metrics | Micrometer | 비즈니스 지표 | 7일 |
### 8.2 로깅
#### 8.2.1 로그 수집
**로그 수집 방식:**
| 설정 항목 | 값 | 설명 |
|-----------|----|---------|
| 수집 방식 | stdout/stderr | 표준 출력으로 로그 전송 |
| 저장 방식 | Azure Container Logs | AKS 기본 로그 저장소 |
| 보존 기간 | 7일 | 개발환경 단기 보존 |
| 로그 형식 | JSON | 구조화된 로그 형식 |
**로그 레벨별 설정:**
| 로거 유형 | 레벨 | 설명 |
|-----------|------|----------|
| Root Logger | INFO | 전체 시스템 기본 레벨 |
| Application Logger | DEBUG | 개발용 상세 로그 |
| Database Logger | INFO | 데이터베이스 쿼리 로그 |
| External API Logger | DEBUG | 외부 시스템 연동 로그 |
## 9. 배포 관련 컴포넌트
| 컴포넌트 유형 | 컴포넌트 | 역할 | 설정 |
|--------------|----------|------|------|
| Container Registry | Azure Container Registry Basic | 이미지 저장소 | phonebilldev.azurecr.io |
| CI | GitHub Actions | 지속적 통합 | 코드 빌드, 테스트, 이미지 빌드 |
| CD | ArgoCD | GitOps 배포 | 자동 배포, 롤백 |
| 패키지 관리 | Helm | Kubernetes 패키지 관리 | values-dev.yaml 설정 |
| 환경별 설정 | ConfigMap | 환경 변수 관리 | 개발환경 전용 설정 |
| 시크릿 관리 | Kubernetes Secret | 민감 정보 관리 | DB 연결 정보 등 |
## 10. 비용 최적화
### 10.1 개발환경 비용 구조
#### 10.1.1 주요 비용 요소
| 구성요소 | 사양 | 월간 예상 비용 (USD) | 절약 방안 |
|----------|------|---------------------|-----------|
| AKS 클러스터 | 관리형 서비스 | $73 | 기본 서비스 계층 사용 |
| 노드 풀 (VM) | Standard_B2s × 2 | $60 | Spot Instance 적용 |
| Azure Disk | Standard 20GB × 2 | $5 | 개발용 최소 용량 |
| Load Balancer | Basic | $18 | 기본 계층 사용 |
| Container Registry | Basic | $5 | 개발용 기본 계층 |
| 네트워킹 | 데이터 전송 | $10 | 단일 리전 사용 |
| **총합** | | **$171** | **Spot Instance로 $42 절약 가능** |
#### 10.1.2 비용 절약 전략
**컴퓨팅 영역별 절약 방안:**
| 절약 방안 | 절약률 | 적용 방법 | 예상 절약 금액 |
|-----------|----------|----------|----------------|
| Spot Instances | 70% | 노드 풀에 Spot VM 사용 | $42/월 |
| 비업무시간 자동 종료 | 50% | 야간/주말 클러스터 스케일다운 | $30/월 |
| 리소스 Right-sizing | 20% | requests/limits 최적화 | $12/월 |
**스토리지 영역별 절약 방안:**
| 절약 방안 | 절약률 | 적용 방법 | 예상 절약 금액 |
|-----------|----------|----------|----------------|
| Standard Disk 사용 | 60% | Premium 대신 Standard 사용 | 이미 적용 |
| 스토리지 크기 최적화 | 30% | 사용량 모니터링 후 크기 조정 | $2/월 |
**네트워킹 영역별 절약 방안:**
| 절약 방안 | 절약률 | 적용 방법 | 예상 절약 금액 |
|-----------|----------|----------|----------------|
| Basic Load Balancer | 50% | Standard 대신 Basic 사용 | 이미 적용 |
| 단일 리전 배포 | 100% | 데이터 전송 비용 최소화 | $5/월 |
## 11. 개발환경 운영 가이드
### 11.1 일상 운영
#### 11.1.1 환경 시작/종료
**환경 시작 절차:**
```bash
# 클러스터 스케일업
az aks scale --resource-group phonebill-dev-rg --name phonebill-dev-aks --node-count 2
# 애플리케이션 시작
kubectl scale deployment auth-service --replicas=1
kubectl scale deployment bill-inquiry-service --replicas=1
kubectl scale deployment product-change-service --replicas=1
# 백킹 서비스 시작
kubectl scale statefulset postgresql --replicas=1
kubectl scale deployment redis --replicas=1
# 상태 확인
kubectl get pods -w
```
**환경 종료 절차 (야간/주말):**
```bash
# 애플리케이션 종료
kubectl scale deployment --replicas=0 --all
# 백킹 서비스는 데이터 보존을 위해 유지
# 클러스터 스케일다운 (비용 절약)
az aks scale --resource-group phonebill-dev-rg --name phonebill-dev-aks --node-count 1
```
#### 11.1.2 데이터 관리
**개발 데이터 초기화:**
```bash
# 데이터 초기화 Job 실행
kubectl apply -f k8s/jobs/data-init-job.yaml
# 초기화 진행 상황 확인
kubectl logs -f job/data-init-job
# 데이터 초기화 확인
kubectl exec -it postgresql-0 -- psql -U postgres -c "SELECT COUNT(*) FROM users;"
```
**개발 데이터 백업:**
```bash
# 데이터베이스 백업
kubectl exec postgresql-0 -- pg_dump -U postgres phonebill > backup-$(date +%Y%m%d).sql
# Azure Disk 스냅샷 생성
az snapshot create \
--resource-group phonebill-dev-rg \
--name postgresql-snapshot-$(date +%Y%m%d) \
--source postgresql-disk
```
**데이터 복원:**
```bash
# SQL 파일로부터 복원
kubectl exec -i postgresql-0 -- psql -U postgres phonebill < backup.sql
# 스냅샷으로부터 디스크 복원
az disk create \
--resource-group phonebill-dev-rg \
--name postgresql-restored-disk \
--source postgresql-snapshot-20250108
```
### 11.2 트러블슈팅
#### 11.2.1 일반적인 문제 해결
| 문제 유형 | 원인 | 해결방안 | 예방법 |
|-----------|------|----------|----------|
| Pod Pending | 리소스 부족 | 노드 추가 또는 리소스 조정 | 리소스 사용량 모니터링 |
| Database Connection Failed | PostgreSQL Pod 재시작 | Pod 로그 확인 및 재시작 | Health Check 강화 |
| Service Unavailable | Ingress 설정 오류 | Ingress 규칙 확인 및 수정 | 배포 전 설정 검증 |
| Out of Memory | 메모리 한계 초과 | Memory Limits 증대 | 메모리 사용 패턴 분석 |
| Disk Full | 로그 파일 과다 | 로그 정리 및 보존 정책 수정 | 로그 순환 정책 설정 |
**문제 해결 절차:**
```bash
# 1. Pod 상태 확인
kubectl get pods -o wide
kubectl describe pod <pod-name>
# 2. 로그 확인
kubectl logs <pod-name> --tail=50
# 3. 리소스 사용량 확인
kubectl top pods
kubectl top nodes
# 4. 서비스 연결 확인
kubectl get svc
kubectl describe svc <service-name>
# 5. 네트워크 정책 확인
kubectl get networkpolicy
kubectl describe networkpolicy <policy-name>
```
## 12. 개발환경 특성 요약
**핵심 설계 원칙**: 빠른 개발 > 비용 효율 > 단순성 > 실험성
**주요 제약사항**: 95% 가용성, 제한적 확장성, 기본 보안 수준
**최적화 목표**: 개발팀 생산성 향상, 빠른 피드백 루프, 비용 효율적 운영
이 개발환경은 **통신요금 관리 서비스의 빠른 MVP 개발과 검증**에 최적화되어 있으며, Azure의 관리형 서비스를 활용하여 운영 부담을 최소화하면서도 실제 운영환경과 유사한 아키텍처 패턴을 적용했습니다.