# 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 (박영자 "전문 아키텍트")