mrkeyoor.com_
Wed 23 Sept 00:36 UTC
Automationevaluationupdated 26 Aug 2026

kueue review

Kueue is a Kubernetes controller that decides when batch, AI, and other resource-heavy jobs may start. It adds job-level queues, quotas, borrowing, fair sharing, and preemption while leaving pod placement to the normal Kubernetes scheduler.

+14stars / 7d
Verdict

Our Kueue build passed in 263 seconds, but its 614-second test run ended with 4 of 8 packages failing after a performance checker received an empty summary path. The project remains the strongest first trial for Kubernetes-native job admission when you want to keep existing job APIs and the default scheduler. Adopt it only with a platform owner for quota policy, integrations, failure drills, and upgrades; a lightly used cluster does not need this machinery.

We ran it

Lab card: what happened when we ran kueueScreenshot of kueue (kueue.sigs.k8s.io)
Install✓ · 92s0 packages
Build✓ · 263s
Tests✗ · 614s4 passed · 4 failed of 8 (go test)
Repo3462 files~475,290 lines of source · 34.3 MB · 5 CI workflows · Dockerfile · tests dir

Answers from our run

Does kueue build from source?

Dependencies installed in 92 seconds (0 packages), and the build succeeded in 263 seconds. We cloned commit ff69552 into a clean Debian container with 3 CPUs and no project-specific setup.

Do kueue's tests pass?

Not all of them: 4 of 8 passed and 4 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use kueue?

Clusters older than Kubernetes 1.34: the v0.19 README says only 1.34 or newer is supported and tested.

What are the alternatives to kueue?

Volcano, Apache YuniKorn Kubernetes Shim, Flux Operator. Our Kueue build passed in 263 seconds, but its 614-second test run ended with 4 of 8 packages failing after a performance checker received an empty summary path.

Setup3/5Controller install is short; queue policy and integrations are not
Docs5/5Concepts, integrations, metrics, tests, and upgrades are detailed
Community5/52,906 stars with same-day development across a large queue
Maturity4/5v1beta2 and production adopters, with advanced paths still moving

Who it’s for

Platform teams sharing costly GPUs, accelerators, or large CPU pools across tenants.
Kubernetes operators who need job priorities, quota borrowing, fair sharing, and preemption.
Organizations using Kubernetes Jobs, Kubeflow training jobs, Ray, JobSet, or pod groups.
Multi-cluster teams prepared to operate manager and worker clusters with consistent resources.

Who it’s NOT for

Clusters older than Kubernetes 1.34: the v0.19 README says only 1.34 or newer is supported and tested.
Teams seeking a replacement for pod placement: Kueue admits jobs, then the Kubernetes scheduler places pods.
Users needing a workflow or DAG engine: workflow-framework integration is listed as a long-term aspiration.
Operators who cannot rehearse quota and eviction failures: issue 14811 reports a v0.19.0 JobSet retaining GPU quota after its pods were removed.
Kubeflow Trainer v2.1 users: issue 14819 says Kueue targets the v2.2 or newer TrainJob API shape.
Teams requiring a stable v1 API today: the project exposes v1beta2.

Setup reality

Our Go install succeeded in 92 seconds and installed 0 packages; the build succeeded in 263 seconds. Tests ran for 614 seconds and reported 4 passed and 4 failed out of 8. The log tail showed the scheduler performance checker could not open a summary because its path was empty.

Installing v0.19.2 is one server-side kubectl apply, but useful operation needs Kubernetes 1.34 or newer plus LocalQueues, ClusterQueues, ResourceFlavors, quota, borrowing, priority, and preemption policy.

MultiKueue adds worker credentials, matching APIs and resources, and failure testing across clusters. Upgrades require reading the .0 notes for every minor crossed, and advanced integrations have their own feature gates and version constraints.

Kueue admits whole jobs and leaves pod placement to Kubernetes

Kueue sits above the default scheduler. It decides whether a workload may start and how much quota it reserves; Kubernetes still decides which nodes run the pods. This separation lets a platform team stop several large training jobs from flooding a shared cluster without replacing the scheduler that already understands node constraints. It also means Kueue will not fix poor bin packing or an unsuitable pod-scheduling policy.

A namespace-scoped LocalQueue is the submission point for a team. It points to a cluster-scoped ClusterQueue that owns quota and admission policy. ResourceFlavors distinguish capacity such as GPU types, architectures, or spot nodes. Cohorts allow queues to borrow unused quota from one another. Priority, fair sharing, queue order, and preemption decide who moves first once demand exceeds capacity.

This structure pays off when capacity is contested and jobs can wait. A shared cluster where one training run can consume every accelerator is a natural fit. A small cluster with ample headroom gains a second control plane, custom resources, webhooks, and policies without much scheduling benefit.

Existing Job, Ray, Kubeflow, and JobSet APIs stay usable

Kueue integrates with Kubernetes Jobs, Kubeflow training jobs, RayJob, RayCluster, JobSet, plain pods, and pod groups. It can also manage serving resources such as Deployments and StatefulSets. Partial admission reduces eligible job parallelism to fit quota, while dynamic reclaim releases quota as pods finish. AdmissionChecks allow another controller to influence whether a workload can proceed.

