Wave 아키텍처
Wave는 확장성과 안정성을 갖추고 기존 Kubernetes 환경과 매끄럽게 통합되도록 설계된 클라우드 네이티브 아키텍처로 만들어졌습니다. 시스템은 중앙 집중형 StatefulSet과 분산된 DaemonSet, 두 워크로드에 걸쳐 배포되는 다섯 가지 핵심 구성 요소로 이루어져 있습니다.
시스템 구성 요소
Wave는 컨테이너 3개를 담은 StatefulSet pod 하나와, 모든 노드에서 컨테이너 2개를 실행하는 DaemonSet으로 배포됩니다.
구성 요소 개요
| Component | Type | Port | Primary Function |
|---|---|---|---|
| Core | StatefulSet | 3024 | API 서버 및 오케스트레이션 |
| Web Console | StatefulSet | 3025 | 관리용 UI |
| Intelligence | StatefulSet | 3026 | ML 엔진 |
| Agent | DaemonSet | - | 메트릭 수집 |
| cAdvisor | DaemonSet | 8080 | 컨테이너 메트릭 |
resource requests는 고정된 값이 아니라 클러스터 규모에 따라 달라집니다. 아래 Resource Requirements를 참고하세요.
StatefulSet 구성 요소
Wave의 StatefulSet은 하나의 pod 안에서 긴밀하게 결합된 컨테이너 3개를 실행합니다.
Wave Core
Kubernetes 리소스 관리 및 API 서버
Key Responsibilities
- 모든 자동화 액션의 중앙 오케스트레이션
- Web Console 및 외부 연동을 위한 RESTful API
- 클러스터 리소스 모니터링 및 관리
- Autopilot 및 Smart Sizing 실행
- Kubernetes API 연동 (스케일링, 사이징, 업데이트)
Wave Web Console
모니터링 및 설정을 위한 브라우저 기반 UI
Technology: Node.js 웹 애플리케이션
Key Responsibilities
- 클러스터 메트릭 실시간 대시보드
- 워크로드 관리 인터페이스
- 설정 및 정책 관리
- 인사이트 및 권고 사항 시각화
Wave Intelligence
머신러닝 모델 학습 및 예측
Technology: Gunicorn WSGI 서버를 사용하는 Python 애플리케이션
Key Responsibilities
- 과거 메트릭을 이용한 ML 모델 학습
- 워크로드 패턴 예측
- 최적화 권고
- Autopilot 의사 결정 지원
DaemonSet 구성 요소 (노드별)
Wave의 Agent DaemonSet은 모든 클러스터 노드에 컨테이너 2개를 배포합니다.
Wave Agent
노드 수준 및 pod 메트릭 수집
Key Responsibilities
- 노드 수준 리소스 모니터링
- Pod 메트릭 수집
- 호스트 시스템 통계 수집
- Core 서비스로 메트릭 전달
- Core API 연결
- 로컬 cAdvisor 조회
cAdvisor
컨테이너 및 시스템 메트릭을 Prometheus 형식으로 노출
Key Responsibilities
- 컨테이너 수준 메트릭 수집
- CPU, 메모리, 디스크 I/O, 네트워크 모니터링
- OOM 이벤트 추적
- 시스템 압력(pressure) 메트릭
배포 아키텍처
Wave는 표준 Kubernetes 리소스를 사용해 클러스터 안에 배포됩니다.
Kubernetes 리소스
- Namespace:
wave-autoscale(기본값, 변경 가능) - StatefulSet: 컨테이너 3개(Core, Web Console, Intelligence)를 담은 단일 레플리카 pod
- DaemonSet: 컨테이너 2개(Agent, cAdvisor)를 담은 노드별 pod
- Service: 포트 3024(Core API), 3025(Web Console), 3026(Intelligence), 3027(gRPC agent metrics)를 노출하는 ClusterIP 서비스
- ServiceAccounts: 서로 다른 RBAC 권한을 가진 두 개의 계정
- PersistentVolumeClaim: 40Gi 공유 스토리지 (기본값, 변경 가능)
- ClusterRoles & ClusterRoleBindings: 클러스터 전역 접근을 위한 커스텀 RBAC
- SecurityContextConstraints (OpenShift): 권한이 필요한 작업을 위한 우선순위 SCC
커스텀 리소스
Wave의 Helm chart는 기본적으로(crds.install: true) CustomResourceDefinition 14개(wavek8s.com/v1alpha1)를 설치합니다. 이를 어떻게 사용할지는 운영 모드에 따라 달라집니다.
- Console Mode (기본값): web console을 통해 Wave를 설정하고, Wave가 그 설정을 저장합니다. CRD는 설치되어 있지만 Custom Resource를 직접 작성하지는 않습니다.
- CRD Mode: 운영 설정을 Git에 Custom Resource로 선언하고
kubectl이나 ArgoCD로 적용합니다. 해당 설정에 대해 콘솔은 읽기 전용이 됩니다.
각 CRD는 helm.sh/resource-policy: keep을 갖고 있어서, helm uninstall을 실행해도 Custom Resource는 남아 있습니다. kind 전체 목록과 GitOps 워크플로우는 CRD Mode 문서를 참고하세요.
구성 요소 간 통신
내부 통신 흐름
- Agent는 같은 노드에 있는 cAdvisor의 메트릭 엔드포인트(localhost:8080)를 조회합니다
- cAdvisor는 Prometheus 형식의 컨테이너 메트릭을 노출합니다
- 이 통신은 DaemonSet pod 내부에서만 이루어집니다
- Agent는 수집한 메트릭을 gRPC(기본 전송 방식)로 포트 3027의 Core 서비스에 전달합니다
- Kubernetes 서비스 DNS를 사용합니다: wave-autoscale-svc.wave-autoscale.svc.cluster.local:3027
- 모든 노드의 Agent가 하나의 Core 인스턴스로 메트릭을 보냅니다
- 두 컨테이너는 같은 PersistentVolume을 공유합니다
- Intelligence는 /app/wave-intelligence/data에 ML 모델을 씁니다
- Core는 모델을 읽고 /app/autopilot/data에 학습 데이터를 저장합니다
- 네트워크 오버헤드 없이 긴밀하게 통합됩니다
- Web Console은 localhost로(같은 pod의 3024 포트) Core와 통신합니다
- Core API는 대시보드 시각화를 위한 데이터를 제공합니다
- 네트워크를 거치지 않는 효율적인 통신입니다
데이터 흐름
메트릭 수집
- cAdvisor가 로컬 노드에서 컨테이너 수준 메트릭을 수집합니다
- Agent가 cAdvisor를 조회하고 노드 메타데이터를 덧붙입니다
- Agent가 Core 서비스로 메트릭을 전달합니다
저장 및 분석
- Core가 모든 노드로부터 메트릭을 받습니다
- 과거 메트릭은 persistent volume에 저장됩니다
- Intelligence 구성 요소가 과거 데이터로 ML 모델을 학습시킵니다
의사 결정
- Core가 실시간 메트릭과 과거 메트릭을 분석합니다
- Intelligence가 ML 기반 예측과 권고를 제공합니다
- Core가 최적의 스케일링 및 사이징 액션을 결정합니다
실행
- Core가 Kubernetes API를 통해 변경 사항을 실행합니다
- HorizontalPodAutoscaler를 생성/업데이트합니다
- Pod 리소스(CPU/메모리 requests/limits)를 패치합니다
- PersistentVolume 확장을 관리합니다
피드백 루프
- 계속되는 메트릭 수집을 통해 액션의 결과를 모니터링합니다
- Intelligence 모델은 새 데이터로 계속 재학습합니다
- 시스템은 시간이 지날수록 최적화를 학습하고 개선합니다
스토리지 구성
Wave의 StatefulSet은 하나의 공유 PersistentVolumeClaim(기본 40Gi, ReadWriteOnce)을 사용합니다. 세 컨테이너 모두 이를 마운트합니다. Core는 /app/core/data, Intelligence는 /app/wave-intelligence/data, Autopilot은 /app/autopilot/data(모델과 저장소)에 마운트합니다. StatefulSet을 삭제하거나 스케일 다운해도 PVC는 유지됩니다.
플랫폼 호환성
conformant Kubernetes 1.26 이상이면 어디서든 실행됩니다. Amazon EKS, Google GKE, Microsoft AKS, Red Hat OpenShift 4.13+, 그리고 자체 관리형 클러스터를 포함합니다. 플랫폼별 설정은 설치 가이드를 참고하세요.
통합 지점
Wave는 기존 Kubernetes 생태계와 통합됩니다.
- 📊메트릭 Export: Core 서비스에서 제공하는 Prometheus 호환 메트릭
- 🔔알림: 웹훅 기반 알림 통보
- 🕸️서비스 메시: 전용 admin 역할을 갖춘 선택적 Istio 연동
- 🔌API 접근: 외부 자동화를 위한 포트 3024의 RESTful API
- 🔐인증: Kubernetes RBAC 기반 접근 제어
Resource Requirements
Wave의 resource requests는 고정된 값이 아닙니다. 클러스터 규모, 즉 노드 수, Wave가 관리하는 pod 및 워크로드 수, 그리고 보관하는 메트릭 히스토리 양에 따라 달라집니다. 클러스터가 크면 StatefulSet 크기를 키우고, 작으면 줄이세요. 노드별 DaemonSet 사용량은 노드 수에 비례해 늘어납니다.
- StatefulSet (Core, Intelligence, Web Console): 주로 워크로드 수와 Wave가 분석하는 메트릭 양에 따라 달라집니다. Core와 Intelligence가 대부분의 부하를 차지합니다.
- DaemonSet (Agent, cAdvisor): 노드당 사용량은 작고 거의 일정하며, 노드 수에 비례해 선형적으로 늘어납니다.
- 스토리지: 공유 PVC는 메트릭 보관 기간과 클러스터 규모에 따라 커집니다.
클러스터 규모별 구체적인 시작점(예: 300 vCPU 대 2000 vCPU)은 Helm Values 문서의 resource sizing guidelines를 참고하세요. 각 구성 요소의 requests와 limits는 spec.<component>.resources Helm value로 설정합니다.
고가용성 고려 사항
- StatefulSet은 설계상 단일 레플리카로 동작합니다. Core, Web Console, Intelligence가 하나의 Pod와 하나의 PVC를 공유합니다.
- DaemonSet은 모든 노드에서의 스케줄링을 보장하기 위해
system-node-critical우선순위를 사용합니다. - PVC는 삭제 시에도 유지됩니다. 재해 복구를 위해 표준 Kubernetes 도구로 백업하세요.