Quality of Service (QoS) Classes
Overview
Kubernetes assigns QoS classes to pods based on resource requests/limits. QoS determines eviction priority under node pressure.
QoS Classes
| Class | Condition | Eviction Priority |
|---|---|---|
| Guaranteed | All containers have requests = limits for CPU & memory | Last (highest priority) |
| Burstable | At least one container has request < limit | Middle |
| BestEffort | No requests or limits set | First (lowest priority) |
Guaranteed QoS
Every container must have identical requests and limits:
yaml
apiVersion: v1
kind: Pod
metadata:
name: guaranteed-pod
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "100m" # Must equal request
memory: "128Mi" # Must equal requestBurstable QoS
At least one container has resource requests set, but not equal to limits:
yaml
apiVersion: v1
kind: Pod
metadata:
name: burstable-pod
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m" # Different from request
memory: "256Mi" # Different from requestBestEffort QoS
No resource requests or limits:
yaml
apiVersion: v1
kind: Pod
metadata:
name: besteffort-pod
spec:
containers:
- name: app
image: nginx
# No resources specifiedCheck QoS Class
bash
kubectl get pod <pod-name> -o jsonpath='{.status.qosClass}'
# Or describe
kubectl describe pod <pod-name> | grep "QoS Class"Eviction Order
When node is under memory pressure:
- BestEffort pods evicted first
- Burstable pods evicted next (based on usage vs request)
- Guaranteed pods evicted last
CKA Tip
To get Guaranteed QoS:
- Set both requests AND limits
- Make them equal for BOTH cpu AND memory
- Do this for ALL containers in the pod