Imagine you're at an airport, and there's a long queue at security. But suddenly, a VIP with a priority pass walks straight through a special lane, skipping the entire line. Kubernetes has a similar system for pods—it’s called PriorityClass! 🚀
In this article, we’ll break down what PriorityClass is, why it matters, and when you should use it to keep your Kubernetes workloads running smoothly.
What is PriorityClass?
PriorityClass is a Kubernetes feature that assigns priority levels to different pods. It helps the scheduler decide which pods should be scheduled first and which ones should be evicted when resources are limited.
Think of it as a VIP pass for workloads—critical pods get scheduled first, while less important ones may have to wait or even be evicted if resources run out.
How it Works
Each PriorityClass has a numeric value.
The higher the value, the more important the pod is.
If the cluster runs out of resources, lower-priority pods may get evicted to make room for higher-priority ones.
You can also set preemption policies to decide whether a pod should evict lower-priority ones or not.
Why is PriorityClass Helpful?
Kubernetes works best when resources are efficiently managed. PriorityClass helps by**:**
✅ Ensuring critical workloads always run (e.g., system monitoring, security agents)
✅ Preventing resource starvation for high-importance services
✅ Handling overload situations by gracefully evicting low-priority pods
✅ Improving cluster resilience by making sure essential services don’t get disrupted
Without PriorityClass, all pods are treated equally, which can lead to important services getting stuck in a pending state while non-essential ones consume resources.
When Should You Use PriorityClass?
Here are some real-world scenarios where PriorityClass is a lifesaver:
🔹 Critical System Services : Monitoring, logging, and security services should always be running. Assigning them a high-priority class ensures they don’t get evicted when the cluster is under pressure.
🔹 Multi-Tenant Clusters : If multiple teams share a Kubernetes cluster, you might want to prioritize production workloads over development or testing environments.
🔹 Failover & Disaster Recovery : During failovers, critical services need to come back online ASAP. Using PriorityClass ensures your key services recover before anything else.
How to Implement PriorityClass in Kubernetes ?
Below workflow best explains the working of Priorityclass :-
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
preemptionPolicy: PreemptLowerPriority
globalDefault: false
description: "High priority class for critical services"
value: 1000000
→ Higher value means higher priority.preemptionPolicy: PreemptLowerPriority
→ This pod can evict lower-priority pods if resources are tight.globalDefault: false
→ This is not the default priority (you must explicitly assign it to pods).
apiVersion: v1
kind: Pod
metadata:
name: low-priority-pod
spec:
containers:
- name: apache
image: apache2
Assigning PriorityClass to a Pod
apiVersion: v1
kind: Pod
metadata:
name: high-priority-pod
spec:
priorityClassName: high-priority
containers:
- name: nginx
image: nginx
Now, whenever critical-app is deployed, Kubernetes will give it priority over lower-priority pods.
Important Things to Note
To mark a Pod as critical, set priorityClassName for that Pod to
system-cluster-critical
orsystem-node-critical
.system-node-critical
is the highest available priority, even higher thansystem-cluster-critical
All the control-plane components are marked with the
system-node-critical
as you can see below :-
nodeName: kind-control-plane
preemptionPolicy: PreemptLowerPriority
priority: 2000001000
priorityClassName: system-node-critical
preemptionPolicy
field in a PriorityClass resource can take two possible values:PreemptLowerPriority
(default) : This allows preemption, meaning that if a pod using this priority class is scheduled but there aren't enough resources, it can evict (preempt) lower-priority pods to make space.Never
: This disables preemption, meaning that if there aren't enough resources, the pod will remain in a pending state instead of evicting lower-priority pods.
A static pod marked as critical can't be evicted. However, non-static pods marked as critical are always rescheduled.