mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2025-12-06 16:46:23 +00:00
✨ 주요 기능 - Azure 기반 물리아키텍처 설계 (개발환경/운영환경) - 7개 마이크로서비스 물리 구조 설계 - 네트워크 아키텍처 다이어그램 작성 (Mermaid) - 환경별 비교 분석 및 마스터 인덱스 문서 📁 생성 파일 - design/backend/physical/physical-architecture.md (마스터) - design/backend/physical/physical-architecture-dev.md (개발환경) - design/backend/physical/physical-architecture-prod.md (운영환경) - design/backend/physical/*.mmd (4개 Mermaid 다이어그램) 🎯 핵심 성과 - 비용 최적화: 개발환경 월 $143, 운영환경 월 $2,860 - 확장성: 개발환경 100명 → 운영환경 10,000명 (100배) - 가용성: 개발환경 95% → 운영환경 99.9% - 보안: 다층 보안 아키텍처 (L1~L4) 🛠️ 기술 스택 - Azure Kubernetes Service (AKS) - Azure Database for PostgreSQL Flexible - Azure Cache for Redis Premium - Azure Service Bus Premium - Application Gateway + WAF 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
402 lines
15 KiB
Markdown
402 lines
15 KiB
Markdown
# KT 이벤트 마케팅 서비스 - 개발환경 물리아키텍처 설계서
|
|
|
|
## 1. 개요
|
|
|
|
### 1.1 설계 목적
|
|
|
|
본 문서는 KT 이벤트 마케팅 서비스의 개발환경 물리 아키텍처를 정의합니다.
|
|
|
|
- **설계 범위**: 개발환경 전용 물리 인프라 설계
|
|
- **설계 목적**:
|
|
- 비용 효율적인 개발환경 구축
|
|
- 빠른 배포와 테스트 지원
|
|
- 개발팀 생산성 최적화
|
|
- **대상 환경**: Azure 기반 개발환경 (Development)
|
|
- **대상 시스템**: 7개 마이크로서비스 + 백킹서비스
|
|
|
|
### 1.2 설계 원칙
|
|
|
|
개발환경에 적합한 4가지 핵심 설계 원칙을 정의합니다.
|
|
|
|
| 원칙 | 설명 | 적용 방법 |
|
|
|------|------|-----------|
|
|
| **MVP 우선** | 최소 기능으로 빠른 검증 | Pod 기반 백킹서비스, 단일 인스턴스 |
|
|
| **비용 최적화** | 개발환경 비용 최소화 | Basic 티어 서비스, 스팟 인스턴스 활용 |
|
|
| **개발 편의성** | 개발자 접근성 최대화 | 직접 접근 가능한 네트워크, 단순한 보안 |
|
|
| **단순성** | 복잡성 최소화 | 단일 VNet, 최소 보안 정책, 모니터링 생략 |
|
|
|
|
### 1.3 참조 아키텍처
|
|
|
|
| 아키텍처 문서 | 연관관계 | 참조 방법 |
|
|
|---------------|----------|-----------|
|
|
| [아키텍처 패턴](../pattern/architecture-pattern.md) | 마이크로서비스 패턴 기반 | 서비스 분리 및 통신 패턴 |
|
|
| [논리 아키텍처](../logical/) | 논리적 컴포넌트 구조 | 물리적 배치 및 연결 관계 |
|
|
| [데이터 설계서](../database/) | 데이터 저장소 요구사항 | PostgreSQL/Redis 구성 |
|
|
| [HighLevel 아키텍처](../high-level-architecture.md) | 전체 시스템 구조 | CI/CD 및 백킹서비스 선정 |
|
|
|
|
## 2. 개발환경 아키텍처 개요
|
|
|
|
### 2.1 환경 특성
|
|
|
|
| 특성 | 개발환경 설정값 | 근거 |
|
|
|------|----------------|------|
|
|
| **목적** | 개발자 기능 개발 및 통합 테스트 | 빠른 피드백 루프 |
|
|
| **사용자 규모** | 개발팀 10명 내외 | 소규모 동시 접근 |
|
|
| **가용성 목표** | 90% (업무시간 기준) | 야간/주말 중단 허용 |
|
|
| **확장성** | 수동 스케일링 | 예측 가능한 부하 |
|
|
| **보안 수준** | 기본 보안 (개발자 편의성 우선) | 접근 용이성 중요 |
|
|
| **데이터 보호** | 테스트 데이터 (실제 개인정보 없음) | 규제 요구사항 최소 |
|
|
|
|
### 2.2 전체 아키텍처
|
|
|
|
전체 시스템은 사용자 → Ingress → 마이크로서비스 → 백킹서비스 플로우로 구성됩니다.
|
|
|
|
- **아키텍처 다이어그램**: [physical-architecture-dev.mmd](./physical-architecture-dev.mmd)
|
|
- **네트워크 다이어그램**: [network-dev.mmd](./network-dev.mmd)
|
|
|
|
**주요 컴포넌트**:
|
|
- **Frontend**: 개발자 및 QA팀 접근
|
|
- **Kubernetes Ingress**: NGINX 기반 라우팅
|
|
- **7개 마이크로서비스**: user, event, content, ai, participation, analytics, distribution
|
|
- **PostgreSQL Pod**: 통합 데이터베이스
|
|
- **Redis Pod**: 캐시 및 세션 저장소
|
|
- **Azure Service Bus**: 비동기 메시징 (Basic 티어)
|
|
|
|
## 3. 컴퓨팅 아키텍처
|
|
|
|
### 3.1 Kubernetes 클러스터 구성
|
|
|
|
#### 3.1.1 클러스터 설정
|
|
|
|
| 설정 항목 | 설정값 | 설명 |
|
|
|-----------|--------|------|
|
|
| **Kubernetes 버전** | 1.28.x | 안정된 최신 버전 |
|
|
| **서비스 계층** | Free 티어 | 개발환경 비용 절약 |
|
|
| **네트워크 플러그인** | Azure CNI | Azure 네이티브 통합 |
|
|
| **DNS** | CoreDNS | 기본 DNS 서비스 |
|
|
| **RBAC** | 활성화 | 기본 보안 설정 |
|
|
| **Pod Security** | 기본 설정 | 개발 편의성 우선 |
|
|
| **Ingress Controller** | NGINX | 단순하고 가벼운 설정 |
|
|
|
|
#### 3.1.2 노드 풀 구성
|
|
|
|
| 노드 풀 | 인스턴스 크기 | 노드 수 | 스케일링 | 가용영역 | 가격 정책 |
|
|
|---------|---------------|---------|----------|----------|----------|
|
|
| **Default** | Standard_B2s | 2-4 노드 | 수동 | Single Zone | 스팟 인스턴스 50% |
|
|
| **사양** | 2 vCPU, 4GB RAM | 최소 2, 최대 4 | kubectl 수동 확장 | Korea Central | 비용 우선 |
|
|
|
|
### 3.2 서비스별 리소스 할당
|
|
|
|
#### 3.2.1 애플리케이션 서비스
|
|
|
|
| 서비스명 | CPU Requests | CPU Limits | Memory Requests | Memory Limits | Replicas |
|
|
|----------|--------------|------------|-----------------|---------------|----------|
|
|
| **user-service** | 100m | 200m | 128Mi | 256Mi | 1 |
|
|
| **event-service** | 100m | 200m | 128Mi | 256Mi | 1 |
|
|
| **content-service** | 100m | 200m | 128Mi | 256Mi | 1 |
|
|
| **ai-service** | 100m | 300m | 256Mi | 512Mi | 1 |
|
|
| **participation-service** | 100m | 200m | 128Mi | 256Mi | 1 |
|
|
| **analytics-service** | 100m | 200m | 128Mi | 256Mi | 1 |
|
|
| **distribution-service** | 100m | 200m | 128Mi | 256Mi | 1 |
|
|
|
|
#### 3.2.2 백킹 서비스
|
|
|
|
| 서비스명 | CPU Requests | CPU Limits | Memory Requests | Memory Limits | Storage |
|
|
|----------|--------------|------------|-----------------|---------------|---------|
|
|
| **postgresql** | 200m | 500m | 512Mi | 1Gi | 20Gi (Premium SSD) |
|
|
| **redis** | 100m | 200m | 128Mi | 256Mi | 1Gi (메모리 기반) |
|
|
|
|
#### 3.2.3 스토리지 클래스 구성
|
|
|
|
| 스토리지 클래스 | 종류 | 성능 | 용도 | 비용 |
|
|
|----------------|------|------|------|------|
|
|
| **managed-premium** | Azure Premium SSD | 최대 5,000 IOPS | PostgreSQL 데이터 | 중간 |
|
|
| **managed** | Azure Standard SSD | 최대 2,000 IOPS | 로그 및 임시 데이터 | 저비용 |
|
|
|
|
## 4. 네트워크 아키텍처
|
|
|
|
### 4.1 네트워크 구성
|
|
|
|
#### 4.1.1 네트워크 토폴로지
|
|
|
|
**네트워크 구성**:
|
|
- **VNet 주소 공간**: 10.0.0.0/16
|
|
- **AKS 서브넷**: 10.0.1.0/24 (사용자, 서비스, 백킹서비스 통합)
|
|
- **Service Bus 서브넷**: 10.0.2.0/24 (Azure Service Bus Basic)
|
|
|
|
**네트워크 다이어그램**: [network-dev.mmd](./network-dev.mmd)
|
|
|
|
#### 4.1.2 네트워크 보안
|
|
|
|
| 정책 유형 | 설정 | 설명 |
|
|
|-----------|------|------|
|
|
| **Network Policy** | 기본 허용 | 개발 편의성 우선 |
|
|
| **접근 제한** | 개발팀 IP 대역만 허용 | 기본 보안 유지 |
|
|
| **포트 정책** | 표준 HTTP/HTTPS 포트 | 80, 443, 8080-8087 |
|
|
|
|
### 4.2 서비스 디스커버리
|
|
|
|
| 서비스명 | 내부 DNS 주소 | 포트 | 용도 |
|
|
|----------|---------------|------|------|
|
|
| **user-service** | user-service:8080 | 8080 | 사용자 관리 API |
|
|
| **event-service** | event-service:8080 | 8080 | 이벤트 관리 API |
|
|
| **content-service** | content-service:8080 | 8080 | 콘텐츠 관리 API |
|
|
| **ai-service** | ai-service:8080 | 8080 | AI 추천 API |
|
|
| **participation-service** | participation-service:8080 | 8080 | 참여 관리 API |
|
|
| **analytics-service** | analytics-service:8080 | 8080 | 분석 API |
|
|
| **distribution-service** | distribution-service:8080 | 8080 | 배포 관리 API |
|
|
| **postgresql** | postgresql:5432 | 5432 | 주 데이터베이스 |
|
|
| **redis** | redis:6379 | 6379 | 캐시 및 세션 |
|
|
|
|
## 5. 데이터 아키텍처
|
|
|
|
### 5.1 데이터베이스 구성
|
|
|
|
#### 5.1.1 주 데이터베이스 Pod 구성
|
|
|
|
| 설정 항목 | 설정값 | 설명 |
|
|
|-----------|--------|------|
|
|
| **컨테이너 이미지** | postgres:15-alpine | 경량화된 PostgreSQL |
|
|
| **CPU** | 200m requests, 500m limits | 개발환경 적정 사양 |
|
|
| **Memory** | 512Mi requests, 1Gi limits | 기본 워크로드 처리 |
|
|
| **Storage** | 20Gi Premium SSD | Azure Disk 연동 |
|
|
| **백업** | 수동 스냅샷 | 주간 단위 수동 백업 |
|
|
| **HA 구성** | 단일 인스턴스 | 비용 최적화 |
|
|
|
|
#### 5.1.2 캐시 Pod 구성
|
|
|
|
| 설정 항목 | 설정값 | 설명 |
|
|
|-----------|--------|------|
|
|
| **컨테이너 이미지** | redis:7-alpine | 경량화된 Redis |
|
|
| **CPU** | 100m requests, 200m limits | 가벼운 캐시 워크로드 |
|
|
| **Memory** | 128Mi requests, 256Mi limits | 기본 캐시 용량 |
|
|
| **Storage** | 1Gi (선택적) | 영구 저장이 필요한 경우만 |
|
|
| **설정** | Default 설정 | 특별한 튜닝 없음 |
|
|
|
|
### 5.2 데이터 관리 전략
|
|
|
|
#### 5.2.1 데이터 초기화
|
|
|
|
```yaml
|
|
# 데이터 초기화 Job 예시
|
|
apiVersion: batch/v1
|
|
kind: Job
|
|
metadata:
|
|
name: db-init-job
|
|
spec:
|
|
template:
|
|
spec:
|
|
containers:
|
|
- name: db-init
|
|
image: postgres:15-alpine
|
|
command: ["/bin/sh"]
|
|
args:
|
|
- -c
|
|
- |
|
|
psql -h postgresql -U postgres -d kt_event_marketing << EOF
|
|
-- 테스트 데이터 생성
|
|
INSERT INTO users (username, email) VALUES ('test_user', 'test@example.com');
|
|
INSERT INTO stores (name, address) VALUES ('테스트 매장', '서울시 강남구');
|
|
EOF
|
|
restartPolicy: OnFailure
|
|
```
|
|
|
|
**실행 절차**:
|
|
1. `kubectl apply -f db-init-job.yaml`
|
|
2. `kubectl logs job/db-init-job` 실행 결과 확인
|
|
3. `kubectl delete job db-init-job` 정리
|
|
|
|
#### 5.2.2 백업 전략
|
|
|
|
| 서비스 | 백업 방법 | 주기 | 보존 기간 | 복구 절차 |
|
|
|--------|-----------|------|-----------|-----------|
|
|
| **PostgreSQL** | Azure Disk 스냅샷 | 주 1회 (금요일) | 4주 | 스냅샷 복원 |
|
|
| **Redis** | RDB 덤프 | 일 1회 | 1주 | 덤프 파일 복원 |
|
|
|
|
## 6. 메시징 아키텍처
|
|
|
|
### 6.1 Message Queue 구성
|
|
|
|
#### 6.1.1 Basic Tier 설정
|
|
|
|
| 설정 항목 | 설정값 | 설명 |
|
|
|-----------|--------|------|
|
|
| **서비스** | Azure Service Bus Basic | 개발환경 최소 비용 |
|
|
| **네임스페이스** | kt-event-dev | 개발 전용 네임스페이스 |
|
|
| **큐 개수** | 3개 | ai-schedule, location-search, notification |
|
|
| **메시지 크기** | 최대 256KB | Basic 티어 제한 |
|
|
| **TTL** | 14일 | 기본 설정 |
|
|
|
|
#### 6.1.2 연결 설정
|
|
|
|
| 설정 항목 | 설정값 | 설명 |
|
|
|-----------|--------|------|
|
|
| **인증** | Connection String | 개발환경 단순 인증 |
|
|
| **연결 풀** | 기본 설정 | 특별한 튜닝 없음 |
|
|
| **재시도 정책** | 3회 재시도 | 기본 resilience |
|
|
| **배치 처리** | 비활성화 | 단순한 메시지 처리 |
|
|
|
|
## 7. 보안 아키텍처
|
|
|
|
### 7.1 개발환경 보안 정책
|
|
|
|
#### 7.1.1 기본 보안 설정
|
|
|
|
| 보안 계층 | 설정값 | 수준 | 관리 대상 시크릿 |
|
|
|-----------|--------|------|-----------------|
|
|
| **네트워크** | 기본 NSG | 기본 | - |
|
|
| **클러스터** | RBAC 활성화 | 기본 | ServiceAccount 토큰 |
|
|
| **애플리케이션** | 기본 설정 | 기본 | DB 연결 정보 |
|
|
| **데이터** | 전송 암호화만 | 기본 | Redis 비밀번호 |
|
|
|
|
#### 7.1.2 시크릿 관리
|
|
|
|
| 시크릿 유형 | 저장 방식 | 순환 정책 | 저장소 |
|
|
|-------------|-----------|-----------|--------|
|
|
| **DB 비밀번호** | Kubernetes Secret | 수동 | etcd |
|
|
| **API 키** | Kubernetes Secret | 월 1회 | etcd |
|
|
| **Service Bus** | Connection String | 수동 | etcd |
|
|
|
|
### 7.2 Network Policies
|
|
|
|
#### 7.2.1 기본 정책
|
|
|
|
```yaml
|
|
# 기본적으로 모든 통신 허용 (개발 편의성)
|
|
apiVersion: networking.k8s.io/v1
|
|
kind: NetworkPolicy
|
|
metadata:
|
|
name: allow-all-dev
|
|
spec:
|
|
podSelector: {}
|
|
policyTypes:
|
|
- Ingress
|
|
- Egress
|
|
ingress:
|
|
- {}
|
|
egress:
|
|
- {}
|
|
```
|
|
|
|
## 8. 모니터링 및 로깅
|
|
|
|
### 8.1 기본 모니터링
|
|
|
|
#### 8.1.1 Kubernetes 기본 모니터링
|
|
|
|
| 컴포넌트 | 설정 | 임계값 |
|
|
|----------|------|--------|
|
|
| **kubectl top** | 기본 메트릭 | CPU 80%, Memory 80% |
|
|
| **기본 알림** | 비활성화 | 개발환경 알림 불필요 |
|
|
|
|
#### 8.1.2 애플리케이션 모니터링
|
|
|
|
| 메트릭 유형 | 수집 방법 | 설정 |
|
|
|-------------|-----------|------|
|
|
| **헬스체크** | Spring Actuator | /actuator/health |
|
|
| **메트릭** | 기본 로그 | stdout 로그만 |
|
|
|
|
### 8.2 로깅
|
|
|
|
#### 8.2.1 로그 수집
|
|
|
|
| 로그 유형 | 수집 방식 | 저장 방식 | 보존 기간 | 로그 레벨 |
|
|
|-----------|-----------|-----------|-----------|-----------|
|
|
| **애플리케이션** | stdout | kubectl logs | 7일 | DEBUG |
|
|
| **시스템** | kubelet | 로컬 | 3일 | INFO |
|
|
|
|
## 9. 배포 관련 컴포넌트
|
|
|
|
| 컴포넌트 | 역할 | 설정 |
|
|
|----------|------|------|
|
|
| **GitHub Actions** | CI/CD 파이프라인 | 기본 워크플로우 |
|
|
| **Docker Registry** | 컨테이너 이미지 저장소 | Azure Container Registry |
|
|
| **kubectl** | 배포 도구 | 수동 배포 |
|
|
| **IntelliJ 프로파일** | 로컬 개발 | 서비스별 실행 프로파일 |
|
|
|
|
## 10. 비용 최적화
|
|
|
|
### 10.1 개발환경 비용 구조
|
|
|
|
#### 10.1.1 주요 비용 요소
|
|
|
|
| 구성요소 | 사양 | 월간 예상 비용 (USD) | 절약 방안 |
|
|
|----------|------|---------------------|-----------|
|
|
| **AKS 클러스터** | Free 티어 | $0 | Free 티어 활용 |
|
|
| **VM 노드** | 2 x Standard_B2s (스팟 50%) | $50 | 스팟 인스턴스 활용 |
|
|
| **Storage** | 50Gi Premium SSD | $10 | 최소 필요 용량만 |
|
|
| **Service Bus** | Basic 티어 | $5 | Basic 티어 사용 |
|
|
| **네트워크** | Standard Load Balancer | $15 | 기본 설정 |
|
|
| **총 예상 비용** | - | **$80** | - |
|
|
|
|
#### 10.1.2 비용 절약 전략
|
|
|
|
| 영역 | 절약 방안 | 절약률 |
|
|
|------|-----------|--------|
|
|
| **컴퓨팅** | 스팟 인스턴스 50% 혼합 | 25% |
|
|
| **스토리지** | 최소 필요 용량만 할당 | 30% |
|
|
| **네트워킹** | 단일 VNet 구성 | 20% |
|
|
|
|
## 11. 개발환경 운영 가이드
|
|
|
|
### 11.1 일상 운영
|
|
|
|
#### 11.1.1 환경 시작/종료
|
|
|
|
```bash
|
|
# 클러스터 시작 (매일 오전)
|
|
az aks start --resource-group kt-event-dev --name kt-event-aks-dev
|
|
|
|
# 서비스 상태 확인
|
|
kubectl get pods -A
|
|
kubectl get svc
|
|
|
|
# 클러스터 종료 (매일 저녁)
|
|
az aks stop --resource-group kt-event-dev --name kt-event-aks-dev
|
|
```
|
|
|
|
#### 11.1.2 데이터 관리
|
|
|
|
```bash
|
|
# PostgreSQL 데이터 백업
|
|
kubectl exec -it postgresql-0 -- pg_dump -U postgres kt_event_marketing > backup.sql
|
|
|
|
# Redis 데이터 백업
|
|
kubectl exec -it redis-0 -- redis-cli --rdb dump.rdb
|
|
|
|
# 데이터 복원
|
|
kubectl exec -i postgresql-0 -- psql -U postgres -d kt_event_marketing < backup.sql
|
|
```
|
|
|
|
### 11.2 트러블슈팅
|
|
|
|
#### 11.2.1 일반적인 문제 해결
|
|
|
|
| 문제 유형 | 원인 | 해결방안 | 예방법 |
|
|
|-----------|------|----------|--------|
|
|
| **Pod 시작 실패** | 리소스 부족 | 노드 스케일 업 | 리소스 모니터링 |
|
|
| **DB 연결 실패** | 네트워크 정책 | Service 확인 | 헬스체크 활성화 |
|
|
| **Service Bus 연결 오류** | 인증 정보 | Secret 재생성 | 정기 키 순환 |
|
|
|
|
## 12. 개발환경 특성 요약
|
|
|
|
**핵심 설계 원칙**:
|
|
- **비용 우선**: 개발환경은 최소 비용으로 구성하여 월 $80 이하 목표
|
|
- **단순성**: 복잡한 HA 구성 없이 단순한 아키텍처 유지
|
|
- **개발 편의성**: 개발자가 쉽게 접근하고 디버깅할 수 있는 환경
|
|
|
|
**주요 제약사항**:
|
|
- **가용성**: 90% (업무시간 기준), 야간/주말 중단 허용
|
|
- **확장성**: 수동 스케일링으로 예측 가능한 부하만 처리
|
|
- **보안**: 기본 보안 설정으로 개발 편의성 우선
|
|
|
|
**최적화 목표**:
|
|
- **빠른 배포**: 5분 이내 전체 환경 배포 완료
|
|
- **비용 효율**: 월 $80 이하 운영 비용 유지
|
|
- **개발 생산성**: 로컬 개발과 유사한 편의성 제공
|
|
|
|
---
|
|
|
|
**문서 버전**: v1.0
|
|
**최종 수정일**: 2025-10-29
|
|
**작성자**: System Architect (박영자 "전문 아키텍트") |