클라우드 네이티브 플랫폼 아키텍처
시스템 구성도
┌────────────────────────────────────────┐
│ Cloud Platform │
│ ┌──────────────────────────────────┐ │
┌──────────┐ ┌──────────┐ │ │ K8s Cluster │ │
│ Client │───▶│ ALB │───│─▶│ ┌──────────────────────────┐ │ │
└──────────┘ └──────────┘ │ │ │ App Namespace │ │ │
│ │ │ ┌───────┐ ┌────────┐ │ │ │
│ │ │ │ front │ │ back │ │ │ │
│ │ │ └───────┘ └───┬────┘ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌────▼───┐ │ │ │
│ │ │ │ MySQL │ │ │ │
│ │ │ └────────┘ │ │ │
│ │ │ ingestion ──▶ Kafka │ │ │
│ │ │ │ │ │ │
│ │ │ ai-service processor │ │ │
│ │ └──────────────────────────┘ │ │
│ │ ┌──────────────────────────┐ │ │
│ │ │ Monitoring Namespace │ │ │
│ │ │ Prometheus │ Thanos │ │ │
│ │ │ Loki │ Alloy │ Grafana │ │ │
│ │ └──────────────────────────┘ │ │
│ └──────────────────────────────────┘ │
└────────────────────────────────────────┘
MySQL, OpenSearch는 클라우드 관리형 서비스 (클러스터 외부, VPC 내부 통신)
기술 스택
| 분류 | 기술 |
|---|---|
| Cloud / K8s | 관리형 Kubernetes Service |
| GitOps | ArgoCD (App of Apps 패턴) |
| 배포 전략 | Argo Rollouts (Blue-Green + K6 Smoke Test) |
| 패키지 관리 | Helm v3 |
| CI | GitHub Actions → GHCR |
| 설정 관리 | ConfigMap + SealedSecrets (별도 레포, Multiple Sources) |
| 모니터링 | Prometheus + Thanos, Loki + Alloy, Grafana |
| 메시지 큐 | Apache Kafka (KRaft, 3-node) |
| DB | MySQL 8.3 (관리형), OpenSearch 2.11 (관리형) |
| 스토리지 | Object Storage (Loki/Thanos), Block Storage (Prometheus/Kafka) |
애플리케이션 서비스 구성
| 서비스 | 기술 스택 | 역할 | Replicas |
|---|---|---|---|
| Frontend | React 18, Vite, Nginx | 사용자 웹 UI | 2-5 (HPA) |
| Backend API | Spring Boot 3.2, Java 21 | 메인 API (멀티테넌트) | 2-5 (HPA) |
| Data Ingestion | Netty 4.1, Java 21 | 실시간 데이터 수집 → Kafka | 2-5 (HPA) |
| Message Processor | Spring Boot 3.2, Kafka Consumer | 메시지 처리 → OpenSearch | 2-5 (HPA) |
| AI Service | Python, LLM, LangChain | AI/ML 서비스 | 1-3 (HPA) |
| Admin Frontend | React 19, Vite, Nginx | 관리자 웹 UI | 2 (고정) |
| Admin Backend | Spring Boot 3.2, Java 21 | 관리자 API | 2 (고정) |
인프라 서비스
| 서비스 | 기술 스택 | 역할 |
|---|---|---|
| Kafka | Apache Kafka 3.9.0 (KRaft) | 메시지 큐 (3-node StatefulSet) |
데이터 흐름
외부 데이터 ──TCP──▶ ingestion ──Kafka──▶ processor ──▶ MySQL + OpenSearch
사용자 ──HTTP──▶ frontend ──REST──▶ backend ──▶ MySQL
관리자 ──HTTP──▶ admin-frontend ──REST──▶ admin-backend ──▶ MySQL
리소스 할당
| 서비스 | CPU (req/limit) | Memory (req/limit) |
|---|---|---|
| Frontend | 10m / 100m | 32Mi / 128Mi |
| Backend API | 100m / 2000m | 768Mi / 1536Mi |
| Data Ingestion | 200m / 2000m | 512Mi / 1Gi |
| Message Processor | 100m / 2000m | 768Mi / 1536Mi |
| AI Service | 500m / 6000m | 2304Mi / 6Gi |
| Admin Frontend | 10m / 100m | 32Mi / 128Mi |
| Admin Backend | 50m / 1000m | 512Mi / 1Gi |
| Kafka (x3) | 500m / 2000m | 1Gi / 2Gi |
네트워크 구성
서비스 타입
| 타입 | 용도 | 대상 |
|---|---|---|
| NodePort | ALB → 서비스 라우팅 | 애플리케이션 7개 |
| ClusterIP | 내부 통신, Blue-Green Preview | Kafka headless, 모니터링, Preview 서비스 |
| LoadBalancer | 직접 외부 노출 | Grafana, Kafka UI, 비밀번호 관리 |
Kubernetes Ingress 미사용 — Cloud ALB가 각 서비스의 NodePort로 직접 라우팅.
네트워크 구조
External Traffic
┌──────────┐
│ Client │
└────┬─────┘
▼
┌──────────┐ NodePort
│ ALB │──────────────────┐
└──────────┘ │
▼
┌─────────────────────────────────────────────┐
│ K8s Cluster │
│ │
│ NodePort Services (외부 접근) │
│ frontend backend ingestion │
│ admin-frontend admin-backend │
│ ai-service processor │
│ │
│ ClusterIP Services (내부 전용) │
│ *-preview (Blue-Green), kafka-headless │
│ monitoring-* (Prometheus, Loki, Grafana) │
│ │
│ LoadBalancer Services (직접 외부) │
│ Kafka UI, Grafana, Vaultwarden │
└─────────────────────────────────────────────┘
인프라 도구
| 도구 | 네임스페이스 | 역할 |
|---|---|---|
| Sealed Secrets | kube-system | SealedSecret → Secret 자동 복호화 |
| Vaultwarden | tools | 팀 비밀번호 관리 |
HPA (Horizontal Pod Autoscaler)
모든 주요 서비스에 CPU 기반 HPA 적용. scaleTargetRef는 Rollout 리소스 대상.
- 일반 서비스: CPU 70%, min 2 / max 5
- AI Service: CPU 60%, min 1 / max 3
- Admin 서비스: HPA 미적용, 고정 2 replicas
- Memory HPA 제거 — JVM은 메모리를 일정하게 유지하므로 비효율적