WaitForPodsReady supplies an all-or-nothing guard: an admitted workload that cannot make its pods ready within the configured window may be evicted so capacity can serve another job. Topology-aware scheduling can account for racks or other network and failure domains. These features solve real problems, but enabling fair sharing, topology, dynamic devices, elastic workloads, and multi-cluster dispatch together creates many interacting states.

What happened when we ran it

Our sandbox install succeeded in 92 seconds and installed 0 packages. The build completed in 263 seconds. commit ff69552 contained 3,462 files, roughly 475,290 lines of source, and 34.3 MB before build output. The checkout had 5 CI workflow files, a Dockerfile, and a tests directory. We used an unprivileged golang:1.24-bookworm container with 3 CPUs and 8 GB of RAM.

The test command ran for 614 seconds and exited with code 1. The supplied Go package summary counted 4 passed and 4 failed out of 8. In the log tail, test/performance/scheduler/checker failed because checker_test.go tried to open a summary file with an empty path and received no such file or directory. Several adjacent performance runner packages passed or had no test files.

That output does not prove the controller's unit or scheduling logic failed, and it does not name the other 3 package failures in the tail we received. The narrow conclusion is that the complete command did not pass in our fresh container and at least one performance test expected a summary input that was absent. Operators should rely on the project's published test grids for upstream coverage, while source contributors reproduce the exact target in their own toolchain.

Production setup is quota design, not the manifest command

The README's v0.19.2 install is one server-side kubectl apply, and the controller runs in kueue-system. Official support begins at Kubernetes 1.34. A minimal example creates enough queue resources to submit a Job. That proves admission, but it does not determine sensible limits for a real shared cluster.

Administrators must choose nominal quota, borrowing limits, resource flavors, priorities, queue strategy, preemption policy, and behavior for workloads with no queue. Monitoring should cover pending age, evictions, admission-check failures, quota use, and pods that miss readiness deadlines. Kueue supplies Prometheus metrics and an on-demand view of pending workloads, giving operators the data needed to explain why a job is waiting.

Issue 14811 shows the cost of a bad state. A reporter running v0.19.0 described a JobSet eviction after a readiness timeout where pods were removed and the JobSet suspended, yet admission and GPU quota remained reserved. The report says the workload did not self-heal. It is one environment-specific report, but teams using JobSet and waitForPodsReady should add this recovery path to their drills.

MultiKueue adds capacity reach and another failure domain

MultiKueue dispatches admitted jobs from a manager cluster to worker clusters that have capacity. This can support on-premises-first placement with cloud spillover, or several specialized accelerator pools. It requires Kueue and compatible workload APIs on the participating clusters, credentials for each worker, corresponding queues and flavors, and monitoring that can follow a job across boundaries.

A multi-cluster proof should cover delayed watches, stale credentials, manager restarts, worker loss, duplicated objects, and status lag. The v0.19.2 release itself contains MultiKueue fixes, including one for watch establishment that could otherwise block on a delayed response. Read the current limitations before treating it as transparent federation.

Kubeflow users also need version checks. Issue 14819 says Kueue targets the TrainJob API shape in Kubeflow Trainer v2.2 and newer. With a v2.1 CRD, Kueue can start and fail later while applying its expected runtime patch. The open request asks for setup-time validation and explicit documentation of v2.2.0 as the minimum.

The active v1beta2 project is ready for owned production use

GitHub showed 2,906 stars and 721 combined open issues and pull requests. The repository was pushed on August 26, 2026. Version 0.19.2 was published August 20, and its notes tell operators to read every intervening minor .0 release before upgrading. The API is v1beta2, with v1 graduation listed as an aspiration rather than a delivered state.

The README links unit, integration, end-to-end, topology, MultiKueue, and performance test grids and lists production adopters. That is a mature operating posture, even though our 4-of-8 package result was not clean. Kueue is a good choice when scarce shared capacity justifies explicit admission policy. Its value comes from a platform team owning those rules and testing the ugly paths, not from applying the manifest and assuming queueing is solved.

Alternatives

ProjectWhat it isPick it when
Volcano gh↗A Kubernetes batch platform with its own scheduler, queues, gang scheduling, and job controller.pick this instead when admission and pod scheduling should live in one batch system.
Apache YuniKorn Kubernetes ShimThe Kubernetes integration for Apache YuniKorn's application-aware scheduler.pick this instead when hierarchical queues and direct scheduler control fit your organization better.
Flux OperatorA Kubernetes operator for running workloads under the Flux HPC scheduler.pick this instead when nested HPC scheduling is the main requirement.

What people are saying

  1. [github-trending] kubernetes-sigs/kueue

Sources

  1. Kueue README
  2. Kueue repository
  3. Kueue v0.19.2 release
  4. Issue 14811: quota retained after recovery eviction
  5. Issue 14819: Kubeflow Trainer API compatibility

More automation reviews

linkedin-skills · ax · newsjack · easyeda-agent · dagger · youtube-dl-gui · the whole board →