Короткий ответ
QoS-класс вычисляется автоматически из соотношения requests и limits: Guaranteed (requests = limits по CPU и памяти для всех контейнеров), Burstable (requests заданы и отличаются от limits, либо только частично заданы), BestEffort (requests/limits не заданы вовсе); при нехватке памяти на узле kubelet выселяет (evict) поды в порядке BestEffort → Burstable → Guaranteed.
Как это работает подробнее
QoS влияет на порядок OOM-killer внутри узла (через oom_score_adj, который Kubernetes выставляет по классу) и на порядок принудительного выселения подов при node pressure (нехватка памяти/диска). Guaranteed-поды удаляются последними и только при действительно критическом состоянии узла.
Пример кода
Команды и вывод
kubectl get pod db-0 -o jsonpath='{.status.qosClass}'
GuaranteedЧто использовать на практике
- Практика. для критичных stateful-компонентов (базы данных, очереди) стремятся к классу Guaranteed, чтобы минимизировать риск неожиданного выселения при давлении на узел; для менее критичных batch-задач допустим Burstable или даже BestEffort, если это осознанный компромисс ради более плотного использования кластера. Важно понимать, что Guaranteed не защищает от CPU throttling — это два разных механизма.
Подводные камни
- Риски. считать, что Guaranteed гарантирует отсутствие проблем в принципе — он лишь снижает приоритет выселения при node pressure, но не отменяет OOMKilled при превышении собственного лимита памяти пода; не замечать, что под случайно попал в BestEffort из-за отсутствия
requestsхотя бы у одного контейнера в multi-container Pod.