Skip to main content
aikubernetesgpu-scheduling +5

Why Dynamic Resource Allocation Going GA Is the Biggest Kubernetes GPU Story of the Decade

Kubernetes Dynamic Resource Allocation is GA in v1.35. See how DRA's DeviceClass and CEL selectors finally replace GPU node labels for ML platform teams.

For years, running GPUs on Kubernetes has felt like duct-taping a Ferrari to a shopping cart. You declared Nvidia.com/GPU: 1 in a Pod spec, prayed the Device Plugin gave you the right card, and if you needed anything more nuanced — say, “prefer an A5000 but fall back to a T10” — you were writing labyrinthine nodeSelector and affinity rules. That era is quietly ending. Dynamic Resource Allocation (DRA) hit GA in Kubernetes v1.35, and NVIDIA has folded its dra-driver-Nvidia-GPU project into Kubernetes SIGs while dropping the Beta label from its documentation. Translation for platform teams: the way you request specialized hardware in a cluster is about to look a lot more like how you request storage.

How DRA Reframes GPU Scheduling Around Claims, Not Labels

According to the original walkthrough from a CNTUG Infra Labs engineer, DRA introduces four core objects — DeviceClass, ResourceSlice, ResourceClaim, and ResourceClaimTemplate — that are deliberately modeled after Kubernetes storage. DeviceClass plays the role of StorageClass, while ResourceClaim and ResourceClaimTemplate mirror PersistentVolumeClaim and its StatefulSet-scoped template cousin. The NVIDIA DRA Driver GPU v25.12.0 automatically populates DeviceClasses like GPU.Nvidia.com, mig.Nvidia.com, and vfio.GPU.Nvidia.com on install.

Why this matters: SREs finally get a first-class, declarative API for hardware that isn’t shoehorned into resource limits. ResourceSlice records every device a driver manages on a node — architecture, product name, driver version, memory capacity, PCI bus ID, UUID — as structured attributes the scheduler can query. That single change unlocks scheduling logic that previously required custom operators or bespoke webhooks.

If you’re running a multi-tenant ML platform where data scientists share a mixed fleet of A5000s and T10s, you can now let each workload declare exactly what it needs without your platform team maintaining a taxonomy of node labels. Our take: within 18 months, expect the Device Plugin API to feel as legacy as in-tree volume plugins did in 2020.

What Ranked Preferences and CEL Selectors Change for ML Platforms

The most interesting demo in the source article is Scenario II, where a ResourceClaimTemplate uses firstAvailable to express a ranked preference: give me an A5000, but if none is free, fall back to a T10. The template targets the A5000 with a CEL expression — device.attributes["GPU.Nvidia.com"].productName == "NVIDIA RTX A5000" — and provides a fallback selector for the T10. When the author scaled a Deployment from 1 to 2 replicas, the first Pod grabbed the sole A5000 and the second cleanly fell back to a T10, exactly as promised. Scenario III pushes this further with device.capacity["GPU.Nvidia.com"].memory.isGreaterThan(quantity("20Gi")), filtering for any GPU with more than 20 GiB — a request the T10 (16 GiB) cannot satisfy, so the second replica sits in Pending with a cannot allocate all claims scheduling event.

Instead of platform teams pre-partitioning nodes by hardware SKU, application teams describe intent — memory, architecture, brand, compute capability — and the scheduler figures out placement. If you’re a team shipping custom AI agents that need different accelerators for embedding, inference, and fine-tuning workloads, DRA lets each workload carry its own hardware contract in the manifest.

Imagine a shared research cluster where three teams share eight GPUs of mixed generations. Under the old Device Plugin model, you’d tag nodes with GPU-type=a5000, publish a wiki page, and hope nobody typos the label. Under DRA, each team writes a ResourceClaimTemplate expressing exactly the capability envelope they need. Prediction: CEL selectors will become the new interview question for anyone hiring platform engineers who touch GPU infrastructure.

Why the RollingUpdate Gotcha Is a Warning Sign for Platform Teams

The source article calls out a subtle but critical failure mode. When the author deleted the Pod holding the A5000 under a default Deployment strategy.type: RollingUpdate, the rebuilt Pod did not return to the A5000. The old Pod’s ResourceClaim wasn’t released while it was Terminating, so the Deployment controller spun up a new Pod with a fresh claim from the template — which then fell back to the T10 because the A5000 was still “reserved.”

