mirror of
https://github.com/cna-bootcamp/phonebill.git
synced 2025-12-06 16:16:23 +00:00
1035 lines
28 KiB
Markdown
1035 lines
28 KiB
Markdown
# 물리 아키텍처 설계서 - 운영환경
|
||
|
||
## 1. 개요
|
||
|
||
### 1.1 설계 목적
|
||
- 통신요금 관리 서비스의 **운영환경** Azure 물리 아키텍처 설계
|
||
- 고가용성, 확장성, 보안을 고려한 엔터프라이즈 구성
|
||
- 99.9% 가용성과 엔터프라이즈급 보안 수준 달성
|
||
- Peak 1,000 동시사용자 지원 및 성능 최적화
|
||
|
||
### 1.2 설계 원칙
|
||
- **고가용성**: 99.9% 서비스 가용성 보장 (RTO 30분, RPO 1시간)
|
||
- **확장성**: 자동 스케일링으로 트래픽 변동 대응
|
||
- **보안 우선**: 엔터프라이즈급 다층 보안 아키텍처
|
||
- **관측 가능성**: 포괄적인 모니터링 및 로깅
|
||
- **재해복구**: 자동 백업 및 복구 체계
|
||
|
||
### 1.3 참조 아키텍처
|
||
- HighLevel아키텍처정의서: design/high-level-architecture.md
|
||
- 아키텍처패턴: design/pattern/architecture-pattern.md
|
||
- 논리아키텍처: design/backend/logical/logical-architecture.md
|
||
- 마스터 물리아키텍처: design/backend/physical/physical-architecture.md
|
||
|
||
## 2. 운영환경 아키텍처 개요
|
||
|
||
### 2.1 환경 특성
|
||
- **목적**: 실제 서비스 운영 (통신요금 조회 및 상품 변경)
|
||
- **사용자**: Peak 1,000명 동시 사용자
|
||
- **가용성**: 99.9% (월 43분 다운타임 허용)
|
||
- **확장성**: 자동 스케일링 (10배 트래픽 대응)
|
||
- **보안**: 엔터프라이즈급 다층 보안
|
||
- **클라우드**: Microsoft Azure (단일 클라우드)
|
||
|
||
### 2.2 전체 아키텍처
|
||
|
||
📄 **[운영환경 물리 아키텍처 다이어그램](./physical-architecture-prod.mmd)**
|
||
|
||
**주요 구성 요소:**
|
||
- **프론트엔드**: Azure Front Door + CDN → Application Gateway + WAF
|
||
- **네트워크**: Azure Private Link → Multi-Zone AKS 클러스터
|
||
- **애플리케이션**: Application Subnet (10.0.1.0/24) - 고가용성 리플리카
|
||
- **데이터**: Database Subnet (10.0.2.0/24) - Azure PostgreSQL Flexible
|
||
- **캐시**: Cache Subnet (10.0.3.0/24) - Azure Redis Premium
|
||
- **외부 시스템**: KOS-Mock 서비스 (고가용성 구성)
|
||
|
||
## 3. 컴퓨팅 아키텍처
|
||
|
||
### 3.1 Azure Kubernetes Service (AKS) 구성
|
||
|
||
#### 3.1.1 클러스터 설정
|
||
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| Kubernetes 버전 | 1.29 | 최신 안정 버전 |
|
||
| 서비스 티어 | Standard | 프로덕션 등급 |
|
||
| 네트워크 플러그인 | Azure CNI | 고급 네트워킹 |
|
||
| 네트워크 정책 | Azure Network Policies | Pod 간 통신 제어 |
|
||
| 인그레스 | Application Gateway Ingress Controller | Azure 네이티브 |
|
||
| DNS | CoreDNS | Kubernetes 기본 |
|
||
| RBAC | Azure AD 통합 | 엔터프라이즈 인증 |
|
||
| 프라이빗 클러스터 | true | 보안 강화 |
|
||
|
||
#### 3.1.2 노드 풀 구성
|
||
|
||
**시스템 노드 풀**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| VM 크기 | Standard_D2s_v3 | 2 vCPU, 8GB RAM |
|
||
| 노드 수 | 3개 | 기본 노드 수 |
|
||
| 자동 스케일링 | 활성화 | 동적 확장 |
|
||
| 최소 노드 | 3개 | 최소 보장 |
|
||
| 최대 노드 | 5개 | 확장 한계 |
|
||
| 가용 영역 | 1, 2, 3 | Multi-Zone 배포 |
|
||
|
||
**애플리케이션 노드 풀**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| VM 크기 | Standard_D4s_v3 | 4 vCPU, 16GB RAM |
|
||
| 노드 수 | 3개 | 기본 노드 수 |
|
||
| 자동 스케일링 | 활성화 | 워크로드 기반 확장 |
|
||
| 최소 노드 | 3개 | 최소 보장 |
|
||
| 최대 노드 | 10개 | 확장 한계 |
|
||
| 가용 영역 | 1, 2, 3 | Multi-Zone 배포 |
|
||
| Node Taints | application-workload=true:NoSchedule | 워크로드 격리 |
|
||
|
||
### 3.2 고가용성 구성
|
||
|
||
#### 3.2.1 Multi-Zone 배포
|
||
|
||
**가용성 전략**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| 가용 영역 | 3개 (Korea Central) | 고가용성 보장 |
|
||
| Pod 분산 | Zone 간 균등 배치 | 장애 격리 |
|
||
| Anti-Affinity | 동일 서비스 다른 노드 | 단일점 장애 방지 |
|
||
|
||
**Pod Disruption Budget**
|
||
| 서비스 | 최소 가용 Pod | 설명 |
|
||
|--------|---------------|------|
|
||
| Auth Service | 2개 | 사용자 인증 연속성 |
|
||
| Bill-Inquiry Service | 2개 | 핵심 요금 조회 서비스 |
|
||
| Product-Change Service | 1개 | 상품 변경 최소 보장 |
|
||
|
||
### 3.3 서비스별 리소스 할당
|
||
|
||
#### 3.3.1 애플리케이션 서비스 (운영 최적화)
|
||
| 서비스 | CPU Requests | Memory Requests | CPU Limits | Memory Limits | Replicas | HPA Target |
|
||
|--------|--------------|-----------------|------------|---------------|----------|------------|
|
||
| Auth Service | 200m | 512Mi | 1000m | 1Gi | 3 | CPU 70% |
|
||
| Bill-Inquiry Service | 500m | 1Gi | 2000m | 2Gi | 3 | CPU 70% |
|
||
| Product-Change Service | 300m | 768Mi | 1500m | 1.5Gi | 2 | CPU 70% |
|
||
|
||
#### 3.3.2 HPA (Horizontal Pod Autoscaler) 구성
|
||
```yaml
|
||
hpa_configuration:
|
||
auth_service:
|
||
min_replicas: 3
|
||
max_replicas: 10
|
||
metrics:
|
||
- cpu: 70%
|
||
- memory: 80%
|
||
- custom: requests_per_second > 50
|
||
|
||
bill_inquiry_service:
|
||
min_replicas: 3
|
||
max_replicas: 15
|
||
metrics:
|
||
- cpu: 70%
|
||
- memory: 80%
|
||
- custom: active_connections > 30
|
||
|
||
product_change_service:
|
||
min_replicas: 2
|
||
max_replicas: 8
|
||
metrics:
|
||
- cpu: 70%
|
||
- memory: 80%
|
||
- custom: queue_length > 5
|
||
```
|
||
|
||
## 4. 네트워크 아키텍처
|
||
|
||
### 4.1 네트워크 토폴로지
|
||
|
||
📄 **[운영환경 네트워크 다이어그램](./network-prod.mmd)**
|
||
|
||
**네트워크 흐름:**
|
||
- 인터넷 → Azure Front Door + CDN → Application Gateway + WAF
|
||
- Application Gateway → AKS Premium (Multi-Zone) → Application Services
|
||
- Application Services → Private Endpoints → Azure PostgreSQL/Redis
|
||
- 외부 통신: Application Services → KOS-Mock Service (통신사 API 모의)
|
||
|
||
#### 4.1.1 Virtual Network 구성
|
||
|
||
**VNet 기본 설정**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| 주소 공간 | 10.0.0.0/16 | 전체 VNet 대역대 |
|
||
|
||
**서브넷 세부 구성**
|
||
| 서브넷 이름 | 주소 대역 | 용도 | 특별 설정 |
|
||
|-------------|-----------|------|------------|
|
||
| Application Subnet | 10.0.1.0/24 | AKS 애플리케이션 | Service Endpoints: ContainerRegistry |
|
||
| Database Subnet | 10.0.2.0/24 | PostgreSQL 전용 | Delegation: Microsoft.DBforPostgreSQL |
|
||
| Cache Subnet | 10.0.3.0/24 | Redis 전용 | Service Endpoints: Microsoft.Cache |
|
||
| Gateway Subnet | 10.0.4.0/24 | Application Gateway | 고정 이름: ApplicationGatewaySubnet |
|
||
|
||
#### 4.1.2 네트워크 보안 그룹 (NSG)
|
||
|
||
**Application Gateway NSG**
|
||
| 방향 | 규칙 이름 | 포트 | 소스/대상 | 액션 |
|
||
|------|---------|------|----------|------|
|
||
| 인바운드 | HTTPS | 443 | Internet | Allow |
|
||
| 인바운드 | HTTP | 80 | Internet | Allow |
|
||
|
||
**AKS NSG**
|
||
| 방향 | 규칙 이름 | 포트 | 소스/대상 | 액션 |
|
||
|------|---------|------|----------|------|
|
||
| 인바운드 | AppGateway | 80,443 | ApplicationGatewaySubnet | Allow |
|
||
| 아웃바운드 | Database | 5432 | DatabaseSubnet | Allow |
|
||
| 아웃바운드 | Cache | 6379 | CacheSubnet | Allow |
|
||
|
||
### 4.2 트래픽 라우팅
|
||
|
||
#### 4.2.1 Azure Application Gateway 구성
|
||
|
||
**기본 설정**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| SKU | Standard_v2 | 고성능 버전 |
|
||
| 용량 | 2 (Auto-scaling) | 자동 확장 |
|
||
| 가용 영역 | 1, 2, 3 | Multi-Zone 배포 |
|
||
|
||
**프론트엔드 구성**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| Public IP | 고정 IP | 외부 접근용 |
|
||
| Private IP | 10.0.4.10 | 내부 연결용 |
|
||
|
||
**백엔드 및 라우팅**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| Backend Pool | aks-backend | AKS 노드 (NodePort) |
|
||
| Listener | https-listener (443) | HTTPS, wildcard SSL |
|
||
| Routing Rule | api-routing | /api/* → aks-backend |
|
||
|
||
#### 4.2.2 WAF (Web Application Firewall) 구성
|
||
```yaml
|
||
waf_configuration:
|
||
policy: OWASP CRS 3.2
|
||
mode: Prevention
|
||
|
||
custom_rules:
|
||
- name: RateLimiting
|
||
rate_limit: 100 requests/minute/IP
|
||
action: Block
|
||
|
||
- name: GeoBlocking
|
||
blocked_countries: [] # 필요시 조정
|
||
action: Block
|
||
|
||
managed_rules:
|
||
- OWASP Top 10
|
||
- Known CVEs
|
||
- Bad Reputation IPs
|
||
```
|
||
|
||
### 4.3 Network Policies
|
||
|
||
#### 4.3.1 마이크로서비스 간 통신 제어
|
||
|
||
**Network Policy 기본 설정:**
|
||
| 설정 항목 | 값 | 설명 |
|
||
|-----------|----|---------|
|
||
| API 버전 | networking.k8s.io/v1 | Kubernetes Network Policy v1 |
|
||
| Policy 이름 | production-network-policy | 운영환경 보안 정책 |
|
||
| Pod 선택자 | tier: application | 애플리케이션 Pod만 적용 |
|
||
| 정책 유형 | Ingress, Egress | 인바운드/아웃바운드 모두 제어 |
|
||
|
||
**Ingress 규칙:**
|
||
| 소스 | 허용 포트 | 설명 |
|
||
|------|----------|----------|
|
||
| kube-system 네임스페이스 | TCP:8080 | Ingress Controller에서 접근 |
|
||
|
||
**Egress 규칙:**
|
||
| 대상 | 허용 포트 | 용도 |
|
||
|------|----------|------|
|
||
| app: postgresql | TCP:5432 | 데이터베이스 연결 |
|
||
| app: redis | TCP:6379 | 캐시 서버 연결 |
|
||
| 외부 전체 | TCP:443 | 외부 API 호출 (KOS) |
|
||
|
||
### 4.4 서비스 디스커버리
|
||
|
||
| 서비스 | 내부 주소 | 포트 | 용도 |
|
||
|--------|-----------|------|------|
|
||
| Auth Service | auth-service.phonebill-prod.svc.cluster.local | 8080 | 사용자 인증 API |
|
||
| Bill-Inquiry Service | bill-inquiry-service.phonebill-prod.svc.cluster.local | 8080 | 요금 조회 API |
|
||
| Product-Change Service | product-change-service.phonebill-prod.svc.cluster.local | 8080 | 상품 변경 API |
|
||
| Azure PostgreSQL | phonebill-postgresql.postgres.database.azure.com | 5432 | 관리형 데이터베이스 |
|
||
| Azure Redis | phonebill-redis.redis.cache.windows.net | 6380 | 관리형 캐시 서버 |
|
||
|
||
**비고:**
|
||
- 관리형 서비스는 Azure 내부 FQDN 사용
|
||
- TLS 암호화 및 Private Endpoint를 통한 보안 연결
|
||
|
||
## 5. 데이터 아키텍처
|
||
|
||
### 5.1 Azure Database for PostgreSQL Flexible Server
|
||
|
||
#### 5.1.1 데이터베이스 구성
|
||
|
||
**기본 설정**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| 서비스 티어 | GeneralPurpose | 범용 용도 |
|
||
| SKU | Standard_D4s_v3 | 4 vCPU, 16GB RAM |
|
||
| 스토리지 | 256GB (Premium SSD) | 고성능 SSD |
|
||
|
||
**고가용성**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| HA 모드 | ZoneRedundant | 영역 간 중복화 |
|
||
| Standby Zone | 다른 영역 | 장애 격리 |
|
||
|
||
**백업 및 보안**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| 백업 보존 | 35일 | 장기 보존 |
|
||
| 지리적 복제 | 활성화 | 재해복구 |
|
||
| PITR | 활성화 | 시점 복구 |
|
||
| SSL/TLS | 1.2 | 암호화 통신 |
|
||
| Private Endpoint | 활성화 | 보안 연결 |
|
||
| 방화벽 | AKS 서브넷만 | 접근 제한 |
|
||
|
||
#### 5.1.2 읽기 전용 복제본
|
||
```yaml
|
||
read_replicas:
|
||
replica_1:
|
||
location: Korea South # 다른 리전
|
||
tier: GeneralPurpose
|
||
sku_name: Standard_D2s_v3
|
||
purpose: 읽기 부하 분산
|
||
|
||
replica_2:
|
||
location: Korea Central # 동일 리전
|
||
tier: GeneralPurpose
|
||
sku_name: Standard_D2s_v3
|
||
purpose: 재해복구
|
||
```
|
||
|
||
### 5.2 Azure Cache for Redis Premium
|
||
|
||
#### 5.2.1 Redis 클러스터 구성
|
||
|
||
**기본 설정**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| 서비스 티어 | Premium | 고급 기능 |
|
||
| 용량 | P2 (6GB) | 메모리 크기 |
|
||
| 클러스터링 | 활성화 | 확장성 |
|
||
| 복제 | 활성화 | 데이터 안전성 |
|
||
|
||
**클러스터 구성**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| 샤드 수 | 3개 | 데이터 분산 |
|
||
| 샤드별 복제본 | 1개 | 고가용성 |
|
||
|
||
**지속성 및 보안**
|
||
| 구성 항목 | 설정 값 | 설명 |
|
||
|----------|---------|------|
|
||
| RDB 백업 | 60분 주기 | 스냅샷 백업 |
|
||
| AOF 백업 | 활성화 | 명령 로그 |
|
||
| 인증 | 필수 | 보안 접근 |
|
||
| Private Endpoint | 활성화 | VNet 내부 접근 |
|
||
| Zone Redundant | 활성화 | Multi-Zone 배포 |
|
||
|
||
#### 5.2.2 캐시 전략 (운영 최적화)
|
||
```yaml
|
||
cache_strategy:
|
||
L1_Application:
|
||
type: Caffeine Cache
|
||
ttl: 5분
|
||
max_entries: 2000 # 운영환경 증가
|
||
eviction_policy: LRU
|
||
|
||
L2_Distributed:
|
||
type: Azure Cache for Redis
|
||
ttl: 30분
|
||
clustering: true
|
||
partitioning: consistent_hashing
|
||
|
||
cache_patterns:
|
||
user_session: 30분 TTL
|
||
bill_data: 1시간 TTL
|
||
product_info: 4시간 TTL
|
||
static_content: 24시간 TTL
|
||
```
|
||
|
||
### 5.3 데이터 백업 및 복구
|
||
|
||
#### 5.3.1 자동 백업 전략
|
||
```yaml
|
||
backup_strategy:
|
||
postgresql:
|
||
automated_backup:
|
||
frequency: 매일 02:00 KST
|
||
retention: 35일
|
||
compression: enabled
|
||
encryption: AES-256
|
||
|
||
point_in_time_recovery:
|
||
granularity: 5분
|
||
retention: 35일
|
||
|
||
geo_backup:
|
||
enabled: true
|
||
target_region: Korea South
|
||
|
||
redis:
|
||
rdb_backup:
|
||
frequency: 매시간
|
||
retention: 7일
|
||
|
||
aof_backup:
|
||
enabled: true
|
||
fsync: everysec
|
||
```
|
||
|
||
## 6. 외부 시스템 통신 아키텍처
|
||
|
||
### 6.1 KOS-Mock 서비스 구성
|
||
|
||
#### 6.1.1 KOS-Mock 서비스 설정 (운영환경 최적화)
|
||
```yaml
|
||
kos_mock_service:
|
||
deployment:
|
||
replicas: 3 # 고가용성을 위한 다중 복제본
|
||
image: phonebill/kos-mock-service:latest
|
||
strategy:
|
||
type: RollingUpdate
|
||
rollingUpdate:
|
||
maxSurge: 1
|
||
maxUnavailable: 0 # 무중단 배포
|
||
|
||
resources:
|
||
requests:
|
||
cpu: 200m
|
||
memory: 512Mi
|
||
limits:
|
||
cpu: 1000m
|
||
memory: 1Gi
|
||
|
||
service:
|
||
type: ClusterIP
|
||
port: 8080
|
||
name: kos-mock-service
|
||
|
||
autoscaling:
|
||
enabled: true
|
||
minReplicas: 2 # 최소 가용성 보장
|
||
maxReplicas: 6 # Peak 시간 대응
|
||
targetCPUUtilizationPercentage: 70
|
||
|
||
affinity:
|
||
podAntiAffinity: # Pod 분산 배치
|
||
preferredDuringSchedulingIgnoredDuringExecution:
|
||
- weight: 100
|
||
podAffinityTerm:
|
||
labelSelector:
|
||
matchLabels:
|
||
app: kos-mock-service
|
||
topologyKey: kubernetes.io/hostname
|
||
|
||
health_checks:
|
||
livenessProbe:
|
||
httpGet:
|
||
path: /actuator/health
|
||
port: 8080
|
||
initialDelaySeconds: 30
|
||
periodSeconds: 10
|
||
|
||
readinessProbe:
|
||
httpGet:
|
||
path: /actuator/health/readiness
|
||
port: 8080
|
||
initialDelaySeconds: 5
|
||
periodSeconds: 5
|
||
|
||
monitoring:
|
||
prometheus:
|
||
enabled: true
|
||
path: /actuator/prometheus
|
||
port: 8080
|
||
```
|
||
|
||
#### 6.1.2 KOS API 모의 응답 구성 (운영 수준)
|
||
```yaml
|
||
kos_mock_endpoints:
|
||
bill_inquiry:
|
||
endpoint: "/api/kos/bill-inquiry"
|
||
method: POST
|
||
response_time: 200-500ms
|
||
success_rate: 99.5%
|
||
rate_limit: 100 requests/minute
|
||
|
||
product_change:
|
||
endpoint: "/api/kos/product-change"
|
||
method: POST
|
||
response_time: 300-800ms
|
||
success_rate: 99.8%
|
||
rate_limit: 50 requests/minute
|
||
|
||
authentication:
|
||
endpoint: "/api/kos/auth"
|
||
method: POST
|
||
response_time: 100-200ms
|
||
success_rate: 99.9%
|
||
rate_limit: 200 requests/minute
|
||
|
||
circuit_breaker:
|
||
enabled: true
|
||
failure_threshold: 5
|
||
timeout: 60s
|
||
half_open_max_calls: 3
|
||
|
||
load_balancing:
|
||
algorithm: round_robin
|
||
health_check: "/actuator/health"
|
||
unhealthy_threshold: 3
|
||
healthy_threshold: 2
|
||
```
|
||
|
||
#### 6.1.3 운영환경 보안 및 모니터링
|
||
```yaml
|
||
security_config:
|
||
authentication:
|
||
type: bearer_token
|
||
validation: jwt_signature_check
|
||
|
||
authorization:
|
||
rbac_enabled: true
|
||
allowed_services:
|
||
- bill-inquiry-service
|
||
- product-change-service
|
||
- auth-service
|
||
|
||
network_policies:
|
||
ingress:
|
||
- from:
|
||
- podSelector:
|
||
matchLabels:
|
||
tier: application
|
||
ports:
|
||
- protocol: TCP
|
||
port: 8080
|
||
|
||
monitoring_config:
|
||
metrics:
|
||
- request_count
|
||
- response_time_histogram
|
||
- error_rate
|
||
- circuit_breaker_state
|
||
|
||
alerts:
|
||
high_error_rate:
|
||
threshold: 5%
|
||
window: 5m
|
||
action: notify_ops_team
|
||
|
||
high_response_time:
|
||
threshold: 1000ms
|
||
window: 5m
|
||
action: scale_up
|
||
|
||
logging:
|
||
level: INFO
|
||
format: JSON
|
||
structured_logs: true
|
||
```
|
||
|
||
## 7. 보안 아키텍처
|
||
|
||
### 7.1 다층 보안 아키텍처
|
||
|
||
#### 7.1.1 보안 계층 구조
|
||
```yaml
|
||
security_layers:
|
||
L1_Perimeter:
|
||
components:
|
||
- Azure Front Door (DDoS Protection)
|
||
- WAF (OWASP protection)
|
||
- NSG (Network filtering)
|
||
|
||
L2_Gateway:
|
||
components:
|
||
- Application Gateway (SSL termination)
|
||
- JWT validation
|
||
- Rate limiting
|
||
- IP filtering
|
||
|
||
L3_Identity:
|
||
components:
|
||
- Azure AD integration
|
||
- Managed Identity
|
||
- RBAC policies
|
||
- Workload Identity
|
||
|
||
L4_Data:
|
||
components:
|
||
- Private Endpoints
|
||
- Encryption at rest (TDE)
|
||
- Encryption in transit (TLS 1.3)
|
||
- Key Vault integration
|
||
```
|
||
|
||
### 7.2 인증 및 권한 관리
|
||
|
||
#### 7.2.1 Azure AD 통합
|
||
```yaml
|
||
azure_ad_configuration:
|
||
tenant_id: phonebill-tenant
|
||
|
||
application_registrations:
|
||
- name: phonebill-api
|
||
app_roles:
|
||
- User
|
||
- Admin
|
||
- ServiceAccount
|
||
|
||
managed_identity:
|
||
system_assigned: enabled
|
||
user_assigned:
|
||
- identity: phonebill-services
|
||
permissions:
|
||
- Key Vault: get secrets
|
||
- PostgreSQL: connect
|
||
- Redis: connect
|
||
- KOS-Mock: service communication
|
||
```
|
||
|
||
#### 7.2.2 RBAC 구성
|
||
```yaml
|
||
rbac_configuration:
|
||
cluster_roles:
|
||
- name: application-reader
|
||
permissions:
|
||
- get pods, services, configmaps
|
||
|
||
- name: application-writer
|
||
permissions:
|
||
- create, update, delete applications
|
||
|
||
service_accounts:
|
||
- name: auth-service-sa
|
||
bindings: application-reader
|
||
|
||
- name: bill-inquiry-service-sa
|
||
bindings: application-reader
|
||
|
||
- name: product-change-service-sa
|
||
bindings: application-reader
|
||
|
||
- name: deployment-sa
|
||
bindings: application-writer
|
||
```
|
||
|
||
### 7.3 네트워크 보안
|
||
|
||
#### 7.3.1 Private Endpoints
|
||
```yaml
|
||
private_endpoints:
|
||
postgresql:
|
||
subnet: database_subnet
|
||
dns_zone: privatelink.postgres.database.azure.com
|
||
|
||
redis:
|
||
subnet: cache_subnet
|
||
dns_zone: privatelink.redis.cache.windows.net
|
||
|
||
key_vault:
|
||
subnet: application_subnet
|
||
dns_zone: privatelink.vaultcore.azure.net
|
||
```
|
||
|
||
### 7.4 암호화 및 키 관리
|
||
|
||
#### 7.4.1 Azure Key Vault 구성
|
||
```yaml
|
||
key_vault_configuration:
|
||
tier: Premium (HSM)
|
||
network_access: Private endpoint only
|
||
|
||
access_policies:
|
||
managed_identity:
|
||
- secret_permissions: [get, list]
|
||
- key_permissions: [get, list, decrypt, encrypt]
|
||
|
||
secrets:
|
||
- jwt_signing_key
|
||
- database_passwords
|
||
- redis_auth_key
|
||
- kos_api_credentials
|
||
- kos_mock_config
|
||
|
||
certificates:
|
||
- ssl_wildcard_cert
|
||
- client_certificates
|
||
|
||
rotation_policy:
|
||
secrets: 90일
|
||
certificates: 365일
|
||
```
|
||
|
||
## 8. 모니터링 및 관측 가능성
|
||
|
||
### 8.1 종합 모니터링 스택
|
||
|
||
#### 8.1.1 Azure Monitor 통합
|
||
```yaml
|
||
azure_monitor_configuration:
|
||
log_analytics_workspace:
|
||
name: law-phonebill-prod
|
||
retention: 90일
|
||
daily_cap: 5GB
|
||
|
||
application_insights:
|
||
name: appi-phonebill-prod
|
||
sampling_percentage: 10
|
||
|
||
container_insights:
|
||
enabled: true
|
||
log_collection: stdout, stderr
|
||
metric_collection: cpu, memory, network
|
||
```
|
||
|
||
#### 8.1.2 메트릭 및 알림
|
||
```yaml
|
||
alerting_configuration:
|
||
critical_alerts:
|
||
- name: High Error Rate
|
||
metric: failed_requests > 5%
|
||
window: 5분
|
||
action: Teams + Email
|
||
|
||
- name: High Response Time
|
||
metric: avg_response_time > 3초
|
||
window: 5분
|
||
action: Teams notification
|
||
|
||
- name: Pod Crash Loop
|
||
metric: pod_restarts > 5 in 10분
|
||
action: Auto-scale + notification
|
||
|
||
resource_alerts:
|
||
- name: High CPU Usage
|
||
metric: cpu_utilization > 85%
|
||
window: 10분
|
||
action: Auto-scale trigger
|
||
|
||
- name: High Memory Usage
|
||
metric: memory_utilization > 90%
|
||
window: 5분
|
||
action: Teams notification
|
||
```
|
||
|
||
### 8.2 로깅 및 추적
|
||
|
||
#### 8.2.1 중앙집중식 로깅
|
||
```yaml
|
||
logging_configuration:
|
||
log_collection:
|
||
agent: Azure Monitor Agent
|
||
sources:
|
||
- application_logs: JSON format
|
||
- kubernetes_logs: system events
|
||
- security_logs: audit events
|
||
|
||
log_analytics_queries:
|
||
error_analysis: |
|
||
ContainerLog
|
||
| where LogEntry contains "ERROR"
|
||
| summarize count() by Computer, ContainerName
|
||
|
||
performance_analysis: |
|
||
Perf
|
||
| where CounterName == "% Processor Time"
|
||
| summarize avg(CounterValue) by Computer
|
||
```
|
||
|
||
#### 8.2.2 애플리케이션 성능 모니터링 (APM)
|
||
```yaml
|
||
apm_configuration:
|
||
application_insights:
|
||
auto_instrumentation: enabled
|
||
dependency_tracking: true
|
||
|
||
custom_metrics:
|
||
business_metrics:
|
||
- bill_inquiry_success_rate
|
||
- product_change_success_rate
|
||
- user_satisfaction_score
|
||
|
||
technical_metrics:
|
||
- database_connection_pool
|
||
- cache_hit_ratio
|
||
- message_queue_depth
|
||
```
|
||
|
||
## 9. 배포 관련 컴포넌트
|
||
|
||
| 컴포넌트 유형 | 컴포넌트 | 설명 |
|
||
|--------------|----------|------|
|
||
| Container Registry | Azure Container Registry (Premium) | 운영용 이미지 저장소, Geo-replication |
|
||
| CI | GitHub Actions | 지속적 통합 파이프라인 |
|
||
| CD | ArgoCD | GitOps 패턴 지속적 배포, Blue-Green 배포 |
|
||
| 패키지 관리 | Helm | Kubernetes 패키지 관리 도구 |
|
||
| 환경별 설정 | values-prod.yaml | 운영환경 Helm 설정 파일 |
|
||
| 보안 스캔 | Trivy | Container 이미지 취약점 스캐너 |
|
||
| 인증 | Azure AD Service Principal | OIDC 기반 배포 인증 |
|
||
| 롤백 정책 | ArgoCD Auto Rollback | 헬스체크 실패 시 5분 내 자동 롤백 |
|
||
|
||
## 10. 재해복구 및 고가용성
|
||
|
||
### 10.1 재해복구 전략
|
||
|
||
#### 10.1.1 백업 및 복구 목표
|
||
```yaml
|
||
disaster_recovery:
|
||
rto: 30분 # Recovery Time Objective
|
||
rpo: 1시간 # Recovery Point Objective
|
||
|
||
backup_strategy:
|
||
primary_region: Korea Central
|
||
dr_region: Korea South
|
||
|
||
data_replication:
|
||
postgresql: 지속적 복제
|
||
redis: RDB + AOF 백업
|
||
application_state: stateless (복구 불필요)
|
||
```
|
||
|
||
#### 10.1.2 자동 장애조치
|
||
```yaml
|
||
failover_configuration:
|
||
database:
|
||
postgresql:
|
||
auto_failover: enabled
|
||
failover_time: <60초
|
||
|
||
cache:
|
||
redis:
|
||
geo_replication: enabled
|
||
manual_failover: 관리자 승인 필요
|
||
|
||
application:
|
||
multi_region_deployment: 단일 리전 (Phase 2에서 확장)
|
||
traffic_manager: Azure Front Door
|
||
```
|
||
|
||
### 10.2 비즈니스 연속성
|
||
|
||
#### 10.2.1 운영 절차
|
||
```yaml
|
||
operational_procedures:
|
||
incident_response:
|
||
severity_1: 즉시 대응 (15분 이내)
|
||
severity_2: 2시간 이내 대응
|
||
severity_3: 24시간 이내 대응
|
||
|
||
maintenance_windows:
|
||
scheduled: 매주 일요일 02:00-04:00 KST
|
||
emergency: 언제든지 (승인 필요)
|
||
|
||
change_management:
|
||
approval_required: production changes
|
||
testing_required: staging environment validation
|
||
rollback_plan: mandatory for all changes
|
||
```
|
||
|
||
## 11. 비용 최적화
|
||
|
||
### 11.1 운영환경 비용 구조
|
||
|
||
#### 11.1.1 월간 비용 분석 (USD)
|
||
| 구성요소 | 사양 | 예상 비용 | 최적화 방안 |
|
||
|----------|------|-----------|-------------|
|
||
| AKS 노드 | D4s_v3 × 6개 | $1,200 | Reserved Instance |
|
||
| PostgreSQL | GP Standard_D4s_v3 | $450 | 읽기 복제본 최적화 |
|
||
| Redis | Premium P2 | $250 | 용량 기반 스케일링 |
|
||
| Application Gateway | Standard_v2 | $150 | 트래픽 기반 |
|
||
| KOS-Mock Service | AKS 내 Pod | $0 | 내부 서비스 (별도 비용 없음) |
|
||
| Load Balancer | Standard | $50 | 고정 비용 |
|
||
| 스토리지 | Premium SSD | $100 | 계층화 스토리지 |
|
||
| 네트워킹 | 데이터 전송 | $150 | CDN 활용 |
|
||
| 모니터링 | Log Analytics | $100 | 로그 retention 최적화 |
|
||
| **총합** | | **$2,450** | |
|
||
|
||
#### 11.1.2 비용 최적화 전략
|
||
```yaml
|
||
cost_optimization:
|
||
compute:
|
||
- Reserved Instances: 1년 약정 (30% 절약)
|
||
- Right-sizing: 실제 사용량 기반 조정
|
||
- Auto-scaling: 사용량 기반 동적 확장
|
||
|
||
storage:
|
||
- 계층화: Hot/Cool/Archive 적절 분배
|
||
- 압축: 백업 데이터 압축
|
||
- 정리: 불필요한 로그/메트릭 정리
|
||
|
||
network:
|
||
- CDN 활용: 정적 콘텐츠 캐싱
|
||
- 압축: HTTP 응답 압축
|
||
- 최적화: 불필요한 데이터 전송 제거
|
||
```
|
||
|
||
### 11.2 성능 대비 비용 효율성
|
||
|
||
#### 11.2.1 Auto Scaling 최적화
|
||
```yaml
|
||
scaling_optimization:
|
||
predictive_scaling:
|
||
- 시간대별 패턴 학습
|
||
- 요일별 트래픽 예측
|
||
- 계절성 반영
|
||
|
||
cost_aware_scaling:
|
||
- 피크 시간: 성능 우선
|
||
- 비피크 시간: 비용 우선
|
||
- 최소 인스턴스: 서비스 연속성
|
||
```
|
||
|
||
## 12. 운영 가이드
|
||
|
||
### 12.1 일상 운영 절차
|
||
|
||
#### 12.1.1 정기 점검 항목
|
||
```yaml
|
||
daily_operations:
|
||
health_check:
|
||
- [ ] 모든 서비스 상태 확인
|
||
- [ ] 에러 로그 검토
|
||
- [ ] 성능 메트릭 확인
|
||
- [ ] 보안 알림 검토
|
||
|
||
weekly_operations:
|
||
- [ ] 용량 계획 검토
|
||
- [ ] 백업 상태 확인
|
||
- [ ] 보안 패치 적용
|
||
- [ ] 성능 최적화 검토
|
||
|
||
monthly_operations:
|
||
- [ ] 비용 분석 및 최적화
|
||
- [ ] 재해복구 테스트
|
||
- [ ] 용량 계획 업데이트
|
||
- [ ] 보안 감사
|
||
```
|
||
|
||
### 12.2 인시던트 대응
|
||
|
||
#### 12.2.1 장애 대응 절차
|
||
```yaml
|
||
incident_response:
|
||
severity_1: # 서비스 완전 중단
|
||
response_time: 15분 이내
|
||
escalation: 즉시 관리팀 호출
|
||
action: 즉시 복구 조치
|
||
|
||
severity_2: # 성능 저하
|
||
response_time: 1시간 이내
|
||
escalation: 업무시간 내 대응
|
||
action: 근본 원인 분석
|
||
|
||
severity_3: # 경미한 문제
|
||
response_time: 24시간 이내
|
||
escalation: 정기 미팅에서 논의
|
||
action: 다음 릴리스에서 수정
|
||
```
|
||
|
||
#### 12.2.2 자동 복구 메커니즘
|
||
```yaml
|
||
auto_recovery:
|
||
pod_restart:
|
||
trigger: liveness probe 실패
|
||
action: Pod 자동 재시작
|
||
|
||
node_replacement:
|
||
trigger: Node 장애 감지
|
||
action: 새 Node 자동 생성
|
||
|
||
traffic_routing:
|
||
trigger: 백엔드 서비스 장애
|
||
action: 트래픽 다른 인스턴스로 라우팅
|
||
```
|
||
|
||
## 13. 확장 계획
|
||
|
||
### 13.1 단계별 확장 로드맵
|
||
|
||
#### 13.1.1 Phase 1 (현재 - 6개월)
|
||
```yaml
|
||
phase_1:
|
||
focus: 안정적인 운영환경 구축
|
||
targets:
|
||
- 99.9% 가용성 달성
|
||
- 1,000 동시 사용자 지원
|
||
- 기본 모니터링 및 알림
|
||
|
||
deliverables:
|
||
- [ ] 운영환경 배포
|
||
- [ ] CI/CD 파이프라인 완성
|
||
- [ ] 기본 보안 정책 적용
|
||
- [ ] 모니터링 대시보드 구축
|
||
```
|
||
|
||
#### 13.1.2 Phase 2 (6-12개월)
|
||
```yaml
|
||
phase_2:
|
||
focus: 성능 최적화 및 확장
|
||
targets:
|
||
- 10,000 동시 사용자 지원
|
||
- 응답시간 200ms 이내
|
||
- 고급 보안 기능
|
||
|
||
deliverables:
|
||
- [ ] 성능 최적화
|
||
- [ ] 캐시 전략 고도화
|
||
- [ ] 보안 강화
|
||
- [ ] 비용 최적화
|
||
```
|
||
|
||
#### 13.1.3 Phase 3 (12-18개월)
|
||
```yaml
|
||
phase_3:
|
||
focus: 멀티 리전 확장
|
||
targets:
|
||
- 다중 리전 배포
|
||
- 글로벌 로드 밸런싱
|
||
- 지역별 데이터 센터
|
||
|
||
deliverables:
|
||
- [ ] 다중 리전 아키텍처
|
||
- [ ] 글로벌 CDN
|
||
- [ ] 지역별 재해복구
|
||
- [ ] 글로벌 모니터링
|
||
```
|
||
|
||
### 13.2 기술적 확장성
|
||
|
||
#### 13.2.1 수평 확장 전략
|
||
```yaml
|
||
horizontal_scaling:
|
||
application_tier:
|
||
current_capacity: 1,000 users
|
||
scaling_factor: 10x (HPA)
|
||
max_capacity: 10,000 users
|
||
|
||
database_tier:
|
||
read_replicas: 최대 5개
|
||
connection_pooling: 최적화
|
||
query_optimization: 지속적 개선
|
||
|
||
cache_tier:
|
||
redis_cluster: 노드 확장
|
||
cache_hit_ratio: 95% 목표
|
||
memory_optimization: 지속적 모니터링
|
||
```
|
||
|
||
## 14. 운영환경 특성 요약
|
||
|
||
**핵심 설계 원칙**: 고가용성 > 보안성 > 확장성 > 관측성 > 비용 효율성
|
||
**주요 성과 목표**: 99.9% 가용성, 1,000 동시 사용자, 엔터프라이즈급 보안
|
||
|
||
이 운영환경은 **통신요금 관리 서비스 운영**과 **단계적 확장**에 최적화되어 있습니다. |