Skip to content
Chimera readability score 73 out of 100, Expert reading level.

Dynamic Resource Allocation (DRA) recently reached GA in Kubernetes v1.35, and I believe many of us are eager to give it a try. Adding to the momentum, NVIDIA has moved dra-driver-nvidia-gpu into Kubernetes SIGs, with the documentation dropping the Beta label — a sign that the technology and its standards are gradually maturing.

For this post, I borrowed all the NVIDIA GPUs currently available at CNTUG Infra Labs to learn how to elegantly allocate devices and resources with DRA.

CNTUG Infra Labs: Lab environment overview

CNTUG Infra Labs was founded to nurture the next generation of students and engineers in Taiwan’s software infrastructure field. The lab is hosted in Equinix’s Tokyo data center and is jointly funded by several CNTUG community members. Building the environment leverages a stack of open source projects, including OpenStack, Ceph, and Ansible

.

Since infrastructure software has a steep learning curve and requires substantial compute, storage, and network resources, CNTUG Infra Labs aims to provide a cloud platform where students and community members can experiment with and host related services. Spare capacity is also offered to the open source community for hosting services such as websites, Mattermost, and Jitsi Meet, or for workshop events. You can review the use cases for more details.

Lab Environment

We’ll use a Kubernetes cluster built with Cluster API + OpenStack. For brevity, the setup process is omitted here — feel free to refer to other blog posts for the details, or wait for a future post once I finish writing it up.

  • OS: Ubuntu 24.04
  • Kubernetes v1.35.3
  • Containerd 2.2.2
  • Node:
  • 1 Control Plane + etcd
  • 3 Workers
  • No GPU
  • T10 * 2
  • A5000 * 1
  • NVIDIA GPU Operator v26.3.1
  • NVIDIA DRA Driver GPU v25.12.0

Running kubectl get node should return something like:

NAME STATUS ROLES AGE VERSION

capi-dralabs-control-plane-xtcth Ready control-plane 8m7s v1.35.3

capi-dralabs-md-0-p4xkh-rpfxc Ready <none> 6m55s v1.35.3

capi-dralabs-md-gpua5000-jw4mx-d64jz Ready <none> 2m37s v1.35.3

capi-dralabs-md-gput10-gzl84-f2m2d Ready <none> 6m49s v1.35.3

Installing NVIDIA GPU Operator

Before installing the GPU Operator, label the Nodes that have GPUs. For my environment, this looks like:

kubectl label node capi-dralabs-md-gpua5000-jw4mx-d64jz

nvidia.com/dra-kubelet-plugin=true

kubectl label node capi-dralabs-md-gput10-gzl84-f2m2d

nvidia.com/dra-kubelet-plugin=true

Add the NVIDIA Chart Repo:

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia

helm repo update

Create a values-gpu-operator.yaml file that we’ll use during installation:

values-gpu-operator.yaml

version: v26.3.1

devicePlugin:

enabled: false

driver:

manager:

env:

  • name: NODE_LABEL_FOR_GPU_POD_EVICTION

value: "nvidia.com/dra-kubelet-plugin"

NOTE

If you’re using a different Kubernetes distribution (e.g., Rancher or K3s), the default Containerd installation path may differ — remember to add the following settings to values-gpu-operator.yaml:

toolkit:

env:

  • name: CONTAINERD_SOCKET

value: /run/k3s/containerd/containerd.sock

Install NVIDIA GPU Operator:

helm upgrade --install gpu-operator nvidia/gpu-operator \

--version=v26.3.1 \

--create-namespace \

--namespace gpu-operator -f values-gpu-operator.yaml

Wait for the GPU Operator to come up. It will install the NVIDIA GPU Driver and tweak the Container Runtime configuration. For specific tuning needs, refer to the NVIDIA official documentation.

Installing NVIDIA DRA Driver GPU

Create a values-nvidia-dra-driver-gpu.yaml file that we’ll use during installation:

values-nvidia-dra-driver-gpu.yaml

version: 25.12.0

nvidiaDriverRoot: /run/nvidia/driver

gpuResourcesEnabledOverride: true

image:

pullPolicy: IfNotPresent

kubeletPlugin:

nodeSelector:

nvidia.com/dra-kubelet-plugin: "true"

resources:

gpus:

enabled: true

computeDomains:

enabled: false # No NVLink here

featureGates:

TimeSlicingSettings: true

