Автомасштабирование

Автомасштабирование групп нод в кластере Managed Kubernetes поможет оптимально использовать ресурсы кластеров с меняющейся нагрузкой.

Описание работы

Каждые 10 секунд включенный Cluster Autoscaler проверяет наличие подов в статусе PENDING. Если такие поды есть, сервис оценивает запросы (requests на CPU и RAM) у этих подов и разворачивает то количество нод, которое покроет запросы. Если запросы не указаны, ноды будут добавляться по одной. Для подсчетов сервис использует только описанные запросы для подов и не оценивает реальную утилизацию ресурсов.

Когда нет зависших подов, сервис проверяет соотношение запросов к ресурсам ноды. Если понятно, что нода в 2 раза больше, чем нужно подам, сервис пометит ноду как ненужную. Если через 10 минут запросы на ненужной ноде не вырастут, сервис перенесет поды на другие ноды, а освободившуюся ноду удалит. Удаление всегда происходит по одной ноде за раз.

Сервис не сможет перенести поды, которые:

  • созданы без контроллера (deployment, replica set и т.д);
  • используют local storage;
  • используют PodDisruptionBudget;
  • Kube-system поды без PodDisruptionBudget;
  • ограничены другими условиями (например, на других нодах нет ресурсов под запросы пода, несоответствие nodeSelector, affinity, anti-affinity правил).

В этих случаях такие поды останутся на ноде, и она продолжит работу. Система запомнит неперенесенные поды и не будет пытаться их перемещать, до тех пор пока не будут перезагружены мастер ноды.

Вы можете разрешить подам перенос с помощью аннотации:

cluster-autoscaler.kubernetes.io/safe-to-evict: "true"

Управление

Автомасштабирование можно применить для любой группы нод.

Чтобы включить опцию, после создания кластера в панели управления:

  1. Перейдите в раздел Kubernetes.
  2. На странице кластера в контекстном меню (⋮) нужной группы нод выберите Управление автомасштабированием из выпадающего меню.
  3. В открывшемся окне выберите Включить автомасштабирование и установите диапазон количества нод в группе. Нажмите Сохранить.

Если автомасштабирование включено, в общих сведениях о группе нод (на сером фоне) будут отображаться границы диапазона, например Min 2 — Max 15.

Изменение количества начнется, если на кластер идет нагрузка. Это значит, что если в группе только 2 ноды, а вы выставили минимум на 5 нод, то сервис начнет увеличивать группу не сразу, а только когда появятся поды в статусе PENDING. Когда сервис увеличит количество нод до указанного диапазона, следующие будет изменяться в заданном диапазоне.

Автомасштабирование можно настроить в запросах к API на создание и изменение группы нод, подробнее в документации к API.

Ограничения

Проектные квоты

В процессе автомасштабирования сервис может упереться в пределы проектных квот на vCPU, RAM и выбранный тип диска. В такой ситуации будет развернуто только то количество нод, которое возможно в этих пределах. Чтобы этого избежать, рекомендуем увеличивать проектные квоты с запасом на верхний предел диапазона автомасштабирования.

При включении сервиса через панель управления, интерфейс проверит квоты и сообщит, сколько нужно добавить. При настройке через API свободные квоты не учитываются, поэтому рекомендуем проверить квоты самостоятельно и установить нужные значения.

Обратите внимание, что эти квоты никак не бронируются под кластер Managed Kubernetes, и могут быть использованы и для других виртуальных серверов.

Статус кластера

Автомасштабирование происходит только в статусе кластера ACTIVE. Если триггер для автомасштабирования сработает, когда у кластера другой статус, то, чтобы изменить количество нод, сервис дождется перехода в ACTIVE.

Пороги

Интервал проверки на зависшие поды и ненужные ноды — 10 секунд

Нижний порог утилизации ноды, после которого начнется удаление — 50%

Ожидание нагрузки на ненужной ноде — 10 минут

Best Practices

Если в вашем приложении есть поды, для которых недопустимы остановки, настройте для них PodDisruptionBudget. Kubernetes проследит за тем, чтобы для важных сервисов всегда было не меньше заданного вами числа подов. Это поможет избежать даунтайма при переносе подов между нодами.

Для оптимальной работы автомасштабирования в манифестах для подов рекомендуем указывать resource requests.

Убедитесь, что в проекте выделено достаточно квот для возможного верхнего предела автомасштабирования на vCPU, RAM и тип диска, который используется в группе нод.

Обратите внимание! Не изменяйте ресурсы ноды вручную через панель управления. Сервис не будет учитывать эти изменения, и все новые ноды будут созданы с первоначальной конфигурацией.