Skip to content

Priority classes

If a Pod on Kestrel sets priorityClassName, it must be one of the three allowlisted uber-user-* classes: uber-user-significant, uber-user-preempt-medium, or uber-user-preempt-high. Any other value — including the uber-infra-* classes reserved for platform workloads and the cluster-level uber-user-important class, which is not in the tenant allowlist — is rejected at admission. A Pod that omits priorityClassName is admitted at priority 0, below every class, so always set one explicitly. See Priority class allowlist for the Capsule enforcement details.

ClassValuePreemption policyCan preempt others?Can be preempted?
uber-user-preempt-high2000PreemptLowerPriorityYes — any lower-priority PodOnly by uber-infra-* (platform only)
uber-user-preempt-medium1000PreemptLowerPriorityYes — significant-class PodsBy preempt-high and uber-infra-*
uber-user-significant500NeverNoBy any preempt-* class and uber-infra-*

Higher value = higher scheduling priority. A Pod can only preempt Pods with a lower priority value — a lower-value Pod can never evict a higher-value one. The preempt-* classes use the PreemptLowerPriority policy, so when the cluster is short on resources they evict lower-priority Pods to make room. uber-user-significant uses the Never policy: it never evicts anyone and simply waits for capacity.

Preemption only kicks in when the cluster is full and a Pod cannot be scheduled:

  • A uber-user-preempt-* Pod that cannot fit will evict lower-priority Pods to free capacity, lowest priority first.
  • A uber-user-significant Pod (policy Never) never evicts anyone — when the cluster is full it sits Pending until capacity frees up.

Use for: workloads you can afford to lose — dev pods, scratch experiments, opportunistic batch jobs, and nightly CronJobs with weak SLAs.

Why: lowest user-tier priority. These pods are the first to be evicted when a preempt-* pod needs space. Non-preempting — they never evict anyone else. This is the right default for anything ephemeral or retry-tolerant.

The first-deployment walkthrough uses uber-user-significant because the demo workload is intentionally expendable.

Use for: deadline-bound batch jobs — research runs that need to complete now and are worth taking capacity from significant peers.

Why: preempts significant-class pods to make room. Does not preempt preempt-high. Use when you have a real deadline and are willing to displace opportunistic workloads.

Use for: production long-running services and critical interactive workloads — Deployments backing tenant-facing Ingress routes (the /running/workloads/long-running-service recommended variant), live analysis sessions, or time-sensitive dev pods where downtime costs more than the blast radius.

Why: highest user-tier priority. Preempts everything below it in the user tier (preempt-medium and significant) to stay scheduled under cluster pressure. Use sparingly — this is the highest blast radius among the three classes. If everyone uses preempt-high, nobody benefits from preemption because peers cancel each other out.

The uber-infra-* classes exist at values around 900,000,000 — effectively infinitely higher than any user class. They are reserved for RCS-operated platform workloads (monitoring agents, Capsule controllers, etc.). Tenants cannot use them; Capsule admission rejects the attempt.

User preempt-* pods cannot evict infra pods. They can only evict each other or significant-class user pods.

Workload shapeRecommended classWhy
Production Deployment (Ingress-backed)uber-user-preempt-highHighest user-tier priority — stays scheduled under pressure
Critical live analysis sessionuber-user-preempt-highWorth the blast radius — use sparingly
Deadline-bound research Jobuber-user-preempt-mediumWilling to preempt opportunistic peers
Dev pod / scratch experimentuber-user-significantExpendable, eviction-tolerant
Nightly CronJob (weak SLA)uber-user-significantRe-runs tomorrow if preempted