> For the complete documentation index, see [llms.txt](https://bagus-cahyono.gitbook.io/programming-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bagus-cahyono.gitbook.io/programming-notes/cka/06_pod_qos_class.md).

# Pod & Container: Quality of Service Class

Kubernetes classifies the Pods that we run and allocates each Pod into a specific quality of service (QoS) class. Kubernetes assigns every Pod a QoS class based on the resource requests and limits of its component Containers. QoS classes are used by Kubernetes to decide which Pods to evict from a Node experiencing *Node Pressure*.

The possible QoS classes are `Guaranteed`, `Burstable`, and `BestEffort`.

## Guaranteed

* This is the highest QoS class in kubernetes. These pods are the least likely to face eviction.
* Never throttled as long as limits are not exceeded.
* They are guaranteed not to be killed until they exceed their limits or there are no lower-priority Pods that can be preempted from the Node.

**Criteria**:

* Every container in the pod must have CPU request and limit with equal value.
* Every container in the pod must have Memory request and limit with equal value.

## Burstable

* Higher priority than BestEffort but lower than Guaranteed.
* If a limit is not specified, it defaults to a limit equivalent to the capacity of the Node, which allows the Pods to flexibly increase their resources if resources are available (burstsable).
* Can get throttled or evicted if usage exceeds requests.

**Criteria**:

* The Pod does not meet the criteria for QoS class `Guaranteed`.
* At least one Container in the Pod has a memory or CPU request or limit.

## BestEffort

* This is the lowest QoS class in kubernetes.
* These pods are the most likely to face eviction.
* These pods will use any amount of compute resource available.

  For example, if you have a node with 16 CPU cores available to the kubelet, and you assign 4 CPU cores to a Guaranteed Pod, then a Pod in the BestEffort QoS class can try to use any amount of the remaining 12 CPU cores.

## Eviction Order

When Kubernetes needs to evict pods due to CPU or Memory limit, it follows this order.

* **BestEffort** Pods (No CPU/memory requests set)
* **Burstable** Pods (Some requests but no strict limits)
* **Guaranteed** Pods (Requests = Limits)

## References

* <https://kubernetes.io/docs/concepts/workloads/pods/pod-qos/>
