Topology-aware scheduling with PodGroup and DRA

Topology-aware scheduling with PodGroup and DRA

Kubernetes PodGroup scheduling now treats the group as runtime state rather than a property tucked inside a template. The static Workload object holds the scheduling template, while the PodGroup carries the live scheduling policy and status. Pods link to the runtime group through spec.schedulingGroup, which is a much cleaner boundary than the older workload reference path.

That split matters because the scheduler no longer has to infer group intent from the template object. It can read the PodGroup directly, sort the queued members, and run one decision against one cluster snapshot. That avoids the usual mess where one Pod gets a node and the next one turns the whole placement into dead code.

Keep the runtime group separate from the static Workload template

The Workload template describes the shape of the group. The PodGroup is the thing the scheduler acts on. Mixing those two roles would make every retry awkward, since the scheduler needs current queue state, current minCount, and current status, not just a static template from a controller.

That separation also gives controllers a sane hand-off point. The Job controller creates the workload object, while the PodGroup becomes the active unit of scheduling. If a new Pod turns up later, it joins the live group cycle rather than mutating the template logic. The template stays boring, which is usually what you want from infrastructure.

Follow the queue, snapshot, and minCount checks in kube-scheduler

The scheduler keeps queued group Pods together and evaluates them from a single cluster snapshot. That is the key bit. If the scheduler used separate snapshots or stepped through the Pods one by one, a gang could partly reserve resources and then deadlock itself on the next pass.

minCount is the hard gate. A gang with minCount: 4 only binds if four Pods can run at once. If the cluster cannot place enough of them, the whole PodGroup goes back to the queue and tries again after backoff. The scheduler does not unassign or evict already placed Pods just because the remaining group fails later. That leaves a clean but occasionally awkward edge case: a partially satisfied group can sit there looking close, while still being unschedulable as a whole.

Where topology and Dynamic Resource Allocation change the placement model

Topology-aware scheduling makes the group viable on real nodes, not just in a tidy theoretical cluster. If the group needs a certain spread, or needs to avoid placing all members in one place, the scheduler has to test those constraints against the whole gang, not each Pod in isolation. That reduces the chance of landing on a node set that looks valid until the last member arrives and ruins the pattern.

Dynamic Resource Allocation changes the same story in a quieter way. A PodGroup can carry ResourceClaimTemplate support so claim creation lines up with group scheduling. That matters when the Pod needs more than a CPU and a memory request. The scheduler has to see the claims as part of the placement cycle, or the gang can bind to nodes that cannot satisfy the attached resource path.

Use topology-aware scheduling to keep the group viable on real nodes

Topology-aware scheduling is only useful if it matches the actual cluster layout. A valid gang placement on paper can still fail if the nodes that satisfy one part of the group break the next part. That is a normal failure mode for heterogeneous groups and for groups with inter-Pod dependencies. The scheduler can do the right thing and still have no legal answer.

The practical control is simple: treat node shape, locality, and spread as part of gang viability, not as a bonus check after placement. Once the group is bound, the scheduler is not going back to tidy up the mess for you.

Wire ResourceClaimTemplate into PodGroup so DRA fits the same cycle

Resource claims need to move with the PodGroup, not trail behind it. If a gang depends on DRA, the claim template needs to belong to the same scheduling cycle so the scheduler sees the claim pressure while it decides placement. Otherwise the group may look schedulable until the resource layer says no.

This is the sort of integration that saves one kind of failure and creates another if it is half-finished. Claims that arrive outside the gang cycle can leave the group stuck in queue churn, with no obvious node fault to point at. The scheduler is not being difficult on purpose. It is just refusing to pretend that missing claims do not matter.

Watch workload-aware preemption and Job controller hand-off at the edges

Workload-aware preemption sits at the boundary between “almost fits” and “not happening”. If a gang cannot be placed, preemption may decide whether there is a legal path in at all. The limit is that preemption still has to respect the group model. It cannot quietly fix a bad gang shape by tearing apart already placed Pods in a way that breaks the whole set.

Job controller hand-off matters for the same reason. The controller defines the workload, but the runtime PodGroup is what the scheduler uses. If that hand-off is messy, the result is a group that looks managed while behaving like two separate systems. That tends to end badly, usually at the least convenient time.

Related posts

Weekly Tech Digest | 06 Jul 2026

Stay updated with the latest in tech! This digest covers AI ethics, auto industry shifts, and the impact of politics on technology, exploring today's pressing issues.

wolfCOSE zero-allocation parsing in embedded C

wolfCOSE looks sensible only if you care about what your firmware actually has to carry. I like that, because on small targets the wrong crypto feature can cost more than the message itself, and there...

restic | v0.19.1

restic v0 19 1: safer FUSE mounts and mountpoint checks, robust backup source and exclude handling, clearer CLI JSON output, Windows SFTP deletion fixes