Part of #202.
Context
The headline operator view. A fleet-wide table showing every GPU-bound pod across every cluster Periscope manages, with the topology hierarchy (Cluster → Node → PhysicalGPU → MIGSlice or TimeSlice → BoundPod). Click a row → live util sparkline + neighbor pods on the same device + K8s events + logs link.
Acceptance
Files this likely touches
- New:
web/src/pages/GPUMapPage.tsx
- New:
web/src/components/gpu/GPUMapTable.tsx, GPUDetailPane.tsx
- New:
web/src/hooks/useGPUMap.ts
- New backend handler:
/api/clusters/<c>/gpu/map
Dependencies
Blocks on:
Notes for contributors
- Mirror the existing Karpenter dashboard pattern — same auto-detect-by-CRD-or-label, same resizable detail pane
- Sparkline component already exists in the SPA for the Karpenter cost view; reuse
- Time-slicing case: N pods share one device → render as a single row with all bound pods listed + per-pod util when
DCGM_FI_PROF_GR_ENGINE_ACTIVE is available; otherwise "shared, util N% across M pods" honestly
- MIG case: render each slice as a sub-row of the physical GPU
Part of #202.
Context
The headline operator view. A fleet-wide table showing every GPU-bound pod across every cluster Periscope manages, with the topology hierarchy (Cluster → Node → PhysicalGPU → MIGSlice or TimeSlice → BoundPod). Click a row → live util sparkline + neighbor pods on the same device + K8s events + logs link.
Acceptance
/clusters/<c>/gpuand a top-level/gpufor the fleet-wide viewnvidia.com/gpu.productlabelsFiles this likely touches
web/src/pages/GPUMapPage.tsxweb/src/components/gpu/GPUMapTable.tsx,GPUDetailPane.tsxweb/src/hooks/useGPUMap.ts/api/clusters/<c>/gpu/mapDependencies
Blocks on:
gpu — backend: per-node DaemonSet(Epic: GPU + AI workload visibility — Pod↔GPU map, Idle GPU finder, DCGM reconciler (v1.2) #202 sub-task above) — needs allocation snapshotsgpu — backend: DCGM scraper(Epic: GPU + AI workload visibility — Pod↔GPU map, Idle GPU finder, DCGM reconciler (v1.2) #202 sub-task above) — needs util / FB / power metricsNotes for contributors
DCGM_FI_PROF_GR_ENGINE_ACTIVEis available; otherwise "shared, util N% across M pods" honestly