If you’d like to try out Scenario IV’s GPU Time Slicing later, you can enable the TimeSlicingSettings Feature Gate now; otherwise, leave it commented out and helm upgrade later when needed.

Install NVIDIA DRA Driver GPU:

helm upgrade -i nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \

--version="25.12.0" \

--namespace nvidia-dra-driver-gpu \

--create-namespace -f values-nvidia-dra-driver-gpu.yaml

Use kubectl get pod to confirm the NVIDIA DRA Driver GPU is up:

kubectl get pod -n nvidia-dra-driver-gpu

NAME READY STATUS RESTARTS AGE

nvidia-dra-driver-gpu-kubelet-plugin-6skhp 1/1 Running 0 10m

nvidia-dra-driver-gpu-kubelet-plugin-jswk6 1/1 Running 0 10m

A first look at DRA

DeviceClass

Once installed, you’ll find that DeviceClass and ResourceSlice have been set up by NVIDIA DRA Driver GPU. As the name suggests, DeviceClass represents categories of devices — opening it up reveals regular GPUs, MIG, and VFIO. (If ComputeDomains isn’t disabled, you’ll also see ComputeDomains information.)

kubectl get deviceclass

DeviceClass example output

NAME AGE

gpu.nvidia.com 44m

mig.nvidia.com 44m

vfio.gpu.nvidia.com 44m

ResourceSlice

ResourceSlice is automatically updated by the DRA driver on each node, recording all devices the driver manages on that node.

Devices on the same node managed by the same driver belong to the same Pool. When the device count exceeds what fits in a single object (up to 128 entries, or 64 if any device uses taints or counters), the driver splits the Pool across multiple ResourceSlices.

.spec.pool.generation and .spec.pool.resourceSliceCount let the scheduler determine whether it has the complete and latest device list for a given node.

kubectl get resourceslice

ResourceSlice example output

NAME NODE DRIVER POOL AGE

capi-dralabs-md-gpua5000-jw4mx-d64jz-gpu.nvidia.com-w9fnv

capi-dralabs-md-gpua5000-jw4mx-d64jz gpu.nvidia.com

capi-dralabs-md-gpua5000-jw4mx-d64jz 5m13s

capi-dralabs-md-gput10-gzl84-f2m2d-gpu.nvidia.com-dtgtc

capi-dralabs-md-gput10-gzl84-f2m2d gpu.nvidia.com

capi-dralabs-md-gput10-gzl84-f2m2d 23m

You can expand the full content with -o yaml:

kubectl get resourceslices -o yaml

Click the panel below to see the full output. Each ResourceSlice records its node in .metadata.ownerReferences and the devices in .spec.devices. Every device carries .attributes including (but not limited to) architecture, product name, and driver version.

Since each node in this lab has at most 2 GPUs — far below a single ResourceSlice’s 128-entry limit — every node only shows one ResourceSlice.

▼ Full ResourceSlice output

apiVersion: v1

items:

  • apiVersion: resource.k8s.io/v1

kind: ResourceSlice

metadata:

creationTimestamp: "2026-05-04T14:40:17Z"

generateName: capi-dralabs-md-gpua5000-jw4mx-d64jz-gpu.nvidia.com-

generation: 1

name: capi-dralabs-md-gpua5000-jw4mx-d64jz-gpu.nvidia.com-w9fnv

ownerReferences:

  • apiVersion: v1

controller: true

kind: Node

name: capi-dralabs-md-gpua5000-jw4mx-d64jz

uid: 83aafab6-7eb3-42d0-9faf-6118f78341ef

resourceVersion: "11490"

uid: d03fd27e-f6cb-4386-ae61-80aa84309e77

spec:

devices:

  • attributes:

addressingMode:

string: HMM

architecture:

string: Ampere

brand:

string: NvidiaRTX

cudaComputeCapability:

version: 8.6.0

cudaDriverVersion:

version: 13.0.0

driverVersion:

version: 580.126.20

productName:

string: NVIDIA RTX A5000

resource.kubernetes.io/pciBusID:

string: "0000:00:06.0"

resource.kubernetes.io/pcieRoot:

string: pci0000:00

type:

string: gpu

uuid:

string: GPU-e13ce856-7474-797f-d143-16e99b65c0c3

capacity:

memory:

value: 23028Mi

name: gpu-0

driver: gpu.nvidia.com

nodeName: capi-dralabs-md-gpua5000-jw4mx-d64jz

pool:

generation: 1

name: capi-dralabs-md-gpua5000-jw4mx-d64jz

