mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2025-12-06 20:06: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>
1128 lines
31 KiB
Markdown
1128 lines
31 KiB
Markdown
# KT 이벤트 마케팅 서비스 - 운영환경 물리아키텍처 설계서
|
|
|
|
## 1. 개요
|
|
|
|
### 1.1 설계 목적
|
|
|
|
본 문서는 KT 이벤트 마케팅 서비스의 운영환경 물리 아키텍처를 정의합니다.
|
|
|
|
- **설계 범위**: 운영환경 전용 물리 인프라 설계
|
|
- **설계 목적**:
|
|
- 고가용성과 확장성을 고려한 프로덕션 환경
|
|
- 엔터프라이즈급 보안과 모니터링 체계
|
|
- 실사용자 규모에 따른 성능 최적화
|
|
- 관리형 서비스 중심의 안정적인 구성
|
|
- **대상 환경**: Azure 기반 운영환경 (Production)
|
|
- **대상 시스템**: 7개 마이크로서비스 + 관리형 백킹서비스
|
|
|
|
### 1.2 설계 원칙
|
|
|
|
운영환경에 적합한 5대 핵심 원칙을 정의합니다.
|
|
|
|
| 원칙 | 설명 | 적용 방법 |
|
|
|------|------|-----------|
|
|
| **고가용성** | 99.9% 이상 가용성 보장 | Multi-Zone 배포, 관리형 서비스 |
|
|
| **확장성** | 자동 스케일링 지원 | HPA, 클러스터 오토스케일러 |
|
|
| **보안 우선** | 다층 보안 아키텍처 | WAF, Private Endpoints, RBAC |
|
|
| **관측 가능성** | 종합 모니터링 체계 | Azure Monitor, Application Insights |
|
|
| **재해복구** | 자동 백업 및 복구 | 지역 간 복제, 자동 장애조치 |
|
|
|
|
### 1.3 참조 아키텍처
|
|
|
|
| 아키텍처 문서 | 연관관계 | 참조 방법 |
|
|
|---------------|----------|-----------|
|
|
| [아키텍처 패턴](../pattern/architecture-pattern.md) | 마이크로서비스 패턴 기반 | 서비스 분리 및 통신 패턴 |
|
|
| [논리 아키텍처](../logical/) | 논리적 컴포넌트 구조 | 물리적 배치 및 연결 관계 |
|
|
| [데이터 설계서](../database/) | 데이터 저장소 요구사항 | 관리형 데이터베이스 구성 |
|
|
| [HighLevel 아키텍처](../high-level-architecture.md) | 전체 시스템 구조 | CI/CD 및 엔터프라이즈 서비스 |
|
|
|
|
## 2. 운영환경 아키텍처 개요
|
|
|
|
### 2.1 환경 특성
|
|
|
|
| 특성 | 운영환경 설정값 | 근거 |
|
|
|------|----------------|------|
|
|
| **목적** | 실제 사용자 서비스 제공 | 비즈니스 연속성 보장 |
|
|
| **사용자 규모** | 1만~10만 명 동시 사용자 | 확장 가능한 아키텍처 |
|
|
| **가용성 목표** | 99.9% (연간 8.7시간 다운타임) | SLA 기준 가용성 |
|
|
| **확장성** | 자동 스케일링 (2-10배) | 트래픽 패턴 대응 |
|
|
| **보안 수준** | 엔터프라이즈급 (다층 보안) | 데이터 보호 및 규제 준수 |
|
|
| **데이터 보호** | 실제 개인정보 보호 | GDPR, 개인정보보호법 준수 |
|
|
|
|
### 2.2 전체 아키텍처
|
|
|
|
전체 시스템은 CDN → Application Gateway → AKS → 관리형 서비스 플로우로 구성됩니다.
|
|
|
|
- **아키텍처 다이어그램**: [physical-architecture-prod.mmd](./physical-architecture-prod.mmd)
|
|
- **네트워크 다이어그램**: [network-prod.mmd](./network-prod.mmd)
|
|
|
|
**주요 컴포넌트**:
|
|
- **Azure Front Door + CDN**: 글로벌 가속 및 DDoS 보호
|
|
- **Application Gateway + WAF**: L7 로드밸런싱 및 웹 보안
|
|
- **AKS Premium**: Multi-Zone Kubernetes 클러스터
|
|
- **Azure Database for PostgreSQL**: 관리형 주 데이터베이스
|
|
- **Azure Cache for Redis**: 관리형 캐시 서비스
|
|
- **Azure Service Bus Premium**: 엔터프라이즈 메시징
|
|
|
|
## 3. 컴퓨팅 아키텍처
|
|
|
|
### 3.1 Kubernetes 클러스터 구성
|
|
|
|
#### 3.1.1 클러스터 설정
|
|
|
|
| 설정 항목 | 설정값 | 설명 |
|
|
|-----------|--------|------|
|
|
| **Kubernetes 버전** | 1.28.x | 안정된 최신 버전 |
|
|
| **서비스 티어** | Standard | 프로덕션 워크로드 지원 |
|
|
| **CNI 플러그인** | Azure CNI | 고성능 네트워킹 |
|
|
| **DNS** | CoreDNS + Private DNS | 내부 도메인 해석 |
|
|
| **RBAC** | 엄격한 권한 관리 | 최소 권한 원칙 |
|
|
| **Pod Security** | Restricted 정책 | 강화된 보안 설정 |
|
|
| **Ingress Controller** | Application Gateway | Azure 네이티브 통합 |
|
|
|
|
#### 3.1.2 노드 풀 구성
|
|
|
|
| 노드 풀 | 인스턴스 크기 | 노드 수 | Multi-Zone | 스케일링 | 용도 |
|
|
|---------|---------------|---------|------------|----------|------|
|
|
| **System** | Standard_D2s_v3 | 3개 (Zone별 1개) | 3-Zone | 수동 | 시스템 워크로드 |
|
|
| **Application** | Standard_D4s_v3 | 6개 (Zone별 2개) | 3-Zone | 자동 (3-15) | 애플리케이션 워크로드 |
|
|
|
|
### 3.2 고가용성 구성
|
|
|
|
#### 3.2.1 Multi-Zone 배포
|
|
|
|
| 가용성 전략 | 설정 | 설명 |
|
|
|-------------|------|------|
|
|
| **Zone 분산** | 3개 Zone 균등 배포 | Korea Central 전 Zone 활용 |
|
|
| **Pod Anti-Affinity** | 활성화 | 동일 Zone 집중 방지 |
|
|
| **Pod Disruption Budget** | 최소 1개 Pod 유지 | 롤링 업데이트 안정성 |
|
|
|
|
### 3.3 서비스별 리소스 할당
|
|
|
|
#### 3.3.1 애플리케이션 서비스
|
|
|
|
| 서비스명 | CPU Requests | CPU Limits | Memory Requests | Memory Limits | Replicas | HPA |
|
|
|----------|--------------|------------|-----------------|---------------|----------|-----|
|
|
| **user-service** | 200m | 500m | 256Mi | 512Mi | 3 | 2-10 |
|
|
| **event-service** | 300m | 800m | 512Mi | 1Gi | 3 | 3-15 |
|
|
| **content-service** | 200m | 500m | 256Mi | 512Mi | 2 | 2-8 |
|
|
| **ai-service** | 500m | 1000m | 1Gi | 2Gi | 2 | 2-8 |
|
|
| **participation-service** | 200m | 500m | 256Mi | 512Mi | 2 | 2-10 |
|
|
| **analytics-service** | 300m | 800m | 512Mi | 1Gi | 2 | 2-6 |
|
|
| **distribution-service** | 200m | 500m | 256Mi | 512Mi | 2 | 2-8 |
|
|
|
|
#### 3.3.2 HPA 구성
|
|
|
|
```yaml
|
|
apiVersion: autoscaling/v2
|
|
kind: HorizontalPodAutoscaler
|
|
metadata:
|
|
name: event-service-hpa
|
|
spec:
|
|
scaleTargetRef:
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
name: event-service
|
|
minReplicas: 3
|
|
maxReplicas: 15
|
|
metrics:
|
|
- type: Resource
|
|
resource:
|
|
name: cpu
|
|
target:
|
|
type: Utilization
|
|
averageUtilization: 70
|
|
- type: Resource
|
|
resource:
|
|
name: memory
|
|
target:
|
|
type: Utilization
|
|
averageUtilization: 80
|
|
behavior:
|
|
scaleUp:
|
|
stabilizationWindowSeconds: 60
|
|
policies:
|
|
- type: Percent
|
|
value: 100
|
|
periodSeconds: 15
|
|
scaleDown:
|
|
stabilizationWindowSeconds: 300
|
|
policies:
|
|
- type: Percent
|
|
value: 10
|
|
periodSeconds: 60
|
|
```
|
|
|
|
## 4. 네트워크 아키텍처
|
|
|
|
### 4.1 네트워크 토폴로지
|
|
|
|
**네트워크 구성**: [network-prod.mmd](./network-prod.mmd)
|
|
|
|
#### 4.1.1 Virtual Network 구성
|
|
|
|
| 서브넷 | 주소 대역 | 용도 | 특별 설정 |
|
|
|--------|-----------|------|-----------|
|
|
| **Gateway Subnet** | 10.0.4.0/24 | Application Gateway | 고정 IP 할당 |
|
|
| **Application Subnet** | 10.0.1.0/24 | AKS 클러스터 | CNI 통합 |
|
|
| **Database Subnet** | 10.0.2.0/24 | 관리형 데이터베이스 | Private Endpoint |
|
|
| **Cache Subnet** | 10.0.3.0/24 | 관리형 캐시 | Private Endpoint |
|
|
|
|
#### 4.1.2 네트워크 보안 그룹
|
|
|
|
| 방향 | 규칙 이름 | 포트 | 소스/대상 | 목적 |
|
|
|------|-----------|------|-----------|------|
|
|
| **Inbound** | AllowHTTPS | 443 | Internet | 웹 트래픽 |
|
|
| **Inbound** | AllowHTTP | 80 | Internet | HTTP 리다이렉트 |
|
|
| **Inbound** | DenyAll | * | * | 기본 거부 |
|
|
| **Outbound** | AllowInternal | * | VNet | 내부 통신 |
|
|
|
|
### 4.2 트래픽 라우팅
|
|
|
|
#### 4.2.1 Application Gateway 구성
|
|
|
|
| 설정 항목 | 설정값 | 설명 |
|
|
|-----------|--------|------|
|
|
| **SKU** | WAF_v2 | Web Application Firewall 포함 |
|
|
| **인스턴스** | 2-10 (자동 스케일링) | 트래픽에 따라 동적 조정 |
|
|
| **Public IP** | 고정 IP | 도메인 연결용 |
|
|
| **백엔드 풀** | AKS NodePort 서비스 | 30080-30086 포트 |
|
|
|
|
#### 4.2.2 WAF 구성
|
|
|
|
```yaml
|
|
# WAF 정책 예시
|
|
apiVersion: network.azure.com/v1
|
|
kind: ApplicationGatewayWebApplicationFirewallPolicy
|
|
metadata:
|
|
name: kt-event-waf-policy
|
|
spec:
|
|
policySettings:
|
|
mode: Prevention
|
|
state: Enabled
|
|
fileUploadLimitInMb: 100
|
|
maxRequestBodySizeInKb: 128
|
|
managedRules:
|
|
managedRuleSets:
|
|
- ruleSetType: OWASP
|
|
ruleSetVersion: "3.2"
|
|
ruleGroupOverrides:
|
|
- ruleGroupName: REQUEST-920-PROTOCOL-ENFORCEMENT
|
|
rules:
|
|
- ruleId: "920230"
|
|
state: Disabled
|
|
customRules:
|
|
- name: RateLimitRule
|
|
priority: 1
|
|
ruleType: RateLimitRule
|
|
rateLimitDuration: PT1M
|
|
rateLimitThreshold: 100
|
|
matchConditions:
|
|
- matchVariables:
|
|
- variableName: RemoteAddr
|
|
action: Block
|
|
```
|
|
|
|
### 4.3 Network Policies
|
|
|
|
#### 4.3.1 마이크로서비스 간 통신 제어
|
|
|
|
| 정책 이름 | Ingress 규칙 | Egress 규칙 | 적용 대상 |
|
|
|-----------|--------------|-------------|-----------|
|
|
| **default-deny** | 모든 트래픽 거부 | 모든 트래픽 거부 | 전체 네임스페이스 |
|
|
| **allow-ingress** | Ingress Controller만 허용 | 제한 없음 | 웹 서비스 |
|
|
| **allow-database** | 애플리케이션만 허용 | DNS, PostgreSQL만 | 데이터베이스 통신 |
|
|
|
|
### 4.4 서비스 디스커버리
|
|
|
|
| 서비스명 | 내부 DNS 주소 | 포트 | 외부 접근 방법 | LoadBalancer 유형 |
|
|
|----------|---------------|------|----------------|--------------------|
|
|
| **user-service** | user-service.prod.svc.cluster.local | 8080 | NodePort 30080 | Application Gateway |
|
|
| **event-service** | event-service.prod.svc.cluster.local | 8080 | NodePort 30081 | Application Gateway |
|
|
| **content-service** | content-service.prod.svc.cluster.local | 8080 | NodePort 30082 | Application Gateway |
|
|
| **ai-service** | ai-service.prod.svc.cluster.local | 8080 | NodePort 30083 | Application Gateway |
|
|
| **participation-service** | participation-service.prod.svc.cluster.local | 8080 | NodePort 30084 | Application Gateway |
|
|
| **analytics-service** | analytics-service.prod.svc.cluster.local | 8080 | NodePort 30085 | Application Gateway |
|
|
| **distribution-service** | distribution-service.prod.svc.cluster.local | 8080 | NodePort 30086 | Application Gateway |
|
|
|
|
## 5. 데이터 아키텍처
|
|
|
|
### 5.1 관리형 주 데이터베이스
|
|
|
|
#### 5.1.1 데이터베이스 구성
|
|
|
|
| 설정 항목 | 설정값 | 설명 |
|
|
|-----------|--------|------|
|
|
| **서비스** | Azure Database for PostgreSQL Flexible | 관리형 데이터베이스 |
|
|
| **버전** | PostgreSQL 15 | 최신 안정 버전 |
|
|
| **SKU** | GP_Standard_D4s_v3 | 4 vCPU, 16GB RAM |
|
|
| **스토리지** | 1TB Premium SSD | 고성능 스토리지 |
|
|
| **고가용성** | Zone Redundant | 다중 Zone 복제 |
|
|
| **백업** | 35일 자동 백업 | Point-in-time 복구 |
|
|
| **보안** | Private Endpoint | VNet 내부 통신만 |
|
|
|
|
#### 5.1.2 읽기 전용 복제본
|
|
|
|
```yaml
|
|
# 읽기 복제본 구성 예시
|
|
apiVersion: dbforpostgresql.azure.com/v1beta1
|
|
kind: FlexibleServer
|
|
metadata:
|
|
name: kt-event-db-replica
|
|
spec:
|
|
location: Korea Central
|
|
sourceServerId: /subscriptions/.../kt-event-db-primary
|
|
replicaRole: Read
|
|
sku:
|
|
name: GP_Standard_D2s_v3
|
|
tier: GeneralPurpose
|
|
storage:
|
|
sizeGB: 512
|
|
tier: P4
|
|
highAvailability:
|
|
mode: ZoneRedundant
|
|
```
|
|
|
|
### 5.2 관리형 캐시 서비스
|
|
|
|
#### 5.2.1 캐시 클러스터 구성
|
|
|
|
| 설정 항목 | 설정값 | 설명 |
|
|
|-----------|--------|------|
|
|
| **서비스** | Azure Cache for Redis Premium | 관리형 캐시 |
|
|
| **크기** | P2 (6GB) | 프로덕션 워크로드 |
|
|
| **복제** | 3개 복제본 | 고가용성 |
|
|
| **클러스터** | 활성화 | 수평 확장 지원 |
|
|
| **지속성** | RDB + AOF | 데이터 영구 저장 |
|
|
| **보안** | Private Endpoint + TLS | 암호화 통신 |
|
|
|
|
#### 5.2.2 캐시 전략
|
|
|
|
```yaml
|
|
# 캐시 정책 예시
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: redis-config
|
|
data:
|
|
redis.conf: |
|
|
# 메모리 정책
|
|
maxmemory-policy allkeys-lru
|
|
|
|
# RDB 스냅샷
|
|
save 900 1
|
|
save 300 10
|
|
save 60 10000
|
|
|
|
# AOF 설정
|
|
appendonly yes
|
|
appendfsync everysec
|
|
|
|
# 클러스터 설정
|
|
cluster-enabled yes
|
|
cluster-config-file nodes.conf
|
|
cluster-node-timeout 5000
|
|
```
|
|
|
|
### 5.3 데이터 백업 및 복구
|
|
|
|
#### 5.3.1 자동 백업 전략
|
|
|
|
```yaml
|
|
# 백업 정책 예시
|
|
apiVersion: backup.azure.com/v1
|
|
kind: BackupPolicy
|
|
metadata:
|
|
name: kt-event-backup-policy
|
|
spec:
|
|
postgresql:
|
|
retentionPolicy:
|
|
dailyBackups: 35
|
|
weeklyBackups: 12
|
|
monthlyBackups: 12
|
|
yearlyBackups: 7
|
|
backupSchedule:
|
|
dailyBackup:
|
|
time: "02:00"
|
|
weeklyBackup:
|
|
day: "Sunday"
|
|
time: "01:00"
|
|
redis:
|
|
retentionPolicy:
|
|
dailyBackups: 7
|
|
weeklyBackups: 4
|
|
persistencePolicy:
|
|
rdbEnabled: true
|
|
aofEnabled: true
|
|
```
|
|
|
|
## 6. 메시징 아키텍처
|
|
|
|
### 6.1 관리형 Message Queue
|
|
|
|
#### 6.1.1 Message Queue 구성
|
|
|
|
```yaml
|
|
# Service Bus Premium 구성
|
|
apiVersion: servicebus.azure.com/v1beta1
|
|
kind: Namespace
|
|
metadata:
|
|
name: kt-event-servicebus-prod
|
|
spec:
|
|
sku:
|
|
name: Premium
|
|
capacity: 1
|
|
zoneRedundant: true
|
|
encryption:
|
|
enabled: true
|
|
networkRuleSets:
|
|
defaultAction: Deny
|
|
virtualNetworkRules:
|
|
- subnetId: /subscriptions/.../vnet/subnets/application
|
|
ignoreMissingVnetServiceEndpoint: false
|
|
privateEndpoints:
|
|
- name: kt-event-sb-pe
|
|
subnetId: /subscriptions/.../vnet/subnets/application
|
|
```
|
|
|
|
#### 6.1.2 큐 및 토픽 설계
|
|
|
|
```yaml
|
|
# 큐 구성 예시
|
|
apiVersion: servicebus.azure.com/v1beta1
|
|
kind: Queue
|
|
metadata:
|
|
name: ai-schedule-generation
|
|
namespace: kt-event-servicebus-prod
|
|
spec:
|
|
maxSizeInMegabytes: 16384
|
|
maxDeliveryCount: 10
|
|
duplicateDetectionHistoryTimeWindow: PT10M
|
|
enablePartitioning: true
|
|
deadLetteringOnMessageExpiration: true
|
|
enableBatchedOperations: true
|
|
autoDeleteOnIdle: P14D
|
|
forwardTo: ""
|
|
forwardDeadLetteredMessagesTo: "ai-schedule-dlq"
|
|
```
|
|
|
|
## 7. 보안 아키텍처
|
|
|
|
### 7.1 다층 보안 아키텍처
|
|
|
|
#### 7.1.1 보안 계층 구조
|
|
|
|
```yaml
|
|
# L1-L4 보안 계층 정의
|
|
securityLayers:
|
|
L1_Network:
|
|
components:
|
|
- Azure Front Door (DDoS Protection)
|
|
- Application Gateway WAF
|
|
- Network Security Groups
|
|
purpose: "네트워크 레벨 보안"
|
|
|
|
L2_Platform:
|
|
components:
|
|
- AKS RBAC
|
|
- Pod Security Standards
|
|
- Network Policies
|
|
purpose: "플랫폼 레벨 보안"
|
|
|
|
L3_Application:
|
|
components:
|
|
- Azure Active Directory
|
|
- Managed Identity
|
|
- OAuth 2.0 / JWT
|
|
purpose: "애플리케이션 레벨 인증/인가"
|
|
|
|
L4_Data:
|
|
components:
|
|
- Private Endpoints
|
|
- TLS 1.3 Encryption
|
|
- Azure Key Vault
|
|
purpose: "데이터 보호 및 암호화"
|
|
```
|
|
|
|
### 7.2 인증 및 권한 관리
|
|
|
|
#### 7.2.1 클라우드 Identity 통합
|
|
|
|
```yaml
|
|
# Azure AD 애플리케이션 등록
|
|
apiVersion: identity.azure.com/v1beta1
|
|
kind: AzureIdentity
|
|
metadata:
|
|
name: kt-event-identity
|
|
spec:
|
|
type: 0 # User Assigned Identity
|
|
resourceID: /subscriptions/.../kt-event-identity
|
|
clientID: xxxx-xxxx-xxxx-xxxx
|
|
---
|
|
apiVersion: identity.azure.com/v1beta1
|
|
kind: AzureIdentityBinding
|
|
metadata:
|
|
name: kt-event-identity-binding
|
|
spec:
|
|
azureIdentity: kt-event-identity
|
|
selector: kt-event-app
|
|
```
|
|
|
|
#### 7.2.2 RBAC 구성
|
|
|
|
```yaml
|
|
# 클러스터 역할 및 서비스 계정
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: ClusterRole
|
|
metadata:
|
|
name: kt-event-app-role
|
|
rules:
|
|
- apiGroups: [""]
|
|
resources: ["secrets", "configmaps"]
|
|
verbs: ["get", "list"]
|
|
- apiGroups: ["apps"]
|
|
resources: ["deployments"]
|
|
verbs: ["get", "list", "watch"]
|
|
---
|
|
apiVersion: v1
|
|
kind: ServiceAccount
|
|
metadata:
|
|
name: kt-event-app-sa
|
|
annotations:
|
|
azure.workload.identity/client-id: xxxx-xxxx-xxxx-xxxx
|
|
---
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: ClusterRoleBinding
|
|
metadata:
|
|
name: kt-event-app-binding
|
|
roleRef:
|
|
apiGroup: rbac.authorization.k8s.io
|
|
kind: ClusterRole
|
|
name: kt-event-app-role
|
|
subjects:
|
|
- kind: ServiceAccount
|
|
name: kt-event-app-sa
|
|
namespace: production
|
|
```
|
|
|
|
### 7.3 네트워크 보안
|
|
|
|
#### 7.3.1 Private Endpoints
|
|
|
|
```yaml
|
|
# PostgreSQL Private Endpoint
|
|
apiVersion: network.azure.com/v1beta1
|
|
kind: PrivateEndpoint
|
|
metadata:
|
|
name: kt-event-db-pe
|
|
spec:
|
|
subnet: /subscriptions/.../vnet/subnets/database
|
|
privateLinkServiceConnections:
|
|
- name: kt-event-db-plsc
|
|
privateLinkServiceId: /subscriptions/.../kt-event-postgresql
|
|
groupIds: ["postgresqlServer"]
|
|
customDnsConfigs:
|
|
- fqdn: kt-event-db.privatelink.postgres.database.azure.com
|
|
ipAddresses: ["10.0.2.10"]
|
|
```
|
|
|
|
### 7.4 암호화 및 키 관리
|
|
|
|
#### 7.4.1 관리형 Key Vault 구성
|
|
|
|
```yaml
|
|
# Key Vault 구성
|
|
apiVersion: keyvault.azure.com/v1beta1
|
|
kind: Vault
|
|
metadata:
|
|
name: kt-event-keyvault-prod
|
|
spec:
|
|
location: Korea Central
|
|
sku:
|
|
family: A
|
|
name: premium
|
|
enabledForDeployment: true
|
|
enabledForDiskEncryption: true
|
|
enabledForTemplateDeployment: true
|
|
enableSoftDelete: true
|
|
softDeleteRetentionInDays: 30
|
|
enablePurgeProtection: true
|
|
networkAcls:
|
|
defaultAction: Deny
|
|
virtualNetworkRules:
|
|
- id: /subscriptions/.../vnet/subnets/application
|
|
accessPolicies:
|
|
- tenantId: xxxx-xxxx-xxxx-xxxx
|
|
objectId: xxxx-xxxx-xxxx-xxxx # Managed Identity
|
|
permissions:
|
|
secrets: ["get", "list"]
|
|
keys: ["get", "list", "decrypt", "encrypt"]
|
|
```
|
|
|
|
## 8. 모니터링 및 관측 가능성
|
|
|
|
### 8.1 종합 모니터링 스택
|
|
|
|
#### 8.1.1 클라우드 모니터링 통합
|
|
|
|
```yaml
|
|
# Azure Monitor 설정
|
|
apiVersion: insights.azure.com/v1beta1
|
|
kind: Workspace
|
|
metadata:
|
|
name: kt-event-workspace-prod
|
|
spec:
|
|
location: Korea Central
|
|
sku:
|
|
name: PerGB2018
|
|
retentionInDays: 30
|
|
publicNetworkAccessForIngestion: Enabled
|
|
publicNetworkAccessForQuery: Enabled
|
|
---
|
|
# Application Insights
|
|
apiVersion: insights.azure.com/v1beta1
|
|
kind: Component
|
|
metadata:
|
|
name: kt-event-appinsights-prod
|
|
spec:
|
|
applicationType: web
|
|
workspaceId: /subscriptions/.../kt-event-workspace-prod
|
|
samplingPercentage: 100
|
|
```
|
|
|
|
#### 8.1.2 메트릭 및 알림
|
|
|
|
```yaml
|
|
# 중요 알림 설정
|
|
apiVersion: insights.azure.com/v1beta1
|
|
kind: MetricAlert
|
|
metadata:
|
|
name: high-cpu-alert
|
|
spec:
|
|
description: "High CPU usage alert"
|
|
severity: 2
|
|
enabled: true
|
|
scopes:
|
|
- /subscriptions/.../resourceGroups/kt-event-prod/providers/Microsoft.ContainerService/managedClusters/kt-event-aks-prod
|
|
evaluationFrequency: PT1M
|
|
windowSize: PT5M
|
|
criteria:
|
|
allOf:
|
|
- metricName: "cpuUsagePercentage"
|
|
operator: GreaterThan
|
|
threshold: 80
|
|
timeAggregation: Average
|
|
actions:
|
|
- actionGroupId: /subscriptions/.../actionGroups/kt-event-alerts
|
|
---
|
|
# 리소스 알림
|
|
apiVersion: insights.azure.com/v1beta1
|
|
kind: ActivityLogAlert
|
|
metadata:
|
|
name: resource-health-alert
|
|
spec:
|
|
description: "Resource health degradation"
|
|
enabled: true
|
|
scopes:
|
|
- /subscriptions/xxxx-xxxx-xxxx-xxxx
|
|
condition:
|
|
allOf:
|
|
- field: category
|
|
equals: ResourceHealth
|
|
- field: properties.currentHealthStatus
|
|
equals: Degraded
|
|
```
|
|
|
|
### 8.2 로깅 및 추적
|
|
|
|
#### 8.2.1 중앙집중식 로깅
|
|
|
|
```yaml
|
|
# Fluentd DaemonSet for log collection
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: fluentd-config
|
|
data:
|
|
fluent.conf: |
|
|
<source>
|
|
@type tail
|
|
path /var/log/containers/*.log
|
|
pos_file /var/log/fluentd-containers.log.pos
|
|
tag kubernetes.*
|
|
read_from_head true
|
|
<parse>
|
|
@type json
|
|
time_format %Y-%m-%dT%H:%M:%S.%NZ
|
|
</parse>
|
|
</source>
|
|
|
|
<match kubernetes.**>
|
|
@type azure-loganalytics
|
|
customer_id "#{ENV['WORKSPACE_ID']}"
|
|
shared_key "#{ENV['WORKSPACE_KEY']}"
|
|
log_type ContainerLogs
|
|
<buffer>
|
|
@type file
|
|
path /var/log/fluentd-buffers/kubernetes.buffer
|
|
flush_mode interval
|
|
flush_interval 30s
|
|
chunk_limit_size 2m
|
|
queue_limit_length 8
|
|
retry_limit 17
|
|
retry_wait 1.0
|
|
</buffer>
|
|
</match>
|
|
```
|
|
|
|
#### 8.2.2 애플리케이션 성능 모니터링
|
|
|
|
```yaml
|
|
# APM 설정 및 커스텀 메트릭
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: apm-config
|
|
data:
|
|
applicationinsights.json: |
|
|
{
|
|
"connectionString": "InstrumentationKey=xxxx-xxxx-xxxx-xxxx;IngestionEndpoint=https://koreacentral-1.in.applicationinsights.azure.com/",
|
|
"role": {
|
|
"name": "kt-event-services"
|
|
},
|
|
"sampling": {
|
|
"percentage": 100
|
|
},
|
|
"instrumentation": {
|
|
"logging": {
|
|
"level": "INFO"
|
|
},
|
|
"micrometer": {
|
|
"enabled": true
|
|
}
|
|
},
|
|
"customMetrics": [
|
|
{
|
|
"name": "business.events.created",
|
|
"description": "Number of events created"
|
|
},
|
|
{
|
|
"name": "business.participants.registered",
|
|
"description": "Number of participants registered"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
## 9. 배포 관련 컴포넌트
|
|
|
|
| 컴포넌트 | 역할 | 설정 | 보안 스캔 | 롤백 정책 |
|
|
|----------|------|------|-----------|-----------|
|
|
| **GitHub Actions** | CI/CD 파이프라인 | Enterprise 워크플로우 | Snyk, SonarQube | 자동 롤백 |
|
|
| **Azure Container Registry** | 컨테이너 이미지 저장소 | Premium 티어 | Vulnerability 스캔 | 이미지 버전 관리 |
|
|
| **ArgoCD** | GitOps 배포 | HA 모드 | Policy 검증 | Git 기반 롤백 |
|
|
| **Helm** | 패키지 관리 | Chart 버전 관리 | 보안 정책 | 릴리스 히스토리 |
|
|
|
|
## 10. 재해복구 및 고가용성
|
|
|
|
### 10.1 재해복구 전략
|
|
|
|
#### 10.1.1 백업 및 복구 목표
|
|
|
|
```yaml
|
|
# RTO/RPO 정의
|
|
disasterRecovery:
|
|
objectives:
|
|
RTO: "1시간" # Recovery Time Objective
|
|
RPO: "15분" # Recovery Point Objective
|
|
strategies:
|
|
database:
|
|
primaryRegion: "Korea Central"
|
|
secondaryRegion: "Korea South"
|
|
replication: "Geo-Redundant"
|
|
automaticFailover: true
|
|
application:
|
|
multiRegion: false
|
|
backupRegion: "Korea South"
|
|
restoreTime: "30분"
|
|
storage:
|
|
replication: "GRS" # Geo-Redundant Storage
|
|
accessTier: "Hot"
|
|
```
|
|
|
|
#### 10.1.2 자동 장애조치
|
|
|
|
```yaml
|
|
# Database Failover Group
|
|
apiVersion: sql.azure.com/v1beta1
|
|
kind: FailoverGroup
|
|
metadata:
|
|
name: kt-event-db-fg
|
|
spec:
|
|
primaryServer: kt-event-db-primary
|
|
partnerServers:
|
|
- name: kt-event-db-secondary
|
|
location: Korea South
|
|
readWriteEndpoint:
|
|
failoverPolicy: Automatic
|
|
failoverWithDataLossGracePeriodMinutes: 60
|
|
readOnlyEndpoint:
|
|
failoverPolicy: Enabled
|
|
databases:
|
|
- kt_event_marketing
|
|
---
|
|
# Redis Cache Failover
|
|
apiVersion: cache.azure.com/v1beta1
|
|
kind: RedisCache
|
|
metadata:
|
|
name: kt-event-cache-secondary
|
|
spec:
|
|
location: Korea South
|
|
sku:
|
|
name: Premium
|
|
capacity: P2
|
|
redisConfiguration:
|
|
rdb-backup-enabled: "true"
|
|
rdb-backup-frequency: "60"
|
|
rdb-backup-max-snapshot-count: "1"
|
|
```
|
|
|
|
### 10.2 비즈니스 연속성
|
|
|
|
#### 10.2.1 운영 절차
|
|
|
|
```yaml
|
|
# 인시던트 대응 절차
|
|
incidentResponse:
|
|
severity1_critical:
|
|
responseTime: "15분"
|
|
escalation: "CTO, 개발팀장"
|
|
communicationChannel: "Slack #incident-critical"
|
|
actions:
|
|
- "자동 스케일링 확인"
|
|
- "장애조치 검토"
|
|
- "고객 공지 준비"
|
|
|
|
severity2_high:
|
|
responseTime: "30분"
|
|
escalation: "개발팀장, 인프라팀"
|
|
communicationChannel: "Slack #incident-high"
|
|
|
|
maintenanceWindow:
|
|
schedule: "매주 일요일 02:00-04:00"
|
|
duration: "2시간"
|
|
approvalRequired: true
|
|
|
|
changeManagement:
|
|
approvalProcess: "2-person approval"
|
|
testingRequired: true
|
|
rollbackPlan: "mandatory"
|
|
```
|
|
|
|
## 11. 비용 최적화
|
|
|
|
### 11.1 운영환경 비용 구조
|
|
|
|
#### 11.1.1 월간 비용 분석
|
|
|
|
| 구성요소 | 사양 | 월간 예상 비용 (USD) | 최적화 방안 |
|
|
|----------|------|---------------------|-------------|
|
|
| **AKS 클러스터** | Standard 티어 | $75 | - |
|
|
| **VM 노드** | 9 x D4s_v3 (Reserved 1년) | $650 | Reserved Instance 30% 할인 |
|
|
| **Application Gateway** | WAF_v2 + 자동스케일링 | $200 | 트래픽 기반 최적화 |
|
|
| **PostgreSQL** | GP_Standard_D4s_v3 + Replica | $450 | Reserved 할인, 읽기 복제본 최적화 |
|
|
| **Redis Cache** | Premium P2 | $300 | 사용량 기반 스케일링 |
|
|
| **Service Bus** | Premium 1 Unit | $700 | 메시지 처리량 기반 |
|
|
| **Storage** | 2TB Premium + 백업 | $150 | 생명주기 정책 |
|
|
| **네트워크** | 트래픽 + Private Endpoint | $200 | CDN 캐시 최적화 |
|
|
| **모니터링** | Log Analytics + App Insights | $100 | 데이터 보존 정책 |
|
|
| **총 예상 비용** | - | **$2,825** | **Reserved Instance로 30% 절약 가능** |
|
|
|
|
#### 11.1.2 비용 최적화 전략
|
|
|
|
```yaml
|
|
# 비용 최적화 전략
|
|
costOptimization:
|
|
computing:
|
|
reservedInstances:
|
|
commitment: "1년"
|
|
savings: "30%"
|
|
targetServices: ["VM", "PostgreSQL"]
|
|
autoScaling:
|
|
schedule: "업무시간 기반"
|
|
metrics: ["CPU", "Memory", "Custom"]
|
|
savings: "20%"
|
|
|
|
storage:
|
|
lifecyclePolicy:
|
|
hotTier: "30일"
|
|
coolTier: "90일"
|
|
archiveTier: "1년"
|
|
savings: "40%"
|
|
compression:
|
|
enabled: true
|
|
savings: "25%"
|
|
|
|
network:
|
|
cdnOptimization:
|
|
cacheHitRatio: ">90%"
|
|
savings: "50%"
|
|
privateEndpoints:
|
|
dataTransferSavings: "60%"
|
|
```
|
|
|
|
### 11.2 성능 대비 비용 효율성
|
|
|
|
#### 11.2.1 Auto Scaling 최적화
|
|
|
|
```yaml
|
|
# 예측 스케일링 설정
|
|
apiVersion: autoscaling/v2
|
|
kind: HorizontalPodAutoscaler
|
|
metadata:
|
|
name: predictive-scaling-hpa
|
|
spec:
|
|
scaleTargetRef:
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
name: event-service
|
|
minReplicas: 3
|
|
maxReplicas: 15
|
|
behavior:
|
|
scaleUp:
|
|
stabilizationWindowSeconds: 30
|
|
policies:
|
|
- type: Percent
|
|
value: 100
|
|
periodSeconds: 15
|
|
- type: Pods
|
|
value: 4
|
|
periodSeconds: 15
|
|
selectPolicy: Max
|
|
scaleDown:
|
|
stabilizationWindowSeconds: 300
|
|
policies:
|
|
- type: Percent
|
|
value: 50
|
|
periodSeconds: 60
|
|
metrics:
|
|
- type: Resource
|
|
resource:
|
|
name: cpu
|
|
target:
|
|
type: Utilization
|
|
averageUtilization: 60
|
|
- type: Pods
|
|
pods:
|
|
metric:
|
|
name: http_requests_per_second
|
|
target:
|
|
type: AverageValue
|
|
averageValue: "1k"
|
|
```
|
|
|
|
## 12. 운영 가이드
|
|
|
|
### 12.1 일상 운영 절차
|
|
|
|
#### 12.1.1 정기 점검 항목
|
|
|
|
```yaml
|
|
# 운영 체크리스트
|
|
operationalChecklist:
|
|
daily:
|
|
- name: "헬스체크 상태 확인"
|
|
command: "kubectl get pods -A | grep -v Running"
|
|
expected: "결과 없음"
|
|
- name: "리소스 사용률 점검"
|
|
command: "kubectl top nodes && kubectl top pods"
|
|
threshold: "CPU 70%, Memory 80%"
|
|
- name: "에러 로그 확인"
|
|
query: "ContainerLogs | where LogLevel == 'ERROR'"
|
|
timeRange: "지난 24시간"
|
|
|
|
weekly:
|
|
- name: "백업 상태 확인"
|
|
service: "PostgreSQL, Redis"
|
|
retention: "35일"
|
|
- name: "보안 업데이트 점검"
|
|
scope: "Node 이미지, 컨테이너 이미지"
|
|
action: "보안 패치 적용"
|
|
- name: "성능 트렌드 분석"
|
|
metrics: "응답시간, 처리량, 에러율"
|
|
comparison: "지난 주 대비"
|
|
|
|
monthly:
|
|
- name: "비용 분석 및 최적화"
|
|
scope: "전체 인프라"
|
|
report: "월간 비용 리포트"
|
|
- name: "용량 계획 수립"
|
|
forecast: "3개월 전망"
|
|
action: "리소스 확장 계획"
|
|
```
|
|
|
|
### 12.2 인시던트 대응
|
|
|
|
#### 12.2.1 장애 대응 절차
|
|
|
|
```yaml
|
|
# 심각도별 대응 절차
|
|
incidentManagement:
|
|
severity1_critical:
|
|
definition: "서비스 완전 중단"
|
|
responseTeam: ["CTO", "개발팀장", "SRE팀"]
|
|
responseTime: "15분"
|
|
communication:
|
|
internal: "Slack #incident-war-room"
|
|
external: "고객 공지 시스템"
|
|
actions:
|
|
- step1: "자동 장애조치 확인"
|
|
- step2: "트래픽 라우팅 재설정"
|
|
- step3: "수동 스케일업"
|
|
- step4: "근본 원인 분석"
|
|
|
|
severity2_high:
|
|
definition: "부분 기능 장애"
|
|
responseTeam: ["개발팀장", "해당 서비스 개발자"]
|
|
responseTime: "30분"
|
|
escalation: "1시간 내 해결 안되면 Severity 1로 상향"
|
|
|
|
severity3_medium:
|
|
definition: "성능 저하"
|
|
responseTeam: ["해당 서비스 개발자"]
|
|
responseTime: "2시간"
|
|
monitoring: "지속적 모니터링 강화"
|
|
```
|
|
|
|
#### 12.2.2 자동 복구 메커니즘
|
|
|
|
```yaml
|
|
# 자동 복구 설정
|
|
autoRecovery:
|
|
podRestart:
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /actuator/health
|
|
port: 8080
|
|
initialDelaySeconds: 60
|
|
periodSeconds: 30
|
|
timeoutSeconds: 10
|
|
failureThreshold: 3
|
|
restartPolicy: Always
|
|
|
|
nodeReplacement:
|
|
trigger: "노드 실패 감지"
|
|
action: "자동 노드 교체"
|
|
timeLimit: "10분"
|
|
|
|
trafficRerouting:
|
|
healthCheck:
|
|
interval: "10초"
|
|
unhealthyThreshold: 3
|
|
action: "자동 트래픽 재라우팅"
|
|
rollback: "헬스체크 통과 시 자동 복구"
|
|
```
|
|
|
|
## 13. 확장 계획
|
|
|
|
### 13.1 단계별 확장 로드맵
|
|
|
|
#### 13.1.1 Phase 1-3
|
|
|
|
```yaml
|
|
# 3단계 확장 계획
|
|
scalingRoadmap:
|
|
phase1_foundation:
|
|
period: "0-6개월"
|
|
target: "안정적 서비스 런칭"
|
|
objectives:
|
|
- "기본 인프라 구축 완료"
|
|
- "모니터링 체계 확립"
|
|
- "초기 사용자 1만명 지원"
|
|
deliverables:
|
|
- "운영환경 배포"
|
|
- "CI/CD 파이프라인"
|
|
- "기본 보안 체계"
|
|
|
|
phase2_growth:
|
|
period: "6-12개월"
|
|
target: "사용자 증가 대응"
|
|
objectives:
|
|
- "사용자 5만명 지원"
|
|
- "성능 최적화"
|
|
- "글로벌 서비스 준비"
|
|
deliverables:
|
|
- "다중 지역 배포"
|
|
- "CDN 최적화"
|
|
- "고급 모니터링"
|
|
|
|
phase3_scale:
|
|
period: "12-24개월"
|
|
target: "대규모 서비스 운영"
|
|
objectives:
|
|
- "사용자 10만명+ 지원"
|
|
- "AI 기능 고도화"
|
|
- "글로벌 서비스 완성"
|
|
deliverables:
|
|
- "멀티 클라우드 구성"
|
|
- "엣지 컴퓨팅 도입"
|
|
- "실시간 AI 추천"
|
|
```
|
|
|
|
### 13.2 기술적 확장성
|
|
|
|
#### 13.2.1 수평 확장 전략
|
|
|
|
```yaml
|
|
# 계층별 확장 전략
|
|
horizontalScaling:
|
|
application:
|
|
currentCapacity: "3-15 replicas per service"
|
|
maxCapacity: "50 replicas per service"
|
|
scalingTrigger: "CPU 70%, Memory 80%"
|
|
estimatedUsers: "10만명 동시 사용자"
|
|
|
|
database:
|
|
currentSetup: "Primary + Read Replica"
|
|
scalingPath:
|
|
- step1: "Read Replica 증설 (최대 5개)"
|
|
- step2: "샤딩 도입 (서비스별)"
|
|
- step3: "Cross-region 복제"
|
|
estimatedCapacity: "100만 트랜잭션/일"
|
|
|
|
cache:
|
|
currentSetup: "Premium P2 (6GB)"
|
|
scalingPath:
|
|
- step1: "P4 (26GB) 확장"
|
|
- step2: "클러스터 모드 활성화"
|
|
- step3: "지역별 캐시 클러스터"
|
|
estimatedCapacity: "1M ops/초"
|
|
```
|
|
|
|
## 14. 운영환경 특성 요약
|
|
|
|
**핵심 설계 원칙**:
|
|
- **고가용성 우선**: 99.9% 가용성을 위한 Multi-Zone, 관리형 서비스 활용
|
|
- **보안 강화**: 다층 보안 아키텍처로 엔터프라이즈급 보안 구현
|
|
- **관측 가능성**: 종합 모니터링으로 사전 문제 감지 및 대응
|
|
- **자동화**: 스케일링, 백업, 복구의 완전 자동화
|
|
- **비용 효율**: Reserved Instance와 자동 스케일링으로 비용 최적화
|
|
|
|
**주요 성과 목표**:
|
|
- **가용성**: 99.9% (연간 8.7시간 다운타임 이하)
|
|
- **성능**: 평균 응답시간 200ms 이하, 동시 사용자 10만명 지원
|
|
- **확장성**: 트래픽 2-10배 자동 스케일링 대응
|
|
- **보안**: 제로 보안 인시던트, 완전한 데이터 암호화
|
|
- **복구**: RTO 1시간, RPO 15분 이하
|
|
|
|
**최적화 목표**:
|
|
- **성능 최적화**: 캐시 적중률 90%+, CDN 활용으로 글로벌 응답속도 향상
|
|
- **비용 최적화**: Reserved Instance로 30% 비용 절감, 자동 스케일링으로 20% 추가 절약
|
|
- **운영 효율성**: 80% 자동화된 운영, 인시던트 자동 감지 및 대응
|
|
|
|
---
|
|
|
|
**문서 버전**: v1.0
|
|
**최종 수정일**: 2025-10-29
|
|
**작성자**: System Architect (박영자 "전문 아키텍트")
|
|
**검토자**: DevOps Engineer (송근정 "데브옵스 마스터") |