Kubernetes v1.36 Memory QoS: многоуровневая защита памяти и резервирование
Kubernetes v1.36, запланированный к выходу в апреле 2026 года, представляет значительные улучшения функции Memory QoS, которая теперь включает многоуровневую защиту памяти на основе классов QoS. Это обновление позволяет администраторам кластеров более гибко управлять памятью контейнеров, разделяя ме

Kubernetes v1.36, запланированный к выходу в апреле 2026 года, представляет значительные улучшения функции Memory QoS, которая теперь включает многоуровневую защиту памяти на основе классов QoS. Это обновление позволяет администраторам кластеров более гибко управлять памятью контейнеров, разделяя механизмы ограничения (throttling) и резервирования (reservation), а также вводя дифференцированную защиту для Guaranteed, Burstable и BestEffort Pods. Новая функциональность, находящаяся на стадии альфа-тестирования, использует контроллер памяти cgroup v2 и предоставляет ядру более точные указания по обработке памяти, что особенно актуально для сред с высокой конкуренцией за ресурсы.
Разделение throttling и reservation: новое поле memoryReservationPolicy
Главное архитектурное изменение в v1.36 — разделение двух ранее связанных механизмов: throttling (ограничение через memory.high) и reservation (резервирование через memory.min/memory.low). Ранее включение feature gate MemoryQoS автоматически устанавливало memory.min для каждого контейнера с запросом памяти. Это приводило к неэффективному использованию ресурсов и потенциальным OOM-ситуациям, особенно для BestEffort Pods, которые по своей природе не должны иметь защиты.
Теперь резервирование управляется отдельным полем конфигурации kubelet — memoryReservationPolicy. По умолчанию используется значение None, при котором memory.min и memory.low не записываются, но throttling через memory.high продолжает работать. Это позволяет администраторам использовать только ограничение без резервирования, если это необходимо. Новое значение TieredReservation включает многоуровневую защиту: для Guaranteed Pods устанавливается жёсткая защита через memory.min, для Burstable — мягкая через memory.low, а BestEffort Pods не получают никакой защиты, и их память остаётся полностью перераспределяемой.
Как работает многоуровневая защита: memory.min и memory.low
При включении TieredReservation kubelet записывает memory.min для Guaranteed Pods. Ядро не будет перераспределять эту память ни при каких обстоятельствах. Если гарантия не может быть выполнена, OOM killer уничтожает другие процессы, чтобы освободить страницы. Например, для Guaranteed Pod с запросом 512 МиБ memory.min будет установлен в 536870912 байт. Это обеспечивает максимальную защиту для критически важных сервисов.
Для Burstable Pods используется memory.low: ядро избегает перераспределения этой памяти при нормальном давлении, но может перераспределить её, если альтернативой является системный OOM. Это даёт мягкую защиту, которая улучшает производительность при нормальной нагрузке, но не препятствует выживанию системы в экстремальных условиях. BestEffort Pods не получают ни memory.min, ни memory.low, что делает их память полностью перераспределяемой и позволяет ядру свободно забирать её для других нужд.
Предыстория и контекст: почему изменения важны
Memory QoS была впервые представлена в Kubernetes v1.22 как альфа-функция, а в v1.27 получила обновления, связанные с использованием memory.min. Однако на практике возникали проблемы: принудительное резервирование памяти для всех контейнеров могло приводить к неэффективному использованию ресурсов и неожиданным OOM-ситуациям. Особенно остро это проявлялось в кластерах со смешанными нагрузками, где BestEffort Pods неожиданно получали защиту, что противоречило их природе.
В v1.36 разработчики решили сделать резервирование опциональным, чтобы администраторы кластеров могли выбирать подходящую стратегию. Это особенно важно для сред с высокой конкуренцией за память, где требуется тонкая настройка. Теперь можно включить только throttling для контроля пикового потребления, не резервируя память, что повышает общую эффективность использования ресурсов.
Чем отличается от предыдущей версии?
Ключевое отличие v1.36 от v1.27 — разделение throttling и reservation. В v1.27 включение MemoryQoS feature gate сразу устанавливало memory.min для каждого контейнера с memory request. Это могло привести к тому, что даже BestEffort Pods получали некоторую защиту, что противоречило их природе. В v1.36 поведение изменилось: теперь только Guaranteed Pods получают жёсткую защиту, Burstable — мягкую, а BestEffort — никакой. Кроме того, резервирование стало опциональным — можно использовать только throttling без резервирования. Это даёт больше гибкости и позволяет избежать проблем с производительностью при неправильной настройке.
Технические подробности: метрики и предупреждения
В v1.36 также добавлены метрики наблюдаемости для Memory QoS, которые позволяют отслеживать эффективность защиты памяти. Администраторы могут мониторить, сколько памяти защищено, сколько перераспределено, и как часто срабатывает OOM killer. Кроме того, появилось предупреждение о версии ядра для memory.high: если ядро не поддерживает эту опцию, kubelet выдаст предупреждение. Это помогает администраторам своевременно обновить ядро или настроить параметры.
Кого затронет и как
Обновление в первую очередь затронет администраторов Kubernetes-кластеров, которые используют cgroup v2 и хотят управлять памятью контейнеров. Для разработчиков приложений изменения прозрачны: Pods с QoS классом Guaranteed получат более надёжную защиту памяти, что особенно важно для критически важных сервисов. Burstable Pods получат мягкую защиту, что может улучшить их производительность при нормальной нагрузке. BestEffort Pods останутся без изменений. В российских и СНГ-кластерах, где часто используются смешанные нагрузки, новая функциональность позволит лучше изолировать критичные сервисы.
Что будет дальше
Функция Memory QoS остаётся в альфа-стадии, и ожидается, что в следующих версиях она перейдёт в бета-стадию. Разработчики планируют добавить больше метрик и, возможно, автоматическую настройку параметров на основе наблюдаемой нагрузки. Администраторам рекомендуется протестировать новую функциональность на тестовых кластерах и следить за обновлениями документации.
Какие практические выгоды от многоуровневой защиты памяти?
Многоуровневая защита памяти позволяет более эффективно распределять ресурсы в кластере. Guaranteed Pods получают максимальную защиту, что снижает риск их завершения при нехватке памяти. Burstable Pods получают умеренную защиту, что улучшает их производительность без жёсткого резервирования. BestEffort Pods остаются полностью эластичными, что позволяет максимально утилизировать ресурсы. В результате кластер становится более стабильным и предсказуемым, особенно при пиковых нагрузках.
Итог
Kubernetes v1.36 вносит важные улучшения в управление памятью, разделяя throttling и резервирование, а также вводя многоуровневую защиту по QoS классам. Это позволяет более гибко настраивать кластеры под конкретные нагрузки, повышая стабильность и производительность. Следите за выходом v1.36, чтобы первыми опробовать новые возможности.