Настроить автомасштабирование группы нод
Автоматическое масштабирование кластера недоступно:
- в группах нод с GPU без драйверов;
- группах нод на выделенных серверах.
В кластере Managed Kubernetes на облачном сервере можно настроить автоматическое масштабирование групп нод с помощью Cluster Autoscaler. Он помогает оптимально использовать ресурсы кластера — в зависимости от нагрузки на кластер количество нод в группе будет автоматически уменьшаться или увеличиваться.
Включить автомасшабирование группы нод можно в панели управления, через Managed Kubernetes API или Terraform — устанавливать в кластере Cluster Autoscaler не требуется.
Для автомасштабирования подов в Managed Kubernetes используется Metrics Server.
Принцип работы
Минимальное и максимальное количество нод в группе можно задать при включении автомасштабирования — Cluster Autoscaler будет менять количество нод только в этих пределах.
Cluster Autoscaler проверяет наличие подов (Pod) в статусе PENDING
(в ожидании) каждые 10 секунд и анализирует нагрузку — запросы на ресурсы (vCPU и RAM) от подов. В зависимости от результатов проверки ноды добавляются или удаляются.
Добавление ноды
Если есть под в статусе PENDING
и в кластере не хватает свободных ресурсов для размещения пода, в кластер добавляется нода.
Если после создания одной ноды остались поды в статусе PENDING
, то добавляются еще ноды — по одной за цикл проверки.
Удаление ноды
Если нет подов в статусе PENDING
, Cluster Autoscaler проверяет количество ресурсов, которые запрашивают поды.
Если общее количество ресурсов, которые запрашивают поды на одной ноде, меньше 50% от ее ресурсов, то Cluster Autoscaler помечает ноду как ненужную. Если на ноде через 10 минут не вырастет количество запросов на ресурсы, Cluster Autoscaler проверит, можно ли перенести поды на другие ноды.
Cluster Autoscaler не перенесет поды (и, соответственно, не удалит ноду) с определенными условиями:
- поды, которые используют PodDisruptionBudget;
- Kube-system поды без PodDisrptionBudget;
- поды, которые созданы без контроллера (Deployment, ReplicaSet, StatefulSet и других);
- поды, которые используют local storage;
- если на других нодах нет ресурсов под запросы пода;
- если есть несоответствие nodeSelector, правил affinity/anti-affinity и так далее.
Вы можете разрешить таким подам перенос — для этого добавьте аннотацию:
cluster-autoscaler.kubernetes.io/safe-to-evict: "true"