answrsnow
AI Infrastructure · How-to explainer

How Do You Handle GPU Scheduling on Kubernetes for AI Workloads in 2027?

By Kory White · Updated Oct 2026 · 11 min read
The open top of a multi-GPU server, with a row of GPU cards mounted above the PCIe slots
Direct answer

You handle GPU scheduling on Kubernetes in layers, and each layer solves a different problem. The base layer is the device plugin framework: a vendor plugin advertises GPUs to the kubelet, and a pod asks for them with a resource such as nvidia.com/gpu in its limits. On NVIDIA hardware the GPU Operator automates the drivers, device plugin and node labels. On top of that you decide how GPUs are shared (whole GPUs, time-slicing, or MIG partitions), how pods are matched to the right nodes (labels, node affinity, taints and tolerations, topology), how groups of pods start together (gang scheduling with Kueue, Volcano, Apache YuniKorn or NVIDIA's KAI Scheduler), and how GPU nodes are added and removed (Karpenter or the Cluster Autoscaler).

The newest piece is Dynamic Resource Allocation (DRA). The Kubernetes documentation lists it as stable since Kubernetes v1.35 and says it can no longer be disabled, so it is the direction for describing devices in detail. Kubernetes' own gang scheduling is listed as beta since v1.37 and disabled by default, so most teams still use an add-on queue or scheduler for all-or-nothing starts.

Every fact below comes from official Kubernetes, NVIDIA or project documentation read on October 31, 2026. This page does not predict what will be standard in 2027, and it gives no performance figures because none of the pages read state any.

Layer one: device plugins and GPU resource requests

Kubernetes does not know what a GPU is until a plugin tells it. The device plugin framework lets a vendor advertise hardware to the kubelet. The plugin registers with the kubelet over a gRPC Registration service, the resource is named in the vendor-domain/resourcetype pattern, and the kubelet reports the devices to the API server as part of the node status. The Kubernetes GPU page lists this support as stable since Kubernetes v1.26 for AMD and NVIDIA GPUs, and it says the administrator has to install the vendor's drivers on the nodes and run the vendor's device plugin.

That last row is why everything else on this page exists. A plain nvidia.com/gpu request gives a pod a whole GPU, and the scheduler can only count whole units. Sharing, partitioning and smarter placement all have to be added on top.

The NVIDIA GPU Operator takes the node setup off your hands

NVIDIA's documentation says configuring nodes for GPUs means several software components that are difficult and prone to errors, and that the GPU Operator uses the Kubernetes operator framework to automate all of them. It lists the NVIDIA drivers, the Kubernetes device plugin for GPUs, the NVIDIA Container Toolkit, automatic node labeling using GPU Feature Discovery (GFD), DCGM-based monitoring and others.

For scheduling, the labels matter most. Kubernetes' own page suggests Node Feature Discovery (NFD) to detect hardware on each node and advertise it as node labels, and notes that NFD can also add extended resources, annotations and node taints. Mixed fleets are handled with node labels and selectors, or with required node affinity rules written against those labels.

The GPU Operator is NVIDIA's product for NVIDIA GPUs. Kubernetes' GPU page also links AMD and Intel plugin instructions, so the device plugin layer is not NVIDIA-only; the sharing features in the next section are.

Sharing a GPU: time-slicing versus MIG

Because a plain request hands out whole GPUs, small jobs such as notebooks or light inference can leave expensive hardware mostly idle. NVIDIA documents two ways to share through the GPU Operator.

Time-slicing is set up with a config map that names the resource and a replica count. NVIDIA's example sets four replicas of nvidia.com/gpu, so a machine with one GPU advertises four. The nodes get a replicas label, and by default the product label gains a -SHARED suffix so a node selector can steer pods toward shared or exclusive GPUs. Setting renameByDefault advertises the resource as nvidia.com/gpu.shared instead. One caution from NVIDIA: asking for more than one time-sliced GPU does not guarantee a proportional amount of compute, only access to a GPU that other pods also use.

MIG is driven by a node label. The GPU Operator deploys MIG Manager, you choose a strategy (single enables MIG mode on all GPUs on a node, mixed does not), and you set a label such as nvidia.com/mig.config=all-1g.10gb to apply a profile. NVIDIA warns that MIG Manager terminates the GPU pods on the node while it reconfigures, requires that no user workloads are running on the GPUs being configured, and in some cases needs the node cordoned and rebooted. Plan MIG geometry per node pool rather than changing it under live jobs.

A monitoring side effect from NVIDIA's time-slicing page: DCGM-Exporter does not support associating metrics to containers when time-slicing is enabled. If per-pod GPU metrics matter to you, decide that before choosing time-slicing.

Dynamic Resource Allocation: the newer way to ask for devices

Dynamic Resource Allocation (DRA) changes how a pod describes what it needs. The Kubernetes documentation lists it as stable since Kubernetes v1.35, first available in v1.30, and says the feature gate is locked so you can no longer disable it. Device drivers and cluster admins define device classes; workload operators create ResourceClaims or ResourceClaimTemplates; Kubernetes allocates matching devices to the claims and places pods on nodes that can reach them. The documentation compares this to dynamic volume provisioning with PersistentVolumeClaims.

Limitation stated in the Kubernetes docs: the default scheduler does not support preemption for DRA resources. A running pod that holds a DRA device cannot be preempted by a higher-priority pod that needs one, and the high-priority pod stays pending until the device frees up. Whether your GPU vendor ships a DRA driver for your hardware is a separate question to check with the vendor.

DRA does not replace the device plugin overnight. Existing clusters keep using nvidia.com/gpu requests, and the projects below are adding DRA support alongside them: Kueue lists quota management for devices requested through DRA, and KAI Scheduler lists DRA support through ResourceClaims.

Gang and batch scheduling: Kubernetes, Kueue, Volcano, YuniKorn and KAI

Distributed training needs all of its workers at once. If the default scheduler places seven of eight pods and the last one waits, seven GPUs sit blocked. Gang scheduling fixes this with an all-or-nothing rule. Kubernetes now has this natively: its documentation says that if the cluster cannot fit the whole group, or the defined minimum (minCount), none of the pods are bound. It is listed as beta since Kubernetes v1.37 and disabled by default, requires the GenericWorkload feature gate, and depends on the PodGroup API. The hierarchical CompositePodGroup extension is listed as alpha. Check your cluster version and gates before relying on it.

Until that is switched on in your cluster, you pick a queue or scheduler. They differ in how deeply they replace kube-scheduler.

A practical way to choose: if you want to keep the default scheduler and add quotas, queues and admission control, Kueue is built for that. If you want a full batch scheduler with its own plugins, look at Volcano, YuniKorn or KAI Scheduler. For a ranked comparison of the tooling, see the best GPU orchestration tools for Kubernetes. Whatever you pick, test it against your own training framework, because each project lists its own supported integrations.

Placement: labels, taints, affinity and topology

Most GPU scheduling problems are placement problems. Kubernetes documents the standard answer in its Taints and Tolerations page, under the heading for nodes with special hardware. When only a few nodes have GPUs, you want to keep pods that do not need them off those nodes so room remains for pods that do. The page recommends representing the hardware as an extended resource, tainting the GPU nodes with the extended resource name, and running the ExtendedResourceToleration admission controller. A pod that requests the GPU resource then gets the toleration added automatically, and everything else is repelled.

GPU nodes: Karpenter and the Cluster Autoscaler

GPUs are expensive to leave idle, so node supply matters as much as pod placement. Karpenter's documentation says it watches for pods that the Kubernetes scheduler has marked unschedulable, evaluates their constraints (resource requests, node selectors, affinities, tolerations and topology spread), provisions nodes that meet them, and removes nodes that are no longer needed. A NodePool can set taints, labels, requirements such as instance types and capacity type, and limits, so a dedicated GPU NodePool with a taint pairs naturally with the toleration pattern above.

The Cluster Autoscaler has GPU-aware settings in its FAQ. The scale-down-gpu-utilization-threshold flag divides the GPU requests of pods on a node by the node's allocatable GPUs, and below the threshold (default 0.5) the node can be considered for scale-down; for accelerator nodes only GPU utilization is considered, not CPU or memory. The same FAQ says its gpu-total flag, which caps the number of GPUs in the cluster, currently works only on GKE. It also says a node group can be scaled to zero.

Queues and autoscalers connect. Kueue's docs say autoscaling is the Cluster Autoscaler's job and that Kueue integrates with its provisioningRequest through admission checks, so a job can wait for capacity before any of its pods are created.

A sensible order of operations

Scheduling is one part of running AI on Kubernetes. For the wider picture see the role of Kubernetes in AI infrastructure and the infrastructure needed to run AI agents in production.

Questions people ask

How do I request a GPU for a pod in Kubernetes?

After the vendor device plugin is installed, request the custom resource, such as nvidia.com/gpu, in the container's limits. Kubernetes uses a limit as the request by default. If you set both, they must be equal, and you cannot set a GPU request without a limit.

Can multiple pods share one GPU?

Not with a plain request, because extended resources are whole integers that cannot be overcommitted. With the NVIDIA GPU Operator you can use time-slicing (no memory or fault isolation) or MIG partitions (hardware isolation on supported GPUs), and you can combine the two.

What is Dynamic Resource Allocation and is it production ready?

DRA lets pods claim devices through ResourceClaims and device classes, with CEL filtering and sharing. The Kubernetes docs list it as stable since Kubernetes v1.35. One documented limit is that the scheduler does not support preemption for DRA resources, and you still need a DRA driver for your specific hardware.

Does Kubernetes support gang scheduling on its own?

There is a built-in gang scheduling feature, but the Kubernetes docs list it as beta since Kubernetes v1.37 and disabled by default, behind the GenericWorkload feature gate. Kueue, Volcano, Apache YuniKorn and KAI Scheduler provide all-or-nothing scheduling as add-ons.

Is the KAI Scheduler an NVIDIA project?

NVIDIA's technical blog says NVIDIA open-sourced the scheduler, originally developed within the Run:ai platform, under the Apache 2.0 license on April 1, 2025, and that it also continues to ship as part of NVIDIA Run:ai. The public repository is under the kai-scheduler organization on GitHub.

Do I still need a separate autoscaler for GPU nodes?

A scheduler or queue decides where and when pods run; adding and removing nodes is the autoscaler's job. Karpenter and the Cluster Autoscaler both react to unschedulable pods, and Kueue can hand off to the Cluster Autoscaler through provisioning requests.

Sources

Figures and statements were read from the linked official pages on October 31, 2026. Feature states change between Kubernetes releases, so confirm the status of DRA, gang scheduling and each add-on against the documentation for the version you run. Vendor claims are the vendors' own. This page is not an engineering guarantee for your cluster.

Top photo: Lawrence Systems / CC BY 3.0 via Wikimedia Commons

Share this page