Across the industry, GPU cluster utilization at enterprises sits at roughly 35-40%. Engineering teams have invested heavily in AI infrastructure—expensive NVIDIA H100 and H200 nodes—but the Kubernetes layer that orchestrates these workloads remains riddled with gaps: poor scheduling decisions, cold-start latency on inference APIs, ungraceful pod preemption during training runs, and no event-driven scaling for GPU-backed services.
The fix is not more GPUs. It is better integration between Kubernetes and the AI-native tooling that has matured significantly in the past 18 months. Five components form the backbone of a production-ready GPU acceleration stack: NVIDIA GPU Operator, KServe, KEDA, Volcano, and the new Dynamic Resource Allocation (DRA) driver.
This guide covers each tool—what it solves, how to deploy it, and what the 2026 best practices look like for enterprise teams.
Key Takeaways
- GPU Operator is the foundation—deploy it before any other AI component
- KServe replaces raw Kubernetes InferenceService for production LLM serving with 4x throughput gains
- KEDA with DCGM Exporter enables GPU-aware autoscaling that HPA cannot provide
- Volcano delivers gang scheduling and vGPU support that the default scheduler simply cannot
- NVIDIA's DRA driver to CNCF is the biggest infrastructure shift in 2026—plan migration now
Why Standard Kubernetes Falls Short for GPU AI Workloads
Out of the box, Kubernetes was not designed for GPU-accelerated AI workloads. The default scheduler treats GPUs as opaque resources—binary allocatable units with no visibility into memory capacity, topology (NVLink vs PCIe), or MIG partitioning. This leads to three common failure modes in enterprise environments.
Fragmentation. When the scheduler places pods without understanding GPU topology, cross-node NVLink traffic becomes PCIe-bound, degrading throughput by 30-50% for multi-GPU training jobs. Training jobs that require 8 GPUs across two nodes will fail or run at degraded speed because the scheduler cannot enforce gang scheduling—all pods must start simultaneously, or none should start.
Autoscaling blindness. Traditional HPA scales on CPU and memory metrics. For LLM inference APIs, GPU utilization follows request patterns that have nothing to do with memory pressure. A pod can be GPU-saturated at 95% with only 2GB of RAM consumed. Without GPU-aware metrics, HPA either over-scales (wasting thousands of dollars per day in idle compute) or under-scales (causing request queuing and latency spikes during traffic bursts).
Training job preemption. When a high-priority job arrives, Kubernetes preempts running training pods without coordination. A Ray Distributed training job running 3 of 8 scheduled workers loses the entire job—partial gang scheduling destroys weeks of compute. Volcano solves this with its gang-scheduling primitives.
The five tools covered in this guide address each of these failure modes directly.
1. NVIDIA GPU Operator: The Foundation Layer
Everything starts with the GPU Operator. Without it, Kubernetes has no mechanism to discover GPU nodes, expose GPU metrics, or manage the lifecycle of NVIDIA software components (drivers, device plugins, DCGM exporter, Node Feature Discovery).
What the GPU Operator Manages
The GPU Operator is deployed via Operator Lifecycle Manager (OLM) and automates installation of:
- NVIDIA driver container (replacing manual driver installation on each node)
- Kubernetes device plugin that advertises GPU resources to the scheduler
- NVIDIA Container Toolkit for CUDA container runtime injection
- DCGM Exporter for GPU metrics (power, temperature, utilization, memory)
- Node Feature Discovery (NFD) for GPU node labeling
# Add NVIDIA Helm repository helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update # Install GPU Operator in nvidia-gpu-operator namespace helm install gpu-operator nvidia/gpu-operator \ --namespace nvidia-gpu-operator \ --create-namespace \ --set operator.defaultRuntime=nvidia \ --set driver.version=535.154.05 \ --set driver.rdmaEnabled=true \ --set toolkit.enabled=true \ --set dcgmExporter.enabled=true \ --set dcgmExporter.serviceMonitor.enabled=true
kubectl get pods -n nvidia-gpu-operator # Expected: operator, driver pod, device plugin, DCGM exporter all Running # Check GPU node labels kubectl describe node <gpu-node> | grep nvidia.com # Expected labels: # nvidia.com/gpu.product=NVIDIA-H100-80GB-HBM3 # nvidia.com/gpu.memory=81920Mi # nvidia.com/gpu.multiprocessors=144 # nvidia.com/gpu.topology.rapl=true
2026 Best Practice: Use Driver Container, Not Node-Level Drivers
Production teams at financial institutions have standardized on the driver container approach rather than node-level drivers because it allows driver upgrades without node cordoning. The GPU Operator's driver container runs as a DaemonSet and upgrades drivers as a pod restart—no node reboots required. This is critical for 24/7 trading systems where infrastructure teams cannot afford maintenance windows.
2. KServe: Production-Ready AI Model Serving
KServe is the CNCF incubating project that provides a standardized inference server on Kubernetes. It evolved from KFServing and is the serving layer of choice for teams running large language models and transformer-based models at scale.
Why Not Plain InferenceService?
KServe builds on the raw Kubernetes InferenceService (from Kubeflow) with critical production features: automatic model loading from object storage (S3, GCS, Azure Blob), rolling updates with traffic shadowing, native support for vLLM and Hugging Face TGI runtimes, scale-to-zero for idle models, and multi-model serving from a single endpoint.
In Rajesh Gheware's 25 years building enterprise systems for financial institutions, the pattern that emerges is that teams who deploy raw InferenceService spend 40% of their time on custom batching logic, connection pooling, and error retry handling—all problems KServe solves out of the box.
Deploying an LLM Inference Service with KServe
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
name: llama3-8b-inference
namespace: ml
annotations:
serving.kserve.io/autoscaler: keda
# Enable scale-to-zero after 5 minutes of no traffic
# KServe + KEDA integration for GPU-aware autoscaling
spec:
predictor:
minReplicas: 0
maxReplicas: 10
scaleTarget: 50 # 50 requests/sec triggers scale-up
model:
modelFormat:
name: vllm
storageUri: gs://my-models-bucket/llama3-8b-hf
runtime: kserve-vllm
resources:
limits:
nvidia.com/gpu: "2"
memory: "32Gi"
requests:
nvidia.com/gpu: "2"
memory: "16Gi"
env:
- name: VLLM_WORKER_MULTIPROC_METHOD
value: "spawn"
- name: VLLM_MAX_MODEL_LEN
value: "8192"
- name: VLLM_TENSORIZER_URI
value: "s3://my-bucket/llama3-tensorizer"
KServe Multi-GPU Inference
For models that require more than one GPU, KServe supports tensor parallelism through its InferenceService spec. A 70B parameter model split across 4 H100 GPUs delivers approximately 3.2x the throughput of a single GPU with near-linear scaling when NVLink topology is respected.
spec:
predictor:
model:
modelFormat:
name: vllm
storageUri: gs://models/llama3-70b-hf
runtime: kserve-vllm
resources:
limits:
nvidia.com/gpu: "4"
env:
- name: VLLM_TENSOR_parallel_SIZE
value: "4"
- name: VLLM_NVIDIA_VISIBLE_DEVICES
value: "0,1,2,3"
| Feature | KServe vLLM | Raw InferenceService |
|---|---|---|
| Continuous batching | Native | Custom implementation |
| Paged attention (vLLM) | Built-in via vLLM runtime | Requires manual vLLM sidecar |
| Scale-to-zero | Supported with KEDA | Not supported |
| Multi-model per endpoint | ModelRegistry + ensembles | Not supported |
| Tensor parallelism | CRD-driven, declarative | Helm values hacking |
| OpenAI-compatible API | Native /v1/chat/completions | Requires custom proxy |
3. KEDA: GPU-Aware Event-Driven Autoscaling
Kubernetes Event-Driven Autoscaling (KEDA) extends the Horizontal Pod Autoscaler with support for external metrics—including GPU utilization from DCGM Exporter. For AI inference workloads, this is the difference between paying for idle GPU capacity and matching demand precisely.
The Problem with HPA for LLM Inference
Standard HPA scales based on CPU and memory—metrics that poorly correlate with LLM inference load. During a request burst, GPU SM utilization spikes to 95% while CPU stays at 30% and memory at 40%. HPA sees nothing alarming and does not scale. Request latency climbs. The fix is KEDA, which can trigger scale operations from custom metrics like:
- DCGM GPU utilization (GPU compute pressure)
- PromQL query results from the DCGM Exporter
- Apache Kafka consumer lag for streaming inference jobs
- Azure Queue depth, AWS SQS messages, or GCP Pub/Sub backlog
- Custom application metrics exposed via Prometheus
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: keda-trigger-auth
namespace: ml
spec:
prometheus:
metadata:
serverAddress: http://prometheus.monitoring:9090
metricName: dcgm_gpu_utilization
threshold: "75" # Scale up when GPU util exceeds 75%
query: avg(dcgm_gpu_utilization{pod!=""})
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: llm-inference-scaler
namespace: ml
spec:
scaleTargetRef:
name: llama3-8b-inference-predictor
minReplicaCount: 0
maxReplicaCount: 20
cooldownPeriod: 120
advanced:
restoreToOriginalReplicaCount: false
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus.monitoring:9090
metricName: dcgm_gpu_utilization
threshold: "75"
query: avg(dcgm_gpu_utilization{pod!=""})
- type: prometheus
metadata:
serverAddress: http://prometheus.monitoring:9090
metricName: request_queue_depth
threshold: "50"
query: sum(kserve_request_queue_depth{service="llama3"})
Cost Impact: Scale-to-Zero for Staging and Development
For non-production environments—staging, QA, developer notebooks—a single A100 node running 24/7 costs approximately $1,200/month. With KEDA scale-to-zero, a cluster serving intermittent test traffic might consume zero GPU hours on weekends and off-peak nights. An enterprise with 10 non-production environments each running one A100 at 30% average utilization saves roughly $18,000/month by scaling to zero during off-hours and matching demand precisely during test runs.
4. Volcano: Gang Scheduling and vGPU Management
Volcano is a CNCF incubating batch scheduling system purpose-built for ML training, HPC, and distributed compute workloads. For enterprises running distributed training jobs—PyTorch DDP, DeepSpeed, Megatron-LM, Ray, Spark—Volcano's gang scheduling and vGPU support are non-negotiable for resource efficiency.
Gang Scheduling: Why It Matters for Distributed Training
In distributed training, workers must start together. If a training job requires 8 GPUs across 2 nodes and only 5 are available, the Kubernetes default scheduler will start 5 pods immediately. Those 5 pods wait indefinitely for the remaining 3—the job cannot begin, and resources are wasted on waiting pods. Volcano's gang scheduling ensures all 8 pods start simultaneously or none start.
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: pytorch-distributed-training
namespace: ml
spec:
minAvailable: 8 # Gang scheduling: all 8 pods or none
schedulerName: volcano
tasks:
- name: trainer
replicas: 8
template:
spec:
containers:
- name: pytorch
image: pytorch/pytorch:2.4.0-cuda12.1
command:
- torchrun
- --nnodes=1
- --nproc_per_node=8
- /workspace/train.py
resources:
limits:
nvidia.com/gpu: "1"
memory: "32Gi"
requests:
nvidia.com/gpu: "1"
memory: "16Gi"
nodeSelector:
nvidia.com/gpu.product: NVIDIA-H100-80GB-HBM3
vGPU Scheduling for Multi-Tenant GPU Sharing
Volcano supports virtual GPU (vGPU) scheduling through NVIDIA MIG partitioning and vCUDA virtualization. In multi-tenant environments where multiple teams share GPU nodes, this enables fine-grained GPU allocation—分配 1/7th of an H100 to a small inference job without dedicated hardware.
resources:
limits:
nvidia.com/gpu.mem: "16384" # 16GB vGPU from MIG slice
nvidia.com/gpu.compute: "14" # 14 SMs from MIG slice
requests:
nvidia.com/gpu.mem: "16384"
nvidia.com/gpu.compute: "14"
Volcano Bin-Packing: NVIDIA's 2026 Optimization
In 2026, NVIDIA contributed an enhanced bin-packing algorithm to the Volcano scheduler that intelligently places workloads to maximize GPU occupancy and reduce fragmentation. In benchmarks shared at KubeCon EU 2026, the algorithm reduced GPU node fragmentation by 34% compared to the default scheduler—directly translating to cost savings on reserved instance fleets.
5. NVIDIA DRA Driver: The Biggest Infrastructure Shift in 2026
NVIDIA donated its Dynamic Resource Allocation (DRA) driver to the CNCF in Q1 2026. This is the most significant change to GPU scheduling on Kubernetes since the device plugin was introduced. The DRA driver replaces the legacy device plugin model with an API-driven resource management layer that provides:
- Granular visibility into GPU memory, topology, and MIG configuration
- Runtime negotiation of GPU resources instead of static allocation
- Support for Multi-Instance GPU (MIG) mode at the Kubernetes API level
- Device selection based on topology constraints (NVLink vs PCIe)
For enterprise teams, migrating to DRA enables topology-aware scheduling that was previously only achievable with complex admission controllers and node-level scripts. The DRA driver exposes GPU resources as structured objects rather than opaque integers, allowing the scheduler to make intelligent placement decisions.
# Deploy NVIDIA DRA driver (alpha in Kubernetes 1.31, stable in 1.33+)
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-dra-driver/v0.2.0/deploy/nvidia-dra-driver.yaml
# Verify DRA driver registration
kubectl get dramanagers
# NAME GPU-NODES VERSION STATUS
# nvidia-dra 12 0.2.0 Synced
# Request GPU with topology preference
spec:
containers:
- name: inference
resources:
nvidia.com/gpu: "2" # DRA will find 2 GPUs with NVLink connectivity
topology.kubernetes.io/nvlink: "preferred"
Putting It All Together: The Integration Stack
These five components form a cohesive stack that handles the full lifecycle of GPU-accelerated AI workloads:
| Component | Purpose | Best For | Deploy Order |
|---|---|---|---|
| GPU Operator | Node-level GPU setup, metrics, drivers | All GPU workloads | 1 (Foundation) |
| KServe | Model serving, batching, scale-to-zero | LLM inference, API endpoints | 2 |
| KEDA + DCGM | GPU-aware autoscaling | Variable-traffic inference APIs | 2 (parallel with KServe) |
| Volcano | Gang scheduling, vGPU, batch training | Distributed training, Ray jobs | 3 |
| NVIDIA DRA | Topology-aware GPU scheduling | Multi-GPU training, MIG workloads | 4 (2026 migration target) |
Enterprise Implementation Checklist
Before deploying this stack in production, verify each item:
- GPU Operator installed — Confirm
nvidia-smiworks in pod containers on GPU nodes - DCGM Exporter running — Prometheus scraping GPU metrics from
:9400/metrics - KServe vLLM runtime installed — List available runtimes with
kubectl get runtimes - KEDA ScaledObject verified — Trigger test load and confirm replica count increases
- Volcano scheduler registered — Jobs with
schedulerName: volcanoare picked up correctly - DRA driver in staging — Test topology-aware scheduling before production migration
- Monitoring dashboard live — Grafana panel showing GPU utilization, memory, temperature, and KServe request latency
Frequently Asked Questions
Can I use KServe and Volcano together?
Yes. KServe handles inference serving; Volcano manages batch training jobs. They operate at different layers and do not conflict. Use Volcano's schedulerName: volcano annotation on training jobs while letting KServe manage inference endpoints independently.
What Kubernetes version is required for these tools?
GPU Operator requires Kubernetes 1.26+. KServe 0.13+ requires 1.29+. KEDA 2.11+ requires 1.27+. Volcano 1.9+ requires 1.26+. NVIDIA DRA driver requires Kubernetes 1.31+ (alpha) or 1.33+ (stable). Ensure your cluster version before deployment.
How does KEDA scale-to-zero interact with cold-start latency?
LLM inference cold-start with vLLM tensor loading takes 45-90 seconds for an 8B model on H100. Use model preloading with KServe's loadStrategy to keep the model in memory. For non-latency-sensitive batch inference, scale-to-zero with 5-minute idle windows is cost-effective. For real-time APIs, keep minimum 1 replica warm.
Is Volcano production-ready for multi-node training at scale?
Volcano is CNCF incubating and used in production at hyperscalers and financial institutions for training clusters with 100+ GPU nodes. The gang scheduling and bin-packing features are stable. The primary operational complexity is scheduling policy tuning (fair share weights, queue priorities) during initial deployment.
How does the NVIDIA DRA driver compare to the device plugin?
The device plugin exposes GPUs as opaque nvidia.com/gpu integer counts. DRA exposes GPU attributes (memory, topology, MIG slices) as structured resources, enabling the scheduler to make topology-aware placement decisions. DRA is the future direction—plan migration in 2026, but device plugin remains supported.
Ready to Build Production-Ready AI Infrastructure?
gheWARE's Kubernetes Mastery and AI-Powered DevOps programs cover GPU scheduling, KServe deployment, KEDA autoscaling, and the full MLOps stack. Over 5,000 engineers from Fortune 500 companies have completed gheWARE training, with a 98% recommendation rate.
Explore Training Programs →