Autoscaler в ClusterAPI
Cluster Autoscaler (автоматическое масштабирование кластера) в ClusterAPI представляет механизм изменения количества узлов в кластере в зависимости от нагрузки на узлы. Автомасштабирование позволяет оптимизировать ресурсы при переменной нагрузке в кластерах Kubernetes. Основная цель Cluster Autoscaler — предоставить узлы подам (Pods), ожидающих запуска.
Cluster Autoscaler может управлять автомасштабированием только в группах Worker-узлов. Он отслеживает состояние подов, узлов в кластере и:
- Увеличивает количество узлов в группе, если недостаточно ресурсов (CPU, память) на существующих узлах для запуска новых подов (Pods).
- Если ресурсов на узлах становятся избыточно, Cluster Autoscaler может удалить неиспользуемые узлы. При консолидации Cluster Autoscaler выбирает определенные узлы для удаления.
В кластерах по умолчанию включен Cluster Autoscaler. Автомасштабирование доступно в графическом интерфейсе на странице конфигурации группы узлов, на вкладке Конфигурация ClusterAPI.
Скриншот

Аннотации автомасштабирования
Когда в группе узлов установлено автоматическое масштабирование, ресурсу 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"