KT 이벤트 마케팅 서비스 - 개발환경 물리아키텍처 설계서
1. 개요
1.1 설계 목적
본 문서는 KT 이벤트 마케팅 서비스의 개발환경 물리 아키텍처를 정의합니다.
- 설계 범위: 개발환경 전용 물리 인프라 설계
- 설계 목적:
- 비용 효율적인 개발환경 구축
- 빠른 배포와 테스트 지원
- 개발팀 생산성 최적화
- 대상 환경: Azure 기반 개발환경 (Development)
- 대상 시스템: 7개 마이크로서비스 + 백킹서비스
1.2 설계 원칙
개발환경에 적합한 4가지 핵심 설계 원칙을 정의합니다.
| 원칙 |
설명 |
적용 방법 |
| MVP 우선 |
최소 기능으로 빠른 검증 |
Pod 기반 백킹서비스, 단일 인스턴스 |
| 비용 최적화 |
개발환경 비용 최소화 |
Basic 티어 서비스, 스팟 인스턴스 활용 |
| 개발 편의성 |
개발자 접근성 최대화 |
직접 접근 가능한 네트워크, 단순한 보안 |
| 단순성 |
복잡성 최소화 |
단일 VNet, 최소 보안 정책, 모니터링 생략 |
1.3 참조 아키텍처
2. 개발환경 아키텍처 개요
2.1 환경 특성
| 특성 |
개발환경 설정값 |
근거 |
| 목적 |
개발자 기능 개발 및 통합 테스트 |
빠른 피드백 루프 |
| 사용자 규모 |
개발팀 10명 내외 |
소규모 동시 접근 |
| 가용성 목표 |
90% (업무시간 기준) |
야간/주말 중단 허용 |
| 확장성 |
수동 스케일링 |
예측 가능한 부하 |
| 보안 수준 |
기본 보안 (개발자 편의성 우선) |
접근 용이성 중요 |
| 데이터 보호 |
테스트 데이터 (실제 개인정보 없음) |
규제 요구사항 최소 |
2.2 전체 아키텍처
전체 시스템은 사용자 → Ingress → 마이크로서비스 → 백킹서비스 플로우로 구성됩니다.
주요 컴포넌트:
- 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
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 데이터 초기화
# 데이터 초기화 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
실행 절차:
kubectl apply -f db-init-job.yaml
kubectl logs job/db-init-job 실행 결과 확인
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 기본 정책
# 기본적으로 모든 통신 허용 (개발 편의성)
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 환경 시작/종료
# 클러스터 시작 (매일 오전)
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 데이터 관리
# 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 (박영자 "전문 아키텍트")