TGViewer
Библиотека девопса | DevOps, SRE, Sysadmin Библиотека девопса | DevOps, SRE, Sysadmin @devopsslib · 10.4K subscribers
Post #4805 1.05K
🌐 Kubernetes v1.36: многоуровневая защита памяти через Memory QoS

Kubernetes v1.36 обновил механизм Memory QoS на узлах с cgroup v2. Теперь защита памяти назначается по уровням в зависимости от QoS-класса пода, а не по единому правилу для всех.

Какую проблему это решает

До этого у Kubernetes была одна беда: планировщик учитывал запросы памяти при размещении пода, но ядро Linux не знало ничего о том, что эта память «зарезервирована».

Под с requests: 512Mi мог потерять свою память под давлением так же легко, как под без каких-либо запросов вообще. В cgroup v1 это нельзя было исправить — там просто нет нужных инструментов.

cgroup v2 принесла два новых параметра: memory.min (жёсткая защита, ядро не тронет эту память ни при каких условиях) и memory.low (мягкая защита, ядро постарается не трогать, но может при крайней нехватке). Memory QoS использует оба.

Как это работает в v1.36

Политика называется TieredReservation и работает так.

Guaranteed-поды получают memory.min, равный requests. Ядро гарантирует эту память безусловно.
Burstable-поды получают memory.low, равный requests. Ядро постарается сохранить эту память, но при сильном давлении может забрать.
BestEffort-поды не получают никакой защиты.

Дополнительно для Burstable-подов kubelet выставляет memory.high — порог, при превышении которого начинается троттлинг. Считается по формуле:
memory.high = requests + 0.9 * (limits - requests)


Это даёт 10% «буфер» до жёсткого лимита memory.max, чтобы под не уходил в OOM kill резко.

Как включить

Функция находится в alpha и по умолчанию выключена. Включается через feature gate в конфигурации kubelet:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
MemoryQoS: true


Дополнительно можно настроить политику резервирования через параметр memoryReservationPolicy. Если хотите отключить memory.min без отключения всей фичи — ставите Disabled. Если хотите убрать ранний троттлинг — memoryThrottlingFactor: 1.0.

Требования

Нужны Linux с cgroup v2 и ядро версии 5.9 или выше. На более старых ядрах есть баг: когда под упирается в memory.high, процесс зависает вместо того, чтобы двигаться к OOM kill. В v1.36 kubelet логирует предупреждение при старте, если ядро старше 5.9 и фича включена.

Поддержка со стороны CRI-рантайма тоже обязательна. Сейчас это containerd и CRI-O.

Что изменилось по сравнению с предыдущими версиями

В v1.27 была попытка перевести фичу в beta, но её заблокировал именно тот баг с livelock на старых ядрах. В v1.36 добавили метрики на уровне ноды, механизм отката (rollback reconciliation) и возможность тонкой настройки. Логика выставления memory.min тоже поправлена: раньше при requests = 0 memory.min мог выставляться некорректно, теперь сбрасывается в 0 явно.

➡️ Блог k8s

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
  • 👍 1
More from @devopsslib
  1. Sep 18, 2026От исходного кода до процессора: разберись, как работает программа 💻 Стартует практически…
  2. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  3. Sep 15, 2026👩‍💻 Bash-скрипт для мониторинга сервисов Полноценный мониторинг вроде Zabbix или Prometh…
  4. Sep 13, 2026🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy выра…
  5. Sep 13, 2026🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выб…
  6. Sep 10, 2026Планы на 3 октября — прийти на RWB Infra x Security Meetup Мы направим прожекторы на инфра…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →