Skip to main content

Your GPU cluster is running a hotel. Most engineers are still managing it like a house rental

 

Your GPU cluster is running a hotel. Most engineers are still managing it like a house rental.

Here's a stat that should bother every platform architect: enterprise GPU utilization commonly sits at 20-30%. Not because demand is low — because the allocation model underneath most AI platforms was built for a world where one workload gets one whole GPU, full stop.

Red Hat OpenShift AI just closed that gap architecturally. Dynamic Resource Allocation (DRA) went GA in OpenShift 4.21, and it quietly rewrites how GPUs get shared across a cluster. If you're designing AI infrastructure in 2026, this is the shift to understand.

The old model: renting the whole house

For years, Kubernetes handled GPUs through the Device Plugin framework. A GPU request was just an integer: "give me 1 GPU." No nuance about size, memory, or whether a fraction would do.

To get any sharing at all, teams used static MIG (Multi-Instance GPU) configuration — an admin pre-carves a physical GPU into fixed partitions (say, four 3g.20gb slices) via a ConfigMap, ahead of time, based on a guess about future demand.

That guess is almost always wrong by lunchtime.

If traffic patterns shift — say, a burst of small inference requests hits a GPU pre-sliced for large training jobs — those jobs simply queue. Fixing it means manually reconfiguring the GPU, which often requires draining the node. An external add-on called DAS (Dynamic Accelerator Slicer / InstaSlice) later emerged to patch this with just-in-time slicing, using mutation webhooks to carve partitions on the fly. It worked — but it lived outside the scheduler, a bolted-on helper that could drift out of sync with Kubernetes' own decisions.

The analogy that makes this click

Think of a physical GPU as a big luxury house. The old model could only rent the entire house to one guest — even if they just needed a bedroom. Expensive, and often half-empty.

DRA turns that house into a hotel with rooms of different sizes — some studios, some suites — and puts the front desk (the Kubernetes scheduler) directly in charge of the booking system. No separate concierge running around with a clipboard, guessing who needs what.

How the booking actually works

  1. The hotel publishes its room list. The NVIDIA driver publishes a ResourceSlice — live inventory of every available GPU slice and its attributes.
  2. The guest states a preference, with a backup. A pod's ResourceClaimTemplate declares what it needs via a CEL expression, plus an ordered fallback: "give me a 1g.5gb slice — if none are free, 3g.20gb will do."
  3. The front desk matches it — natively. The Kubernetes scheduler evaluates the claim directly against live inventory. No external controller, no webhook, no second system to keep in sync.
  4. The guest gets a specific room. The pod binds to an exact slice — e.g. gpu-0-mig-1g5gb-19-5 — and the platform moves on to the next request.

Static MIG vs. DRA — the short version

Aspect Static MIG (old) DRA (new)
Slice configuration Fixed at setup via ConfigMap; admin pre-decides the split Declared per-workload, at request time
Changing the split Manual reconfiguration, often needs a node drain No reconfiguration — scheduler matches existing slices
Who decides Admin, ahead of time, guessing future demand The workload itself
No exact match available Job fails or sits pending until someone intervenes Automatic fallback to the next-best slice, declared in YAML
Enforcement point External controller/webhook sitting outside the scheduler Native to the Kubernetes scheduler
Flexibility One fixed shape per GPU, all day Different pods request different shapes from the same GPU pool

A real production scenario

A platform team runs a single A100 80GB GPU shared across an ML workload mix.

Old world (static MIG): Ops pre-configures the GPU into four 3g.20gb slices at 8 AM, based on yesterday's traffic. At noon, a burst of lightweight inference requests arrives — each only needing 1g.10gb. But the GPU is already carved into big slices. Requests queue. Capacity sits wasted until someone manually reconfigures the GPU, usually after draining running workloads.

