Почему для установки Kubernetes требуется отключить swap?

Категория: k8s

Просмотров: 30

Ответ:

1. Точность планировщика ресурсов

Kubernetes полагается на планировщик, который решает, на каких узлах запускать поды, основываясь на ресурсах (CPU и памяти), доступных на узлах. Поскольку swap позволяет системе обменивать данные между оперативной памятью (RAM) и дисковым пространством (swap-файл), использование swap искажает фактическое использование памяти на узле. Если swap включен, планировщик может недооценивать или переоценивать доступные ресурсы:

  • Планировщик видит свободную память в RAM, но на деле часть приложения может быть выгружена в swap, что вызывает задержки при обращении к данным, находящимся на диске.
  • В результате Kubernetes может назначить слишком много подов на один узел, что может привести к задержкам и деградации производительности.

2. QoS и приоритеты

Kubernetes использует QoS-классы для управления приоритетами подов, основанными на их ресурсных требованиях:

  • Guaranteed (гарантированный) — поды с жесткими ограничениями по памяти и CPU.
  • Burstable (разрешенный всплеск нагрузки) — поды с минимальными требованиями и максимальными лимитами по памяти и CPU.
  • BestEffort (лучшее усилие) — поды без указания требований по ресурсам.

Когда swap включен, ядро может выгружать страницы памяти для всех процессов, включая те, которые принадлежат критическим подам с приоритетом Guaranteed. Это может вызвать проблемы с производительностью и задержки для подов, которым необходимо немедленно получить доступ к памяти.

3. Понятная производительность

Swap используется для обмена данными между оперативной памятью и дисковым пространством, но чтение/запись на диск значительно медленнее, чем работа с оперативной памятью. Это может привести к снижению производительности, если ядро системы решит выгрузить активные данные в swap, особенно под нагрузкой. В кластере с Kubernetes такие задержки могут быть критичными для подов, которые ожидают быстрого выполнения операций.

Kubernetes стремится к предсказуемой производительности, и включение swap может вносить случайные задержки, что негативно сказывается на работе приложений и стабильности кластера.

4. OOM-killer

Kubernetes полагается на систему Out Of Memory (OOM)-killera для завершения подов, если они превышают лимиты по памяти. В Linux при недостатке памяти OOM-killer завершает процессы, чтобы освободить ресурсы. Когда swap включен, система может начать выгружать страницы памяти в swap вместо вызова OOM-killer, что затягивает процесс завершения подов, вызывая замедление системы и уменьшение доступных ресурсов для критических процессов.

Отключение swap гарантирует, что при нехватке памяти поды будут завершены своевременно, и ресурсы будут освобождены для других процессов.

5. Совместимость с cgroups и контейнерами.

Kubernetes использует cgroups (контрольные группы) для ограничения ресурсов (CPU, памяти и дискового ввода-вывода) для каждого контейнера. Cgroups лучше работают в среде без swap, поскольку они обеспечивают точное управление выделением и ограничением ресурсов для подов. Если swap включен, управление памятью через cgroups становится менее эффективным, что может привести к некорректному распределению ресурсов между контейнерами и ухудшению изоляции.