Skip to content

Priority classes

Every Pod on Kestrel must set priorityClassName to one of the three allowlisted uber-user-* classes. Kestrel allows three priority classes: uber-user-significant, uber-user-preempt-medium, and 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. 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.
  • Preemption respects the value ordering strictly: preempt-high (2000) can preempt preempt-medium (1000) and significant (500); preempt-medium can preempt only significant; significant preempts nothing.

Use uber-user-preempt-high for production long-running services — it has the highest user-tier priority and will preempt lower-priority peers to stay scheduled under cluster pressure.

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