resourceSliceCount: 1

  • apiVersion: resource.k8s.io/v1

kind: ResourceSlice

metadata:

creationTimestamp: "2026-05-04T14:21:53Z"

generateName: capi-dralabs-md-gput10-gzl84-f2m2d-gpu.nvidia.com-

generation: 1

name: capi-dralabs-md-gput10-gzl84-f2m2d-gpu.nvidia.com-dtgtc

ownerReferences:

  • apiVersion: v1

controller: true

kind: Node

name: capi-dralabs-md-gput10-gzl84-f2m2d

uid: d7ecdc93-1d6c-4868-8503-4251bcf8cf3b

resourceVersion: "7408"

uid: 66f32713-c547-4369-84de-97f86430d18d

spec:

devices:

  • attributes:

addressingMode:

string: HMM

architecture:

string: Turing

brand:

string: Nvidia

cudaComputeCapability:

version: 7.5.0

cudaDriverVersion:

version: 13.0.0

driverVersion:

version: 580.126.20

productName:

string: Tesla T10

resource.kubernetes.io/pciBusID:

string: "0000:00:06.0"

resource.kubernetes.io/pcieRoot:

string: pci0000:00

type:

string: gpu

uuid:

string: GPU-dae084a2-974c-00e2-6dec-4ba1999b8652

capacity:

memory:

value: 16Gi

name: gpu-0

  • attributes:

addressingMode:

string: HMM

architecture:

string: Turing

brand:

string: Nvidia

cudaComputeCapability:

version: 7.5.0

cudaDriverVersion:

version: 13.0.0

driverVersion:

version: 580.126.20

productName:

string: Tesla T10

resource.kubernetes.io/pciBusID:

string: "0000:00:07.0"

resource.kubernetes.io/pcieRoot:

string: pci0000:00

type:

string: gpu

uuid:

string: GPU-d1bf2033-42f6-096c-b0c6-470575bc08df

capacity:

memory:

value: 16Gi

name: gpu-1

driver: gpu.nvidia.com

nodeName: capi-dralabs-md-gput10-gzl84-f2m2d

pool:

generation: 1

name: capi-dralabs-md-gput10-gzl84-f2m2d

resourceSliceCount: 1

kind: List

metadata:

resourceVersion: ""

With this information, how does a Pod tell Kubernetes which devices it wants? That’s where ResourceClaim and ResourceClaimTemplate come in!

ResourceClaim & ResourceClaimTemplate

If you’d like multiple Pods to share the same device, you can manually create a ResourceClaim. It stays fully independent regardless of Pod creation or deletion.

What if you want each Pod to have its own dedicated device? ResourceClaimTemplate lets you predefine a ResourceClaim. Once a Deployment references the template by name, every new Pod automatically gets a corresponding ResourceClaim; conversely, deleting the Pod removes its claim.

Do these concepts feel familiar? DRA is modeled after Storage in Kubernetes — PersistentVolumeClaim and PersistentVolumeClaimTemplate (the latter only existing inside StatefulSet), with DeviceClass playing roughly the role of StorageClass.

Hands-On with DRA

Scenario I: Two Containers Sharing One GPU

Use a ResourceClaim to declare that we need one NVIDIA GPU, then run a Pod with two containers that share it.

lab01-rc.yaml

apiVersion: resource.k8s.io/v1

kind: ResourceClaim

metadata:

name: must-nvidia-gpu

spec:

devices:

requests:

  • name: gpu

exactly:

deviceClassName: gpu.nvidia.com

count: 1

Apply the resource:

kubectl apply -f lab01-rc.yaml

Use get to inspect the ResourceClaim:

kubectl get resourceclaim

The status is pending because no Pod is consuming it yet.

NAME STATE AGE

must-nvidia-gpu pending 10s

Now define a Pod with two containers, both referencing the must-nvidia-gpu ResourceClaim we just created.

lab01-pod.yaml

apiVersion: v1

kind: Pod

metadata:

name: must-nvidia-gpu-pod

spec:

restartPolicy: Never

containers:

  • name: ctr0

image: ubuntu:24.04

command: ["bash", "-c"]

args: ["nvidia-smi -L; trap 'exit 0' TERM; sleep 9999 & wait"]

resources:

claims:

  • name: gpu
  • name: ctr1

image: ubuntu:24.04

command: ["bash", "-c"]

args: ["nvidia-smi -L; trap 'exit 0' TERM; sleep 9999 & wait"]

resources:

claims:

  • name: gpu

