클라우드 네이티브 플랫폼 아키텍처
시스템 구성도
┌──────────────────────────────────────────────────┐
│ NCP Cloud │
│ ┌──────────────────────────────────────────────┐│
┌──────────┐ ┌──────────┐ │ │ NKS Cluster ││
│ Client │───▶│ NCP ALB │───│─▶│ ┌──────────────────────────────────────┐ ││
└──────────┘ └──────────┘ │ │ │ Namespace: qgx │ ││
│ │ │ ┌───────┐ ┌────────┐ ┌──────────┐ │ ││
│ │ │ │ front │ │ back │ │ingestion │ │ ││
│ │ │ │:31080 │ │:31090 │ │ :31101 │ │ ││
│ │ │ └───────┘ └───┬────┘ └────┬─────┘ │ ││
│ │ │ │ │ │ ││
│ │ │ ┌────▼───┐ ┌───▼────┐ │ ││
│ │ │ │ MySQL │ │ Kafka │ │ ││
│ │ │ └────────┘ └───┬────┘ │ ││
│ │ │ │ │ ││
│ │ │ ┌───────────┐ ┌────────▼──┐ │ ││
│ │ │ │ qgx-ai │ │ processor │ │ ││
│ │ │ │ :31070 │ │ :31102 │ │ ││
│ │ │ └───────────┘ └───────────┘ │ ││
│ │ └──────────────────────────────────────┘ ││
│ │ ┌──────────────────────────────────────┐ ││
│ │ │ Namespace: monitoring │ ││
│ │ │ Prometheus │ Thanos │ Loki │ Alloy │ ││
│ │ │ Grafana │ Memcached │ ││
│ │ └──────────────────────────────────────┘ ││
│ └──────────────────────────────────────────────┘│
└──────────────────────────────────────────────────┘
MySQL, OpenSearch는 NCP 관리형 서비스 (클러스터 외부, VPC 내부 통신)
기술 스택
| 분류 | 기술 |
|---|---|
| Cloud / K8s | NCP NKS (관리형 Kubernetes) |
| 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 (NCP 관리형), OpenSearch 2.11 (NCP SES) |
| 스토리지 | NCP Object Storage (Loki/Thanos), NKS 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, GPT-4, LangChain | AI/ML 서비스 | 1-3 (HPA) |
| AI Web | React, Vite, Nginx | AI 챗봇 웹 UI | 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
사용자 ──HTTP──▶ ai-web ──REST/SSE──▶ ai-service ──▶ PostgreSQL + GPT-4
리소스 할당
| 서비스 | 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 |
| AI Web | 10m / 100m | 32Mi / 128Mi |
| Admin Frontend | 10m / 100m | 32Mi / 128Mi |
| Admin Backend | 50m / 1000m | 512Mi / 1Gi |
| Kafka (x3) | 500m / 2000m | 1Gi / 2Gi |
네트워크 구성
서비스 타입
| 타입 | 용도 | 대상 |
|---|---|---|
| NodePort | NCP ALB → 서비스 라우팅 | 애플리케이션 8개 |
| ClusterIP | 내부 통신, Blue-Green Preview | Kafka headless, 모니터링, Preview 서비스 |
| LoadBalancer | 직접 외부 노출 | Grafana, Kafka UI, 비밀번호 관리 |
Kubernetes Ingress 미사용 — NCP ALB가 각 서비스의 NodePort로 직접 라우팅.
네트워크 구조
External Traffic
┌──────────┐
│ Client │
└────┬─────┘
▼
┌──────────┐ NodePort
│ ALB │──────────────────┐
└──────────┘ │
▼
┌─────────────────────────────────────────────┐
│ K8s Cluster │
│ │
│ NodePort Services (외부 접근) │
│ front:31080 back:31090 ingestion:31101 │
│ admin-front:31180 admin-back:31190 │
│ ai:31070 ai-web:31071 processor:31102 │
│ │
│ ClusterIP Services (내부 전용) │
│ *-preview (Blue-Green), kafka-headless │
│ monitoring-* (Prometheus, Loki, Grafana) │
│ │
│ LoadBalancer Services (직접 외부) │
│ Kafka UI, Grafana, Vaultwarden │
└─────────────────────────────────────────────┘
도메인 매핑
| 도메인 | 대상 | 용도 |
|---|---|---|
| qgx.co.kr | front:31080 | 사용자 웹 |
| ai.qgx.co.kr | ai-web:31071 | AI 챗봇 웹 |
인프라 도구
| 도구 | 네임스페이스 | 역할 |
|---|---|---|
| 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은 메모리를 일정하게 유지하므로 비효율적