FR
live

Kueue separates admission from scheduling so a Pending Job finally explains itself

On October 14, 2026, the Kueue maintainers published a Headlamp-first guide to tracing Kubernetes Job admission, now readable in the UI through an alpha plugin. Before asking why your Pods are Pending, the first question becomes: has Kueue admitted the Workload?

A row of identical industrial turnstiles in a dark corridor, a single one lit by a small amber lamp.

October 14, 2026. Utkarsh Raj (an LFX mentee, CNCF), René Dudfield (Microsoft) and Kevin Hannon (Red Hat) publish a guide on the official Kubernetes blog for tracing Job admission with the Kueue plugin for Headlamp. 0.1.0-alpha. That is the plugin version — read-only — that surfaces the answer in the UI instead of reconstructing it from kubectl. Why it matters: on a cluster managed by Kueue, a Job that stays Pending is not a scheduler problem — it is first an admission question, and most teams are looking in the wrong place.

Kueue adds an admission layer above the scheduler

The confusion comes from a split that Kueue makes explicit. Kueue and the kube-scheduler answer different questions. Kueue admission asks: should this Workload start now, given queue policy, quota, ResourceFlavors, admission checks and the other waiting Workloads? Pod scheduling asks: once the Workload is admitted and the Job resumes, which nodes can run its Pods?

That boundary changes the entire investigation. If the Workload is not admitted, you stay in the Kueue section of Headlamp. If it is admitted but its Pods are still Pending, you move to the standard Job and Pod views to inspect scheduler events. The article reframes the question: not “Why is the Pod pending?” but first “Has Kueue admitted the Workload?”

Kueue materializes that step in a Workload object, which represents a Job’s resource request and admission state. Without it, a suspended Job has no application logs and sometimes no Pod to inspect at all — hence the feeling of a black hole.

The Headlamp-first path in five steps

The guide insists on starting from the Workload, not from a shell. The plugin exposes read-only views of the v1beta2 resources: Cohorts, ClusterQueues, LocalQueues, ResourceFlavors and Workloads.

Step one is the Workloads list, which already gives a useful first scan: LocalQueue priority, active state, admitted state, completion state, and a readable status such as Admitted, Finished or Inadmissible. Step two is the conditions, and the two that matter for admission are QuotaReserved and Admitted. An Admitted=True means Kueue admitted the Workload — the Job can resume, and any remaining Pending Pods belong to the scheduling branch. A QuotaReserved=False with reason Pending means quota was not reserved, and the condition message explains what blocked it.

Step three is comparing the Workload’s request against its assignment. The classic trap: a Job with parallelism: 3 and one CPU per Pod actually asks Kueue for three CPUs in total — reading a single Pod template underestimates the request. Step four is following the linked LocalQueue: it is the namespace-level entry point that connects a Workload to a cluster-scoped ClusterQueue, and it answers two questions — did the Job enter the queue you expected, and is it the only one waiting there?

Step five is inspecting the ClusterQueue capacity. The article’s example is clean: the ClusterQueue offers a nominal quota of two CPUs and two Pod slots, and the Workload asks for three of each. The condition message and the ClusterQueue page now tell the same story: the Workload does not fit, so Kueue leaves the Job suspended. That is an admission-capacity problem — not evidence that the kube-scheduler is failing.

Why batch and AI make this layer necessary

Kueue is not a marginal project: it is a CNCF project dedicated to batch scheduling, and it answers a problem the kube-scheduler was never designed to solve. The scheduler places Pods on nodes; it does not decide whether a job is allowed to start, or in what order queues should drain when demand exceeds capacity. That is the difference between “where” and “whether,” and it becomes critical the moment a cluster is shared between teams.

The AI context makes the subject urgent. Model training and fine-tuning are batch workloads by nature: hundreds of GPUs, long queues, fair-sharing between teams, compliance admission checks. Without an admission layer, a shared cluster hands resources to whoever arrives first, and a single team can monopolize capacity for hours. Kueue turns that implicit negotiation into an explicit policy — and, with the Headlamp plugin, into an observable path.

The plugin also fits an already busy Headlamp ecosystem: plugins exist for Kubeflow, Volcano, Knative and Cluster API. Each applies the same recipe — pulling a controller’s state out of its YAML and making it readable in the UI. The guide’s author list is a final signal: an LFX mentee from the CNCF, a Microsoft engineer and a Red Hat engineer. Kueue is not a single vendor’s project, and that breadth of governance protects a layer that has become, in practice, as strategic as the scheduler itself.

What the 0.1.0-alpha plugin does not do yet

The alpha release is deliberately bounded: read-only, no create, edit, stop or resume actions. Owner references display as Kind/name text but are not yet clickable. Headlamp still provides its standard YAML and resource actions where your permissions allow them, but the plugin’s promise is elsewhere: making the admission path visible, not replacing kubectl.

The command line still has a place for reproducing the example or automating a diagnosis. Tellingly, the guide keeps it in a short optional section — the article fully commits to its UI-first posture.

bash
# Read a Workload's admission state without the UI
kubectl get workloads -n data-team
kubectl get workload train-october -n data-team \
  -o jsonpath='{range .status.conditions[*]}{.type}={.status} ({.reason}) {.message}{"\n"}{end}'

For teams already running Kueue in production, the payoff is immediate but measured: the plugin does not yet replace the kubectl reflexes of advanced debugging, and v0.1.0-alpha remains a showcase of what admission looks like when it is visible. The path the guide recommends still holds for everyone — start from the Workload, read the Admitted condition, then climb the LocalQueue → ClusterQueue → ResourceFlavor chain. It is an order of investigation, and it takes five minutes to learn, even without the UI.

The two-phase model also changes on-call triage. A ticket that says “our training Job has been Pending for an hour” no longer starts with kubectl describe pod; it starts by reading the Workload’s Admitted condition. Teams that adopt Kueue find this single reordering eliminates most “it is pending but nobody knows why” incidents, because the answer is usually printed in a condition message rather than buried in a scheduler event.

Verdict

The verdict depends on how you use your cluster. If you run a multi-team cluster with quotas, fair-sharing or batch queues, install Kueue and its Headlamp plugin: the cost is low — the alpha is read-only, so there is no risk of an accidental action — and the payoff is immediate, because admission becomes a readable path instead of a state to reconstruct from YAML. If you run a single-team cluster with no quotas or queues, Kueue adds a layer you do not need to manage, and the guide is still worth reading to understand where your cluster will land as it grows. Either way, remember the reflex: a Pending Job under Kueue is first an admission question, and only then a scheduler question.

References

The cyber brief, every Tuesday

The flaws that matter and the patches to apply, in a ten-minute read.

No spam. One-click unsubscribe.
read next

On the same topic

Cloudflare open-sources Void, a self-hosted platform to govern employees’ vibe-coded apps

On October 16, 2026, four months after buying VoidZero, Cloudflare releases Void as open source — a platform companies can self-host to deploy and govern the internal applications employees build with AI. If your staff already vibe-codes its tools, Void gives those apps a home — but not yet a mandatory security review.

GitLab patches a CVSS 10 RCE triggered by a crafted regex in a CI/CD pipeline

On 12 October 2026, GitLab shipped 19.4.2, 19.3.5 and 19.2.8 to fix CVE-2026-97229, an integer overflow in the CI/CD regular expression compiler that allows unauthenticated remote code execution. If you self-host GitLab, upgrade now and treat your .gitlab-ci.yml files as code, not configuration.

← Back to the feed

Type at least two characters.

↑ ↓ navigate ↵ open esc dismiss