resourceClaims:

  • name: gpu

resourceClaimName: must-nvidia-gpu

Apply the Pod:

kubectl apply -f lab01-pod.yaml

Check the ResourceClaim again:

kubectl get resourceclaim

The status changes to allocated and reserved because a Pod is now using the resource.

NAME STATE AGE

must-nvidia-gpu allocated,reserved 16s

Now we can use logs to print the output:

kubectl logs pod must-nvidia-gpu-pod --all-containers --prefix

[pod/must-nvidia-gpu-pod/ctr0] GPU 0: Tesla T10 (UUID:

GPU-dae084a2-974c-00e2-6dec-4ba1999b8652)

[pod/must-nvidia-gpu-pod/ctr1] GPU 0: Tesla T10 (UUID:

GPU-dae084a2-974c-00e2-6dec-4ba1999b8652)

In practice, it might not be a T10 — it could just as easily be an A5000.

Now delete the Pod:

kubectl delete -f lab01-pod.yaml

Check the ResourceClaim once more:

kubectl get resourceclaim

The status returns to pending because no Pod is using the resource anymore.

NAME STATE AGE

must-nvidia-gpu pending 3m39s

Delete the ResourceClaim:

kubectl delete -f lab01-rc.yaml

The example above only asked for one GPU but didn’t tell us which one we’d get.

This scenario isn’t all that different from the original Device Plugin, right? The next scenarios are where DRA truly shines!

Scenario II: ResourceClaimTemplate — Prefer A5000 in a Deployment

Today, an engineer asks me for an inference model that prefers the A5000, but since A5000s are scarce, they’re fine falling back to T10 when scaling up.

Beyond exactly, ResourceClaim also supports firstAvailable for ranked preferences. Going back to the full ResourceSlice output, we can target GPUs by name using .attributes.productName.

The configuration looks like this:

lab02.yaml

apiVersion: resource.k8s.io/v1

kind: ResourceClaimTemplate

metadata:

name: first-a5000

spec:

spec:

devices:

requests:

  • name: gpu

firstAvailable:

  • name: a5000

deviceClassName: gpu.nvidia.com

selectors:

  • cel:

expression: device.attributes["gpu.nvidia.com"].productName == "NVIDIA RTX A5000"

  • name: fallback-t10

deviceClassName: gpu.nvidia.com

selectors:

  • cel:

expression: device.attributes["gpu.nvidia.com"].productName == "Tesla T10"


apiVersion: apps/v1

kind: Deployment

metadata:

name: first-a5000-deploy

labels:

app: first-a5000-deploy

spec:

replicas: 1

selector:

matchLabels:

app: first-a5000-deploy

template:

metadata:

labels:

app: first-a5000-deploy

spec:

containers:

  • name: ctr0

image: ubuntu:24.04

command: ["bash", "-c"]

args: ["nvidia-smi -L; trap 'exit 0' TERM; sleep 9999 & wait"]

resources:

claims:

  • name: gpu

resourceClaims:

  • name: gpu

resourceClaimTemplateName: first-a5000

Save the above as lab02.yaml and apply it:

kubectl apply -f lab02.yaml

Confirm the Pod is Running and use the nvidia-smi -L output to verify it got the A5000:

kubectl get pod

kubectl logs deployments/first-a5000-deploy --all-pods

NAME READY STATUS RESTARTS AGE

first-a5000-deploy-8c6cf4568-2lsv9 1/1 Running 0 9s

[pod/first-a5000-deploy-8c6cf4568-2lsv9/ctr0] GPU 0: NVIDIA RTX A5000 (UUID: GPU-e13ce856-7474-797f-d143-16e99b65c0c3)

Now scale up to 2 replicas to see which GPU the new Pod gets:

kubectl scale deployment first-a5000-deploy --replicas 2

kubectl logs deployments/first-a5000-deploy --all-pods

[pod/first-a5000-deploy-8c6cf4568-2lsv9/ctr0] GPU 0: NVIDIA RTX A5000 (UUID: GPU-e13ce856-7474-797f-d143-16e99b65c0c3)

[pod/first-a5000-deploy-8c6cf4568-865jj/ctr0] GPU 0: Tesla T10 (UUID: GPU-dae084a2-974c-00e2-6dec-4ba1999b8652)

The first Pod has taken the only A5000, so the second Pod falls back to T10 — exactly the expected behavior of firstAvailable when the top choice is unavailable.

We can also see the corresponding ResourceClaims:

kubectl get resourceclaim

