Autoscaler в ClusterAPI

Cluster Autoscaler (автоматическое масштабирование кластера) в ClusterAPI представляет механизм изменения количества узлов в кластере в зависимости от нагрузки на узлы. Автомасштабирование позволяет оптимизировать ресурсы при переменной нагрузке в кластерах Kubernetes. Основная цель Cluster Autoscaler — предоставить узлы подам (Pods), ожидающих запуска.

Cluster Autoscaler может управлять автомасштабированием только в группах Worker-узлов. Он отслеживает состояние подов, узлов в кластере и:

  • Увеличивает количество узлов в группе, если недостаточно ресурсов (CPU, память) на существующих узлах для запуска новых подов (Pods).
  • Если ресурсов на узлах становятся избыточно, Cluster Autoscaler может удалить неиспользуемые узлы. При консолидации Cluster Autoscaler выбирает определенные узлы для удаления.

В кластерах по умолчанию включен Cluster Autoscaler. Автомасштабирование доступно в графическом интерфейсе на странице конфигурации группы узлов, на вкладке Конфигурация ClusterAPI.

Скриншот

clusterautoscale1

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

Когда в группе узлов установлено автоматическое масштабирование, ресурсу MachineDeployment присваиваются аннотации с заданным диапазоном количества узлов в группе:

Аннотация, устанавливающая минимальное количество узлов
cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: минимальное количество узлов

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

Обратите внимание! Автомасштабирование с нуля реплик в группе не включено в платформе “Штурвал”. Для отказоустойчивости кластера рекомендуется использовать не менее 2-х Worker-узлов в кластере, поэтому нельзя установить менее 2-х реплик для диапазона в графическом интерфейсе.

Аннотация, устанавливающая максимальное количество узлов
cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: максимальное количество узлов

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

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

apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
  annotations:
    cluster.x-k8s.io/cluster-api-autoscaler-node-group-max-size: "7"
    cluster.x-k8s.io/cluster-api-autoscaler-node-group-min-size: "2"
...

Autoscaler отслеживает значения диапазона в аннотациях MachineDeployment и принимает решение об изменении количества узлов в группе в зависимости от их состояния и нагрузки.

Принцип срабатывания автоскейлинга

Если для группы узлов установлено автомасштабирование, то Cluster Autoscaler каждые 10 секунд:

  • проверяет существование незапланированных подов (Pods). Определяются такие поды по статусу Pending и состоянию PodScheduled со значением false и причиной unschedulable;
  • анализирует запросы незапланированных подов (Pods) на vCPU, RAM и GPU.
  • проверяет загрузку узлов группы.

По результатам проверки Cluster Autoscaler может изменить количество узлов в кластере:

  • Добавить необходимое количество узлов в группу кластера, если есть поды в статусе Pending и в кластере не хватает свободных ресурсов для их размещения.
  • Удалить узел при соблюдении одновременно всех условий:
    • Сумма запросов CPU и памяти всех подов на узле составляет менее 50% от выделяемой памяти узла.
    • Все поды на узле (за исключением тех, которые по умолчанию работают на всех узлах), могут быть перемещены на другие узлы.
    • Узел не имеет аннотации об отключении уменьшения масштаба.
Аннотации об отключении уменьшения масштаба
cluster-autoscaler.kubernetes.io/scale-down-disabled: "true"

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

Cluster Autoscaler может работать одновременно в нескольких Worker-группах и распределять создаваемые узлы равномерно.

Пример

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

При анализе подов Cluster Autoscaler учитывает PodDisruptionBudget (PDB) и установленные правила распределения подов по узлам, такие как:

  • nodeSelector;
  • nodeAffinity с типом requiredDuringSchedulingIgnoredDuringExecution.

Однако, не учитываются предпочтительные правила размещения пода на узел, т.е. nodeAffinity с типом preferredDuringSchedulingIgnoredDuringExecution.

Особенности удаления узла

Cluster Autoscaler не сможет удалить узел, если выполняется хотя бы одно условие:

  • поды на узле имеют PDB (PodDisruptionBudget);
  • в Kube-system подах нет PDB;
  • есть “отдельностоящие” поды (не подчинены нагрузкам: Deployment, ReplicaSet, StatefulSet и т.д.);
  • поды с локальным хранилищем (local storage);
  • на остальных узлах недостаточно ресурсов для запросов подов;
  • другие узлы несоответствуют по nodeSelector, правилам nodeAffinity подов.

При необходимости добавьте аннотацию подам, чтобы разрешить им перераспределение.

Аннотация для вытеснения с узла
cluster-autoscaler.kubernetes.io/safe-to-evict: "true"
×