가상 Kubernetes 환경(IDC / Cloud / Hybrid)을 설계하고, GPU VRAM까지 인지하는 스케줄 시뮬레이션 · 의존성 그래프 · 정적 병목 분석 · K8s YAML / Helm / Capacity 리포트 산출을 한 페이지에서 수행하는 브라우저 단독 도구.
- 백엔드 없음 · 모든 상태는
localStorage. 의도적 Export 외에 외부 통신 0. - 즉시 검증 · 매 편집 후 300ms 디바운스로 validator 재실행.
- 하나의 데이터 · 일곱 개의 렌즈 · Topology / Architecture / Capacity / Dependency / Namespace / Bottleneck / Export 모두 같은 JSON을 다른 관점으로 본다.
라이브 데모: https://aiotool.net/vk8s/ (또는 로컬에서 index.html을 더블클릭).
- Quick Start
- 4계층 데이터 모델
- 상단 / 좌측 트리 / 우측 인스펙터
- 뷰 1 — Topology
- 뷰 2 — Architecture
- 뷰 3 — Capacity (스케줄 시뮬레이션)
- 뷰 4 — Dependency Graph
- 뷰 5 — Namespace & NetworkPolicy
- 뷰 6 — Bottleneck (정적 병목 분석)
- 뷰 7 — Export (K8s YAML / Helm / Capacity)
- Workload Inspector — 5탭
- GPU 모델링 — chassis · 실장착 · VRAM 소비
- Quick Deploy 템플릿 & Project 시드
- Validator — 검증 룰 카탈로그
- 카탈로그 데이터 (GPU · Runtime · Node 스펙)
- 스키마 & 버전
- 영속성 · Import / Export
- 키보드 단축키
- 디렉터리 구조
- 라이선스
# 1) 그냥 index.html을 더블클릭하거나
open vk8s/index.html
# 2) 정적 호스팅 (예: aiotool.net) 하위 경로로 배포
# 백엔드/빌드 단계 없음.처음 진입하면 Splash에서 On-Prem / Cloud / Hybrid 중 하나를 고르고 프로젝트명을 입력하거나,
Import existing JSON으로 기존 프로젝트를 복원한다. Project Dashboard에 들어가면
바로 Sites · Nodes · Clusters · Workloads를 자유롭게 편집할 수 있다.
Project ──┬── Sites ── Storage / L4 LB / NetworkDevice / ExternalService
├── Nodes (spec: form_factor, vcpu, memory_gb, disks, gpu, gpu_chassis, power)
├── Clusters ── Namespaces / NetworkPolicies / Workloads / Addons
└── (catalog) ── 사전정의된 node-spec, gpu-model, runtime-profile
- Site — 물리 IDC 또는 클라우드 리전. onprem이면
capacity.rack_units / power_kw / cooling_kw를 갖는다. - Node — 단일 서버.
cluster_roles에control-plane/worker부여. site에 속하고 cluster에 멤버로 들어감. - Cluster — k8s 클러스터.
node_ids로 노드 멤버 관리. CNI / CSI / GPU Operator / Local PV / Ingress 등 addon, HA 옵션, 네임스페이스, 네트워크 정책, 워크로드 보유. - Workload — Deployment / StatefulSet / DaemonSet / Job / CronJob 단위. replicas, requests/limits, GPU 요청, PVC, runtime(언어·프레임워크·동시성 모델), 네트워크(Service · Ingress),
depends_on.
스키마 정의: schema/ · 자세한 설명: schema/README.md.
┌──────────────────────────────────────────────────────────────────┐
│ 🧵 vk8s project-name [hybrid] [💾] [⤓] [⤒] │ ← Top bar
├────────┬──────────────────────────────────────────┬──────────────┤
│ Tree │ Canvas (7개 뷰 중 하나) │ Inspector │
│ Sites │ [Topology][Architecture][Capacity][Dep] │ 선택된 │
│ Nodes │ [Namespace][Bottleneck][Export] │ 엔티티 폼 │
│ Cluster│ │ │
│ Workld │ │ │
├────────┴──────────────────────────────────────────┴──────────────┤
│ ⚠ N errors ▲ M warnings ℹ K info [Findings ▾] │ ← Findings strip
└──────────────────────────────────────────────────────────────────┘
- Top bar — 프로젝트명 · 모드 뱃지(
onprem/cloud/hybrid) · 저장/Import/Export. - 좌측 트리 — Sites · Nodes · Clusters · Workloads (열고 닫기 가능). 클릭하면 인스펙터에 폼이 뜸.
- 인스펙터 — 선택된 엔티티의 모든 필드를 폼으로 노출.
🔒토글로 우발 편집/삭제 보호 가능. - Findings strip — error/warn/info 건수를 항상 표시. 펼치면 상세 + 클릭 시 해당 엔티티로 점프.
UI 명세 원문: docs/ui-spec.md.
물리/논리 토폴로지를 site → node → cluster → workload 순으로 그래프로 본다.
- 3개 레이아웃:
grid(자동),free(자유 배치 — 드래그로 이동),diagram(SVG 다이어그램). - 레이어 토글: Compute · Network · Services · Ingress · Sites 각각 켜고 끄기.
- 다이어그램 모드 export: 현재 뷰를 SVG / PNG로 저장 (
Bottleneck rule transparency커밋 이후). - 같은 cluster의 node-cluster 연결선, l4_balancer → cluster 라인, storage → workload PVC 라인 등 자동 라우팅.
워크로드를 카테고리(Frontend/API/WAS/DB/Cache/Queue/ML-Inference/...) 또는 zone(라벨 기준)으로 묶어 보는 논리 아키텍처.
archGroupByZone토글 — 라벨 기반 그룹 ↔ 카테고리 그룹.- ingress → frontend → API → DB 흐름이 한눈에 들어오게 화살표 라우팅.
워크로드 replica 단위로 first-fit 스케줄 시뮬레이션을 돌려 어디에 어떻게 배치되는지 보여준다.
- 워커 노드 카드마다 막대 5종: CPU / Memory / GPU / VRAM / PSU(onprem만).
- 배치 성공한 pod 목록과 노드별 자원 차감 결과 표시.
- 상단 요약:
N/M pods placed,✓ all placed또는⊗ K unschedulable.
배치 실패한 pod 카드에 다음을 노출:
- 요청 라인 —
cpu · mem · GPU(count or VRAM). - 사유 요약 — 어떤 차원이 몇 개 워커를 막았는지:
gpu 3/3 · H200-SXM 3/3식. - 노드별 상세 —
▣ node-name cpu 16/32 · H200-SXM 1/2— 클릭 시 노드 디테일로 점프. - worker 0대인 경우 —
cluster_roles에 'worker' 추가 필요힌트.
simulateScheduling() (in index.html) → renderUnscheduled().
워크로드의 GPU 요청을 카드 개수가 아닌 VRAM(GB) 소비량으로 모델링한다. vLLM 같은 추론 워크로드는 노드의 H100/H200 VRAM 풀에서 GB 단위로 잘라 쓰는 주체이지, 카드를 장착하는 주체가 아니라는 사실을 반영.
- 워크로드 Resources 탭의 GPU 입력 =
GPU VRAM (GB / pod). - model 드롭다운은 해당 cluster의 worker가 실제 장착한 모델로만 좁힘 — 미스매치 자체를 차단.
(any)옵션은 노드의 모든 모델 VRAM 합산 풀에서 소비.- legacy
gpu.count기반 워크로드는 그대로 동작 (자동 fallback). - 자세한 분기 로직은 §12 참조.
workload.depends_on을 좌→우 layered DAG로 시각화. 진입점(아무도 호출 안 하는 노드)이 가장 왼쪽,
싱크(leaf)가 오른쪽. 점선·주황은 cycle (back edge).
2-layer 이상 건너뛰는 edge는 중간 layer의 노드 row를 회피하는 gutter lane으로 우회. 사전 패스로 intervening 노드들의 y 중심을 모은 뒤 위/아래/사이 gap 중 (y1+y2)/2에 가장 가까운 lane을 선택, cubic bezier control point를 overshoot시켜 곡선 중점이 lane에 정확히 닿게 한다. overshoot가 viewBox를 벗어나지 않게 SVG 영역도 함께 확장.
상단에 cluster 탭 (All (N) / cluster-A (n1) / cluster-B (n2) ...).
선택 시 해당 cluster의 워크로드만 노출. cross-cluster 의존이 숨겨졌으면
▲ cross-cluster 의존 N개가 숨겨져 있습니다 — 'All' 탭에서 확인하세요 배너로 명시.
workload.hide_from_dep_graph: true면 해당 워크로드 노드와 연결된 edge가 그래프에서 제외.
검증·export·다른 뷰에는 전혀 영향 없음 — 순수 시각화 옵션. workload Inspector → Basic 탭에서 토글.
View-local 옵션 (프로젝트 데이터에는 저장 안 됨). 우측 상단 체크박스
edge label (protocol·latency)로 라벨(HTTP / 15ms 등)을 한 번에 끄고 켤 수 있다.
namespace 별 워크로드 분포, ResourceQuota, NetworkPolicy(ingress/egress) 시각화.
- namespace에
default_deny: true면 모든 egress/ingress가 명시적 allow 필요. prod로 시작하는 namespace에 default_deny가 없으면 경고.- workload의
depends_on호출이 NetworkPolicy로 차단되면 block 룰 발동 (WORKLOAD_DEPS_BLOCKED_BY_NETPOL등 — §14 참조).
runtime.concurrency (thread-pool / async-await / event-loop / worker-pool / process) +
traffic_profile (RPS, avg_ms, peak_factor) + depends_on (call_ms, fanout_pct, calls_per_request)을 입력 삼아
Little's Law 기반으로 워크로드별 병목 카드를 그린다.
- Compute capacity (Little's Law) —
in_flight = RPS × avg_ms / 1000,per_replicacapacity vs 요구치. - Caller pool → target — 호출자 connection pool 고갈 여부.
- Downstream RPS → target — target의 RPS budget 초과.
- Inbound conn budget (as DB target) — DB max_connections 대비 caller 합계.
- Latency budget — 워크로드 자체
avg_ms+ Σ(downstream call_ms × calls_per_request) > p99 budget.
각 카드는 transparency block으로 입력 변수 + 산식 + 도출된 값 + 권장 액션을 모두 노출 (rule transparency 커밋). validator 룰 카탈로그(§14)와 1:1 대응.
3개 탭 + 마스터 다운로드 버튼.
kubectl apply -f 가능한 multi-doc YAML. 포함 리소스:
- Namespace · ResourceQuota · NetworkPolicy
- Deployment · StatefulSet (PVC 마운트 포함)
- Service (ClusterIP / NodePort / LoadBalancer)
- Ingress
- PersistentVolumeClaim
nvidia.com/gpuresource limit (count 기반 — §12의 caveat 참조)
워크로드별 umbrella chart 패턴.
Chart.yaml·values.yaml·templates/·_helpers.tpl- 워크로드별 values 분리. CLI에서
helm install -f values.yaml. - ZIP은 store-only(deflate 미사용) → 브라우저만으로 zip 생성 가능.
HELM_DUPLICATE_CHART_NAME/HELM_INGRESS_NO_HOST/HELM_NO_IMAGE_REPO검증 동시 동작.
발주서/제안서에 그대로 첨부할 수 있는 마크다운.
- 사이트별 U·kW 산정과 잔여 헤드룸
- GPU 플랜 (모델별 카드/VRAM)
- 네트워크 플랜 (L4 LB · CIDR · CNI)
- 검증 요약 (error/warn 건수와 코드)
위 3개를 한 ZIP에 묶어 다운로드. 파일명에 날짜 stamp.
| 탭 | 내용 |
|---|---|
| Basic | name, category, kind, replicas, namespace, cluster (read-only), 🔒 lock, Dependency 그래프에서 숨기기 |
| Resources | requests/limits (CPU·Memory), GPU VRAM(GB) + model 드롭다운(cluster 장착 모델만), PVC (size_gb · access_mode · storage_class · target_storage), Cluster total 합산 |
| Runtime | 언어/프레임워크/버전, concurrency 모델(thread-pool / async-await / event-loop / worker-pool / process), thread/connection pool 사이즈, traffic profile (RPS · avg_ms · peak_factor) |
| Network | Service (type · ports), Ingress (host · path · TLS), HPA(min/max · cpu_target_pct) |
| Deps | depends_on[] 편집 — target_workload_id · protocol · port · avg_call_ms · fanout_pct · calls_per_request |
세 계층으로 나뉘어 검증된다.
- chassis (
node.spec.gpu_chassis): 노드가 허용하는 GPU.max_count,supported_form_factors,supported_models,nvlink_topology(none/bridge/nvswitch-mesh). 발주 가능한 슬롯 정의. - 실장착 (
node.spec.gpu[]): 실제 꽂혀 있는 카드.{ model, count }[].- chassis 룰로 검증 (
GPU_CHASSIS_NOT_SUPPORTED·GPU_COUNT_EXCEEDS_CHASSIS·GPU_FORM_FACTOR_MISMATCH·GPU_MODEL_NOT_IN_CHASSIS_LIST). - NVLink 토폴로지가
none인데 카드가 NVLink-capable인 경우NVLINK_ON_NONE_TOPOLOGY등 추가 검증.
- chassis 룰로 검증 (
- 워크로드 소비 (
workload.resources.requests.gpu):- VRAM 모드 (권장) —
{ vram_gb, model? }(count는 schema 호환 위해 1로 자동). 시뮬레이터는 노드의 모델별 VRAM 풀에서 GB로 차감. - count 모드 (legacy) —
{ count, model? }. 카드 단위 매칭. - 모드 분기:
vram_gb > 0이면 VRAM 모드.
- VRAM 모드 (권장) —
Caveat — K8s YAML/Helm export는 여전히 nvidia.com/gpu: count 정수만 emit (실 K8s API의 한계).
VRAM 모드 워크로드는 export 시 nvidia.com/gpu: 1이 됨. 시뮬레이션과 시각화는 VRAM 기반으로 정확.
- DB: Postgres / MySQL / MongoDB
- Cache: Redis
- Queue: Kafka / RabbitMQ
- Search: Elasticsearch
- ML: vLLM
- 각 템플릿에 PVC 시드, Service port, replicas, HA 기본값 포함.
처음 만들 때 셋 중 선택:
- On-Prem — Dell XE9680 + R660 기반의 GPU/CP 노드 구성 예시.
- Cloud — AWS m6i / g5 등 EC2 인스턴스 시드.
- Hybrid — 둘 다.
또는 ML 추론 플랫폼 1-click: LLM Inference (HA) — 3× R660 cp + 1× XE9680(H200×8) + vLLM + Embedding + Qdrant + Redis + API gateway.
300ms 디바운스로 매 편집 후 재실행. 결과는 Findings strip → 상세 패널.
모든 룰 정의: schema/validator-rules.md.
| 카테고리 | 대표 룰 (일부) |
|---|---|
| GPU 호환성 | GPU_CHASSIS_NOT_SUPPORTED · GPU_COUNT_EXCEEDS_CHASSIS · GPU_FORM_FACTOR_MISMATCH · GPU_MODEL_NOT_IN_CHASSIS_LIST · GPU_MODEL_UNKNOWN |
| NVLink | NVLINK_ON_NONE_TOPOLOGY · NVLINK_BRIDGE_PAIR_LIMIT · NVLINK_SXM_NOT_FULLY_POPULATED |
| Site Capacity | SITE_RACK_UNITS_EXCEEDED · SITE_POWER_EXCEEDED · SITE_POWER_HIGH_UTILIZATION · SINGLE_NODE_EXCEEDS_TYPICAL_PDU · GPU_NODE_NO_COOLING_INFO |
| Cluster 토폴로지 | CLUSTER_NO_CONTROL_PLANE · HA_CONTROL_PLANE_NOT_ENOUGH · HA_CONTROL_PLANE_EVEN_NUMBER · NODE_IN_MULTIPLE_CLUSTERS · CLUSTER_SPANS_ENVIRONMENTS |
| 워크로드 스케줄링 | WORKLOAD_CPU_NOT_SCHEDULABLE · WORKLOAD_MEM_NOT_SCHEDULABLE · WORKLOAD_GPU_NO_NODE · WORKLOAD_GPU_INSUFFICIENT · WORKLOAD_GPU_MODEL_NOT_AVAILABLE · WORKLOAD_GPU_VRAM_INSUFFICIENT · WORKLOAD_GPU_MODEL_VRAM_INSUFFICIENT |
| Addon 권장 | GPU_NODE_NO_GPU_OPERATOR · NO_CNI_SELECTED · NO_CSI_SELECTED_BUT_PVC_USED |
| 무결성 | SITE_NODE_BACKREF_MISMATCH · MODE_SITE_KIND_CONFLICT |
| Namespace / NetPol | WORKLOAD_NAMESPACE_NOT_DECLARED · WORKLOAD_DEPS_BLOCKED_BY_NETPOL · WORKLOAD_EGRESS_BLOCKED_BY_NETPOL · NS_DEFAULT_DENY_NO_ALLOW_RULES · NS_RESOURCE_QUOTA_EXCEEDED_BY_WORKLOADS · PROD_NS_NO_DEFAULT_DENY · NETPOL_TARGETS_NONEXISTENT_POD · NETPOL_FROM_NS_NONEXISTENT |
| Dependency | DEPENDS_ON_TARGET_NOT_FOUND · DEPENDS_ON_CYCLE · DEPENDS_ON_CROSS_CLUSTER |
| 정적 병목 | THREAD_POOL_SATURATION · EVENT_LOOP_CPU_BOUND · WORKER_POOL_SATURATION · DB_CONNECTION_POOL_EXHAUSTED · DB_MAX_CONNECTIONS_EXCEEDED · TIMEOUT_CASCADE_RISK · JVM_HEAP_TOO_SMALL · JVM_HEAP_GT_REQUEST · SPOF_RISK · STATEFUL_NO_PVC · RPS_NEVER_REACHED_BY_DEPS · KEEPALIVE_HIGH_RPS_DISABLED |
| Helm Export | HELM_DUPLICATE_CHART_NAME · HELM_INGRESS_NO_HOST · HELM_NO_IMAGE_REPO |
각 룰은 error(block) / warn / info 중 하나의 severity를 갖는다.
NVIDIA Hopper / Ampere / Ada 라인업 + 일부 AMD MI. 각 항목:
"H200-SXM": {
"vendor": "NVIDIA", "family": "Hopper", "form_factor": "SXM",
"vram_gb": 141, "tdp_w": 700, "fp16_tflops": 1979,
"released": 2024, "nvlink_capable": true
}언어/프레임워크별 동시성 모델 디폴트 (thread-pool 크기, async-await 효율, GIL, JVM heap 비율 등). 워크로드 Runtime 탭에서 자동 시드되어 Bottleneck 룰의 입력으로 쓰임.
Dell PowerEdge, AWS EC2, NCP, Azure VM 등 사전 정의된 노드 스펙.
chassis, form_factor, vcpu, memory_gb, disks, gpu_chassis, power.psu_max_w까지 채워져 있어
"Add Node" 마법사에서 한 번에 시드 가능.
스키마 정의: schema/catalog-entry.schema.json.
JSON Schema (Draft 2020-12) 7개:
| 파일 | 정의 |
|---|---|
project.schema.json |
최상위 — name, mode, sites, nodes, clusters |
site.schema.json |
site + capacity + storages + l4_balancers + network_devices + external_services |
node.schema.json |
단일 서버 — site_id, cluster_roles, spec(↓) |
node-spec.schema.json |
spec 본체 — vcpu, memory, disks, gpu(_chassis), power, form_factor |
cluster.schema.json |
k8s cluster — node_ids, addons, namespaces, network_policies, workloads, ha |
workload.schema.json |
workload + resources + runtime + network + depends_on + persistent_volumes + hide_from_dep_graph |
catalog-entry.schema.json |
사전 정의된 노드 스펙 항목 |
버전: v0.6 (SCHEMA_VERSION 상수). 자세한 변경 이력은 schema/README.md.
- 저장: 모든 편집은 자동으로
localStorage['vk8s.project.current']에 직렬화 (saveSoon()디바운스). - Import: 상단 ⤓ 버튼 — JSON 파일을 로드해 현재 프로젝트 교체.
- Export (project): 상단 ⤒ 버튼 — 현재 프로젝트를 단일 JSON으로 다운로드.
- Export (산출물): §10 참조.
- 공장 초기화: Splash에서
Reset(모든 localStorage 삭제).
외부로 나가는 통신은 export 다운로드 외에 없음 (보안망/에어갭 환경 친화).
| 키 | 동작 |
|---|---|
[ |
좌측 트리 토글 |
] |
우측 인스펙터 토글 |
Ctrl/Cmd + B |
Findings 패널 펼치기/접기 |
Esc |
선택 해제 |
자세히는 docs/ui-spec.md §10.
vk8s/
├── index.html # 단일 SPA — 모든 뷰/로직/스타일 포함
├── README.md # (이 문서)
├── data/
│ ├── gpu-models.json # GPU 카탈로그
│ ├── runtime-profiles.json # 언어·프레임워크 디폴트
│ └── catalog/*.json # 노드 스펙 카탈로그
├── docs/
│ └── ui-spec.md # UI 설계 명세 (519 lines)
└── schema/
├── README.md # 스키마 개요 + 변경 이력
├── validator-rules.md # 모든 검증 룰 (337 lines)
├── project.schema.json
├── site.schema.json
├── node.schema.json
├── node-spec.schema.json
├── cluster.schema.json
├── workload.schema.json
└── catalog-entry.schema.json
LICENSE 참조.
FCStudio · https://github.com/flyingcatstudio/vk8s