New world (DRA): Each inference pod's ResourceClaimTemplate simply states: "give me a 1g.10gb slice, fallback to 2g.20gb." When the burst hits, the scheduler checks the GPU's live ResourceSlice inventory and packs seven small inference pods into slices that actually fit — no human touches the GPU config. Later, when a training job needs a bigger slice, it requests 3g.40gb directly, and the scheduler fits it into whatever capacity is free.

Why this matters beyond the YAML

This isn't a minor scheduling tweak. It's a category shift in how GPU capacity is governed:

  • Multi-tenancy gets safer. Different teams can share one physical GPU without one workload starving another.
  • Utilization goes up without adding hardware. The same GPU serves more shapes of demand across the day.
  • Operational fragility goes down. One less external controller to monitor, patch, and debug at 2 AM.
  • It's not just NVIDIA's problem to solve alone anymore — the DRA driver is being donated to the CNCF, moving it toward community, not vendor, governance.

If your platform's GPU story is still "one pod, one whole GPU, first come first served" — or "we pre-sliced it this morning and hope for the best" — that's not a GPU platform. That's a house rental pretending to be a hotel.



#OpenShiftAI #Kubernetes #GPU #MLOps #CloudArchitecture #RedHat #PlatformEngineering #AIInfrastructure

Comments

Popular posts from this blog

TKGS VMware/Kubernetes ReadWriteMany Functionality with NFS-CSI

 TKGS VMware WRX Functionality with NFS CSI ReadWriteMany Access mode in Kubernetes When it come to RWX access mode in PVC, TKGS support it if we have the following: 1. Kubernetes is upgraded to 1.22.9 (This version supports this RWX functionality) 2. vSAN should be there in your environment (VMware uses the vpshere csi, which only support vSAN) How to done it without vSAN: 1. Upgrade the kubernetes to version 1.22.9 2. Use NFS-CSI and then create a new storage class to be consumed. Work Around : 2.a : Please use the below link to get the nfs-csi-driver  https://github.com/ibraraziz/csi-driver-nfs Note: It absolutely fine that we have multiple CSI drivers/provisioner in kubernetes (Just for information) Step:1 Goto csi-driver-nfs/deploy/v4.0.0/ and apply that yaml into your environment. It will create NFS csi provisioner and controller pods in namespace of kubesystem as below Step: 2 Now create storage class and goto the example folder  csi-driver- nfs/deploy/example...

Choosing the Right OpenShift Service: Service Mesh, Submariner, or Service Interconnect?

In today’s digital world, businesses rely more and more on interconnected applications and services to operate effectively. This means integrating software and data across different environments is essential. However, achieving smooth connectivity can be tough because different application designs and the mix of on-premises and cloud systems often lead to inconsistencies. These issues require careful management to ensure everything runs well, risks are managed effectively, teams have the right skills, and security measures are strong. This article looks at three Red Hat technologies—Red Hat OpenShift Service Mesh and Red Hat Service Interconnect, as well as Submariner—in simple terms. It aims to help you decide which solution is best for your needs. OPENSHIFT Feature Service Mesh (Istio) Service Interconnect Submariner Purpose Manages service-to-service communication within a single cluster. Enables ...

PV and PVC Deletion in Kubernetes and remains stuck in terminating state

 First we need to note that :  When you need to delete both PV, PVC then you must start from PVC and then go for PV . I n case mistakenly a PV is deleted first then it goes in terminating state as shown below: Deleted the pv mistakenly Output : See the higlighted one Enlisting the desired PVC for which the PV we have deleted as highlighted  Now if we delete that particular PVC so it will also go into terminating state as shown below After deletion it also goes in terminating state. Work Around Edit the particular PVC like as shown kubectl edit pvc < pvc name> Remove that particular line just as highlighted below: Once Edit is done that Terminiating state is no more there and PVC AND PV completely deleted.👏                     Feel Free to query : Click Here   By: Ibrar Aziz (Cloud Enthusiast) https://ibraraziz-cloud.blogspot.com/ https://www.linkedin.com/in/ibraraziz/