В Kubernetes v1.36 обновлён механизм Memory QoS на узлах с cgroup v2. Раньше ядро не знало о «зарезервированной» памяти подов, и под с requests терял память так же легко, как и под без запросов. Теперь защита назначается по уровням в зависимости от QoS-класса пода.
Как работает TieredReservation
— Guaranteed-поды получают
memory.min = requests. Ядро гарантирует эту память безусловно.— Burstable-поды получают
memory.low = requests. Ядро постарается сохранить эту память, но при сильном давлении может забрать.— BestEffort-поды не получают защиты.
Для Burstable-подов kubelet также выставляет
memory.high = requests + 0.9 * (limits - requests), давая 10% буфер до жёсткого лимита memory.max. При превышении порога начинается троттлинг, предотвращая резкий OOM kill.Как включить
Фича в alpha, по умолчанию выключена. Включается feature gate
MemoryQoS: true в конфигурации kubelet. Можно дополнительно настроить memoryReservationPolicy и memoryThrottlingFactor.Требования
Linux с cgroup v2 и ядро 5.9 или выше. На старых ядрах присутствует баг (зависание процесса вместо движения к OOM kill). Поддержка со стороны containerd или CRI-O обязательна.
В отличие от предыдущих попыток (v1.27), в v1.36 добавлены метрики на уровне ноды, механизм отката и возможность тонкой настройки. Логика выставления memory.min исправлена: при requests = 0 значение сбрасывается в 0 явно.
📌 Подробнее: https://kubernetes.io/blog/2026/04/29/kubernetes-v1-36-memory-qos-tiered-protection/
MemOps 🤨