NAME STATE AGE

first-a5000-deploy-8c6cf4568-2lsv9-gpu-bdz9j allocated,reserved 4m29s

first-a5000-deploy-8c6cf4568-865jj-gpu-mqfcx allocated,reserved 3m29s

⚠️ WARNING — If we delete the A5000 Pod, will the rebuilt Pod return to A5000?

With the configuration above, no, it won’t return to A5000. The Deployment default strategy.type is RollingUpdate; while the old Pod is Terminating, its ResourceClaim hasn’t been released yet.

The Deployment controller immediately creates a new Pod and a new ResourceClaim from the ResourceClaimTemplate. Since the A5000 is still held by the old Pod, the new claim falls back to T10.

Finally, clean up:

kubectl delete -f lab02.yaml

Today an engineer wants to deploy an LLM that needs a single GPU with at least 20 GiB of memory. Since it’s still in testing, compute requirements are flexible — any available GPU meeting the memory threshold will do. Beyond .attributes, we can also use .capacity.memory. How do we express comparison rules? Take a look at line 15: lab03.yamlScenario III: GPUs With at Least 20 GiB of Memory

apiVersion: resource.k8s.io/v1

kind: ResourceClaimTemplate

metadata:

name: gt20g

spec:

spec:

devices:

requests:

  • name: gpu

firstAvailable:

  • name: gt20g

deviceClassName: gpu.nvidia.com

selectors:

  • cel:

expression: device.capacity["gpu.nvidia.com"].memory.isGreaterThan(quantity("20Gi"))


apiVersion: apps/v1

kind: Deployment

metadata:

name: gt20g-deploy

labels:

app: gt20g-deploy

spec:

replicas: 1

selector:

matchLabels:

app: gt20g-deploy

template:

metadata:

labels:

app: gt20g-deploy

spec:

containers:

  • name: ctr0

image: ubuntu:24.04

command: ["bash", "-c"]

args: ["nvidia-smi -L; trap 'exit 0' TERM; sleep 9999 & wait"]

resources:

claims:

  • name: gpu

resourceClaims:

  • name: gpu

resourceClaimTemplateName: gt20g

We use CEL’s isGreaterThan(quantity(“20Gi”)) to require more than 20 GiB.

Apply the YAML:

kubectl apply -f lab03.yaml

Confirm the Pod is Running and that we got the A5000:

kubectl get pod

kubectl logs deployments/gt20g-deploy --all-pods

NAME READY STATUS RESTARTS AGE

gt20g-deploy-5ff576476-hdz8f 1/1 Running 0 5m16s

[pod/gt20g-deploy-5ff576476-hdz8f/ctr0] GPU 0: NVIDIA RTX A5000 (UUID: GPU-e13ce856-7474-797f-d143-16e99b65c0c3)

Now let’s see what happens when we scale up:

kubectl scale deployment gt20g-deploy --replicas 2

After scaling, check whether a new Pod was added:

kubectl get pod

NAME READY STATUS RESTARTS AGE

gt20g-deploy-5ff576476-hdz8f 1/1 Running 0 8m9s

gt20g-deploy-5ff576476-vjss8 0/1 Pending 0 26s

Run describe on the gt20g-deploy-5ff576476-vjss8 Pod:

kubectl describe pod gt20g-deploy-5ff576476-vjss8

Events:

Type Reason Age From Message

---- ------ ---- ---- -------

Warning FailedScheduling 98s default-scheduler 0/4 nodes are available: 1 node(s) had untolerated taint(s), 3 cannot allocate all claims. still not schedulable, preemption: 0/4 nodes are available: 4 Preemption is not helpful for scheduling.

Since there’s no other GPU with at least 20 GiB of memory in the cluster — the T10 has only 16 GiB — the new Pod is stuck in Pending.

Clean up the resources:

kubectl delete -f lab03.yaml

For more sophisticated matching logic, see CEL in Kubernetes.

Scenario IV: GPU Time Slicing in DRA

Note for the reader:

As of June 2026, neither the NVIDIA official documentation nor the NVIDIA DRA Driver GPU wiki contains any tutorials on Time Slicing.

The configuration below is adapted from demo/specs/quickstart/v1/gpu-test5.yaml, supplemented by reading parts of the source code; the Feature Gate part draws from third-party articles.

The setup may change in future releases — keep that in mind!

Today, an engineer comes back to me asking: “I know DRA is great for resource allocation, but is there a way to fall back to Time Slicing mode?”

