Перейти к основному содержимому

Автомасштабирование группы нод

Последнее изменение:
к сведению

Автомасштабирование недоступно:

  • для групп нод с GPU без драйверов;
  • групп нод на выделенных серверах.

В кластере Managed Kubernetes на облачном сервере автомасштабирование групп нод происходит с помощью Cluster Autoscaler. Он помогает оптимально использовать ресурсы кластера — в зависимости от нагрузки на кластер количество нод в группе будет автоматически уменьшаться или увеличиваться.

Устанавливать в кластере Cluster Autoscaler не требуется — он устанавливается автоматически при создании кластера. После создания кластера вы можете настроить Cluster Autoscaler для каждой группы нод.

Включить автомасшабирование группы нод можно в панели управления, через API Managed Kubernetes или через Terraform.

Для автомасштабирования подов в Managed Kubernetes используется Metrics Server.

Принцип работы

Минимальное и максимальное количество нод в группе можно задать при включении автомасштабирования — Cluster Autoscaler будет менять количество нод только в этих пределах.

Если группа нод находится в статусе ACTIVE, Cluster Autoscaler каждые 10 секунд проверяет, есть ли поды (Pod) в статусе PENDING, и анализирует нагрузку — запросы от подов на vCPU, RAM и GPU. В зависимости от результатов проверки ноды добавляются или удаляются. Группа нод в это время переходит в статус PENDING_SCALE_UP или PENDING_SCALE_DOWN. Статус кластера во время автомасштабирования — ACTIVE.

Подробнее о статусах кластера в инструкции Посмотреть статус кластера.

Добавление ноды

Если есть поды в статусе PENDING и в кластере не хватает свободных ресурсов для их размещения, в кластер добавляется необходимое количество нод. В кластере с версией Kubernetes 1.28 и выше Cluster Autoscaler будет работать сразу в нескольких группах и распределять ноды равномерно.

примечание

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

В кластере с версией Kubernetes 1.27 и ниже ноды добавляются по одной за цикл проверки.

Удаление ноды

Если нет подов в статусе 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"

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

Автомасштабирование до нуля нод

В группе нод можно настроить автомасштабирование до нуля нод — при низкой нагрузке удаляются все ноды группы. Карточка группы нод со всеми настройками не удаляется. Когда нагрузка повысится, в этой группе нод снова могут быть добавлены ноды.

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

примечание

Например, автомасштабирование до нуля нод не сработает, если в кластере:

  • две группы нод, в каждой из которых по одной рабочей ноде;
  • одна группа нод с двумя рабочими нодами.

Когда в группе нет нод, вы не платите за неиспользуемые ресурсы.

Рекомендации

Для оптимальной работы Cluster Autoscaler мы рекомендуем:

  • убедиться, что в проекте есть квоты на vCPU, RAM, GPU и объем диска для создания максимального количества нод в группе;
  • указать в манифестах для подов запросы на ресурсы;
  • проверить, что ноды в группе имеют одинаковую конфигурацию и лейблы;
  • настроить для подов, для которых не допустимы остановки, PodDisruptionBudget. Это поможет избежать даунтайма при переносе между нодами;
  • не использовать другие Cluster Autoscaler;
  • не изменять ресурсы ноды вручную через панель управления. Cluster Autoscaler не будет учитывать эти изменения, и все новые ноды будут созданы с первоначальной конфигурацией.

Включить автомасштабирование

к сведению

Если установить минимальное количество нод в группе больше, чем текущее количество, оно не увеличится до нижней границы сразу. Группа нод будет масштабироваться только после появления подов в статусе PENDING. Так же и с верхней границей нод в группе — если текущее количество нод больше верхней границы, удаление начнется только после проверки подов.

  1. В панели управления в верхнем меню нажмите Продукты и выберите Managed Kubernetes.
  2. Откройте страницу кластера → вкладка Состав кластера.
  3. В меню группы нод выберите Изменить количество нод.
  4. В поле Количество нод откройте вкладку С автомасштабированием.
  5. Установите минимальное и максимальное количество нод в группе — значение нод будет меняться только в этом диапазоне. Для отказоустойчивой работы системных компонентов мы рекомендуем использовать не менее двух рабочих нод в кластере, ноды могут находиться в разных группах.
  6. Нажмите Сохранить.

Настроить Cluster Autoscaler

Вы можете настроить Cluster Autoscaler отдельно для каждой группы нод.

Посмотрите параметры, их описание и значения по умолчанию в таблице Параметры Cluster Autoscaler. Если вы не укажете параметр в манифесте, будет использовано значение по умолчанию.

Пример манифеста:

apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-autoscaler-nodegroup-options
namespace: kube-system
data:
config.yaml: |
150da0a9-6ea6-4148-892b-965282e195b0:
scaleDownUtilizationThreshold: 0.55
scaleDownUnneededTime: 7m
zeroOrMaxNodeScaling: true
e3dc24ca-df9d-429c-bcd5-be85f8d28710:
scaleDownGpuUtilizationThreshold: 0.25
ignoreDaemonSetsUtilization: true

Здесь 150da0a9-6ea6-4148-892b-965282e195b0 и e3dc24ca-df9d-429c-bcd5-be85f8d28710 — уникальные идентификаторы (UUID) групп нод в кластере. Можно посмотреть в панели управления: в верхнем меню нажмите ПродуктыManaged Kubernetes ⟶ раздел Kubernetes ⟶ страница кластера ⟶ скопируйте UUID над карточкой группы нод, рядом с сегментом пула.

Параметры Cluster Autoscaler

ОписаниеЗначение по умолчанию
scaleDownUtilizationThresholdМинимальная загрузка vCPU и RAM ноды, при которой система может удалить ноду. Если нода использует меньше указанного процента vCPU и RAM, например меньше 50% при значении 0.5, система удаляет ноду0.5
scaleDownGpuUtilizationThresholdМинимальная загрузка GPU, при которой система может удалить ноду. Если нода использует меньше указанного процента GPU, например меньше 50% при значении 0.5, система удаляет ноду0.5
scaleDownUnneededTimeВремя ожидания перед удалением ноды с низкой нагрузкой. Система не удалит ноду сразу, как только упадет нагрузка ноды — она подождет указанное время, чтобы убедиться, что снижение нагрузки стабильное10m
scaleDownUnreadyTimeВремя ожидания перед удалением ноды в статусе NotReady. Система не оставит ноду в статусе NotReady в кластере — она подождет указанное время, чтобы убедиться, что нода зависла и не восстановится, а затем удалит ее20m
maxNodeProvisionTimeВремя ожидания при добавлении новой ноды. Если возникла ошибка и нода не добавилась в течение указанного времени, система заново запустит процесс добавления ноды15m
zeroOrMaxNodeScalingПозволяет автоматически изменять количество нод только до нуля или максимума, который вы установили. Полезно, если нужно, чтобы при появлении нагрузки система развернула сразу все ноды в группе, а при отсутствии нагрузки — удалила все нодыfalse
ignoreDaemonSetsUtilizationПозволяет не учитывать служебные сервисы (DaemonSets), когда система определяет, нужно ли уменьшать количество нод в группе. Если значение true, служебные сервисы не учитываютсяfalse