This bites teams six months into production. Ranked preferences aren’t sticky across rollouts by default — if you’re running an inference service that quietly degrades from an A5000 to a T10 during a routine restart, your p99 latency chart will catch it before your alerts fire. The lesson: DRA gives you expressive claims, but you still need to think about claim lifecycle in the context of Deployment strategies, PDBs, and eviction. For teams that ship production SaaS platforms on Kubernetes, this is the sort of nuance that separates a working demo from a resilient system.

Our take: expect the community to standardize on Recreate strategies or custom controllers for GPU-backed Deployments, at least until DRA gains a graceful claim handoff mechanism.

How Time Slicing and Device Health Reporting Reshape GPU Economics

Scenario IV in the source shows Time Slicing under DRA — a ResourceClaim with a TimeSlicing sharing strategy and a Long interval, referenced by four replicas of an nbody CUDA benchmark. All four Pods land on the same GPU, share a single ResourceClaim, and appear together under Reserved For in the claim’s status. Unlike the legacy Device Plugin’s Time Slicing, DRA doesn’t require you to pre-declare a slice count — you just set the interval and let the driver manage the sharing. As of June 2026, per the author, neither NVIDIA’s official docs nor the DRA driver wiki document Time Slicing; the config was reverse-engineered from demo/specs/quickstart/v1/GPU-test5.YAML and driver source code.

That gap in documentation is itself a story: DRA is arriving faster than the tooling around it. The bigger arc, though, is what the source flags at the end. Starting with Kubernetes v1.36, device health reporting will let Pods distinguish device failures from application failures — no more staring at a generic Error state wondering whether the GPU dropped off the bus or your PyTorch script segfaulted. And Cluster Autoscaler, which today scales nodes for CPU and memory pressure, may soon provision GPU nodes on demand in response to unfulfilled ResourceClaims.

If you’re a fleet operator running spiky inference workloads — the same operational shape as OCPP-native EV charging platforms that scale with regional demand — GPU autoscaling driven by declarative claims could cut idle accelerator spend materially. Prediction: by the end of 2027, “GPU-aware Cluster Autoscaler” ships as a first-class feature in at least two major managed Kubernetes offerings, and “reserved GPU capacity” becomes as unusual as “reserved EBS capacity” is today.

FAQ

Q: What is Dynamic Resource Allocation in Kubernetes? A: DRA is a Kubernetes API for requesting specialized hardware — GPUs, FPGAs, high-performance NICs — using declarative claims instead of the older Device Plugin’s opaque resource counters. It reached GA in Kubernetes v1.35 and is modeled after PersistentVolumeClaim, so workloads request device capabilities and the scheduler matches them against ResourceSlices published by drivers.

Q: How is DRA different from the NVIDIA Device Plugin? A: The Device Plugin exposes GPUs as simple countable resources like Nvidia.com/GPU: 1, which forces platform teams to encode hardware differences in node labels, taints, and affinity rules. DRA exposes structured device attributes — product name, memory capacity, CUDA compute capability, architecture — that workloads can filter with CEL expressions, and it supports ranked preferences via firstAvailable, sharing strategies like Time Slicing, and per-Pod claim templates.

Q: Do I need to migrate off the Device Plugin immediately? A: No. NVIDIA still ships the Device Plugin, and DRA requires Kubernetes v1.35 or newer plus a compatible driver like Nvidia-dra-driver-GPU v25.12.0. But new GPU workloads on modern clusters should default to DRA — the expressiveness gap is large enough that maintaining Device Plugin manifests is quickly becoming technical debt.

Key Takeaways

  • Platform teams still standardizing GPU access on node labels and affinity should start prototyping DRA-based ResourceClaimTemplates this quarter — the migration path only gets longer as workload manifests multiply.
  • CEL-based device selectors will become a required skill for anyone building Kubernetes platforms that touch accelerators; invest in team training before your ML org outpaces you.
  • Watch Deployment rollout semantics carefully — ranked preferences like firstAvailable don’t survive default RollingUpdate strategies, and the resulting silent hardware downgrades are hard to detect without explicit observability.
  • Kubernetes v1.36’s device health reporting will finally let SREs write meaningful alerts on GPU failure modes; plan dashboard changes now so you can act on the signal when it arrives.
  • Expect Cluster Autoscaler support for GPU provisioning to arrive within the next two minor Kubernetes releases, and start modeling what on-demand accelerator scaling would do to your cloud bill before your finance team asks.

Have a project in mind?

Tell us what you're building — we reply within 24 hours.