Want to go back to the old mode? Nooo… problem at all!

Just specify the device under .spec.devices.config and switch the sharing strategy to TimeSlicing. Here’s an example:

lab04.yaml

apiVersion: resource.k8s.io/v1

kind: ResourceClaim

metadata:

name: time-slicing-manual

spec:

devices:

requests:

  • name: ts-gpu

exactly:

deviceClassName: gpu.nvidia.com

config:

  • requests: ["ts-gpu"]

opaque:

driver: gpu.nvidia.com

parameters:

apiVersion: resource.nvidia.com/v1beta1

kind: GpuConfig

sharing:

strategy: TimeSlicing

timeSlicingConfig:

interval: Long


apiVersion: apps/v1

kind: Deployment

metadata:

name: ts-gpu-deployment

spec:

replicas: 4

selector:

matchLabels:

app: ts-gpu

template:

metadata:

labels:

app: ts-gpu

spec:

containers:

  • name: ctr

image: nvcr.io/nvidia/k8s/cuda-sample:nbody-cuda11.6.0-ubuntu18.04

command: ["bash", "-c"]

args: ["trap 'exit 0' TERM; /tmp/sample --benchmark --numbodies=4226000 & wait"]

resources:

claims:

  • name: gpu

resourceClaims:

  • name: gpu

resourceClaimName: time-slicing-manual

Save the above as lab04.yaml and apply it:

kubectl apply -f lab04.yaml

Verify all the Pods are running:

kubectl get pod

NAME READY STATUS RESTARTS AGE

ts-gpu-deployment-549c945798-6t2dx 1/1 Running 0 4s

ts-gpu-deployment-549c945798-tlgp4 1/1 Running 0 4s

ts-gpu-deployment-549c945798-x2gbv 1/1 Running 0 4s

ts-gpu-deployment-549c945798-xbv22 1/1 Running 0 4s

Since all 4 Pods share the same ResourceClaim, kubectl get resourceclaim returns only a single entry — which itself is evidence that they’re sharing:

kubectl get resourceclaim

NAME STATE AGE

time-slicing-manual allocated,reserved 30s

Drill in with describe and you’ll see all 4 Pods listed under Reserved For:

kubectl describe resourceclaim time-slicing-manual

Status:

Allocation:

Devices:

Config:

Opaque:

Driver: gpu.nvidia.com

Parameters:

API Version: resource.nvidia.com/v1beta1

Kind: GpuConfig

Sharing:

Strategy: TimeSlicing

Time Slicing Config:

Interval: Long

Requests:

ts-gpu

Source: FromClaim

Results:

Device: gpu-0

Driver: gpu.nvidia.com

Pool: capi-dralabs-md-gpua5000-jw4mx-d64jz

Request: ts-gpu

Node Selector:

Node Selector Terms:

Match Fields:

Key: metadata.name

Operator: In

Values:

capi-dralabs-md-gpua5000-jw4mx-d64jz

Reserved For:

Name: ts-gpu-deployment-549c945798-x2gbv

Resource: pods

UID: be21eecf-2d58-4891-9cac-ac3674f4ff09

Name: ts-gpu-deployment-549c945798-6t2dx

Resource: pods

UID: 37d504a0-966e-4263-9fcd-b713d73c0e77

Name: ts-gpu-deployment-549c945798-xbv22

Resource: pods

UID: 2b5ec297-9889-4cb9-8079-b626a854b292

Name: ts-gpu-deployment-549c945798-tlgp4

Resource: pods

UID: ee836856-8c6b-4161-9582-4bc4ff63a606

That’s how Time Slicing is enabled under DRA — the effect is similar to the legacy Device Plugin’s Time Slicing mode, except we don’t need to specify how many slices to divide into. We just configure timeSlicingConfig and its interval.

Finally, clean up the resources:

kubectl delete -f lab04.yaml

Summary

Compared to the Device Plugin, DRA now offers a much cleaner usage model that lets developers and cluster admins allocate devices more precisely. There’s no longer a need to colocate the same kind of device on the same node, nor to write complex rules in nodeSelector or Affinity.

Starting with K8s v1.36, device health reporting is also available, so Pods no longer simply show Error — we can tell whether the failure stems from the device or from the application.

Previously, when a K8s cluster ran low on CPU or memory, Cluster Autoscaler could spin up new machines. In the future, the same may apply to GPU shortages — Cluster Autoscaler may provision GPU nodes on demand, enabling more efficient resource allocation.