Kubernetes 1.37 promotes gang scheduling to a first-class Workload API in beta
Maya Okonkwo
Kubernetes 1.37 promotes three pieces of the Workload-Aware Scheduling (WAS) effort to beta, giving batch and ML pipelines a native, all-or-nothing scheduling primitive that until now lived in third-party operators. Per the release blog, the Workload and PodGroup APIs, Workload-Aware Preemption (WAP), and shared Dynamic Resource Allocation (DRA) ResourceClaims for PodGroups all graduate together.
Gang scheduling itself is not new. Volcano, YuniKorn and Kueue have carried the pattern in operator form for years, each with its own PodGroup shape and its own answers on preemption and quota. The v1.37 beta is the same idea standardised into an API surface that the in-tree scheduler and the built-in Job controller can consume directly, without an out-of-tree scheduler plugin in the loop.
What actually graduates
Three things move from alpha to beta together, per the Kubernetes post:
- The Workload and PodGroup APIs, the objects that let the scheduler treat a set of pods as a unit and refuse to place any of them unless all of them can be placed.
- Workload-Aware Preemption, the eviction logic that respects those grouping semantics instead of pulling one pod out of a gang and stranding the rest.
- Shared DRA ResourceClaims for PodGroups, so a group of pods that needs one GPU allocation or one network-fabric slice can share the claim rather than each pod holding its own.
The Job controller is updated in the same release to consume the expanded APIs. That is the piece that matters for anyone who already runs batch or distributed training as Jobs. The blog lists advanced scheduling policies, more flexible disruption modes, and topology-aware placement as the new Job-level surface.
Two enablers ship alongside. A workloadbuilder Go library and a set of controller-integration APIs aim at operator authors who want to plug their own controllers into WAS without reimplementing the primitives from scratch.
Where a platform team feels it
Anywhere a pipeline schedules a distributed training run, a Spark job, or a large parallelised test matrix onto a shared cluster. The failure mode WAS is targeting is the one platform teams have been papering over with quotas and priority classes: half a training job's pods land, the other half wait behind a preemption, and the scheduled half sits burning GPU hours while the workload cannot actually start. All-or-nothing scheduling lines the accounting up with what the job needed.
A related win is preemption you can reason about in a runbook. Under classic priority-based preemption, evicting one pod of a training gang effectively stalled the whole gang until the missing pod was rescheduled. WAP evicts at the workload boundary. Easier to explain to a data-science team asking why their run died, easier to page on.
The alpha piece to note but not depend on
Landing in alpha next to the beta graduations is a CompositePodGroup API, which layers multi-level topology constraints onto the PodGroup shape. The blog frames it around hierarchical workloads such as JobSet and LeaderWorkerSet, where a single logical training run is a group of groups: leaders, followers, and a specific placement relationship between them.
Alpha means feature-gated off by default. Do not build a production dependency on CompositePodGroup during the 1.37 cycle. The shape may shift before beta.
Adoption and rollback
The three beta pieces are enabled by default on upgrade. If a platform team runs a rule of "GA only in production", that rule still keeps WAS out until a later release. If the rule is "beta and above", the operational question is what your existing batch stack does when the built-in scheduler starts honouring PodGroup objects it did not previously understand. Volcano, Kueue and their peers each need their own audit against the native semantics before you flip a workload from operator-managed to controller-native, and the audit is the part that will surprise you if you skip it.
Rolling back is a feature-gate disable on kube-apiserver, kube-controller-manager and the scheduler, followed by a restart. There is no data migration to unwind: a Workload object is CRD-shaped, and an older scheduler ignores it. Walk that path on a staging cluster before the upgrade, not after a bad preemption at 3am.
Source: Kubernetes blog (kubernetes.io)