Открыть сервис

Cluster Autoscaler

Cluster Autoscaler — это компонент системы автоматического масштабирования, предназначенный для автоматического увеличения или уменьшения количества узлов (нод) в кластере контейнерных оркестраторов, таких как Kubernetes, в зависимости от текущих потребностей в ресурсах. Основная задача Cluster Autoscaler заключается в том, чтобы обеспечить достаточное количество вычислительных мощностей для запуска всех запланированных подов (Pod) при одновременном минимизации затрат на простаивающие ресурсы. Он работает на уровне инфраструктуры, взаимодействуя с облачными провайдерами (например, Amazon Web Services, Google Cloud Platform, Microsoft Azure, Яндекс.Облако) или локальными средами виртуализации.

История и предпосылки создания

С развитием контейнеризации и микросервисной архитектуры в 2010-х годах возникла необходимость в эффективном управлении ресурсами. Ручное масштабирование кластеров Kubernetes становилось трудоёмким и неэффективным, особенно при неравномерной нагрузке. В 2016 году сообщество Kubernetes начало разработку Cluster Autoscaler как отдельного компонента, который бы автоматически корректировал размер кластера. Первая стабильная версия была выпущена в 2017 году. Проект быстро стал частью экосистемы Kubernetes и получил поддержку от крупных облачных провайдеров, которые интегрировали его в свои управляемые сервисы (например, Amazon EKS, Google GKE, Azure AKS).

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

Cluster Autoscaler функционирует как циклический процесс, который регулярно (обычно каждые 10–60 секунд) проверяет состояние кластера. Он анализирует два ключевых сценария:

  1. Нехватка ресурсов (Scale Up): Если какой-либо под не может быть запланирован на существующие узлы из-за недостатка CPU, памяти или других ресурсов (например, неудовлетворённые требования к меткам узлов или ограничениям по топологии), Cluster Autoscaler инициирует добавление нового узла. Он выбирает подходящий тип узла (instance type) из предварительно настроенного пула, учитывая требования пода, и отправляет запрос облачному провайдеру на создание виртуальной машины.
  1. Избыток ресурсов (Scale Down): Если узел длительное время (по умолчанию 10 минут) имеет низкую загрузку (например, менее 50% от запрошенных ресурсов) и все его поды могут быть перемещены на другие узлы, Cluster Autoscaler планирует удаление этого узла. Перед удалением он проверяет, что перемещение подов не нарушит их работу (например, не вызовет повторного сбоя из-за нехватки ресурсов на других узлах). Процесс масштабирования вниз обычно происходит медленнее, чем вверх, чтобы избежать частых циклов добавления/удаления (flapping).

Алгоритм принятия решений

Cluster Autoscaler использует эвристические алгоритмы, чтобы минимизировать количество операций масштабирования. Он не просто реагирует на мгновенные изменения, а учитывает:

  • Типы подов: Поды, управляемые контроллерами (Deployment, StatefulSet, DaemonSet), могут быть перемещены, в то время как поды с локальным хранилищем (emptyDir) или с ограничениями на привязку к узлу (pod anti-affinity) могут блокировать масштабирование вниз.
  • Приоритеты: Если есть несколько вариантов добавления узлов, выбирается наиболее экономичный или наиболее подходящий по характеристикам.
  • Задержки: Учитывается время, необходимое облачному провайдеру для запуска новой виртуальной машины (обычно от 30 секунд до нескольких минут).

Классификация и виды

Cluster Autoscaler не является единым продуктом, а представляет собой набор реализаций, адаптированных под разные инфраструктурные платформы.

По типу провайдера

  • Облачные реализации: Для AWS (использует Auto Scaling Groups), GCP (использует Managed Instance Groups), Azure (использует Virtual Machine Scale Sets), Яндекс.Облако (использует группы узлов). Эти версии тесно интегрированы с API облачных провайдеров.
  • Локальные реализации: Для виртуализированных сред (например, OpenStack, VMware vSphere) или «голого» железа (bare-metal). Они используют собственные механизмы создания и удаления виртуальных машин.
  • Специализированные реализации: Например, для работы с кластерами, развёрнутыми с помощью kubeadm, или для использования в составе платформ управления контейнерами (например, Rancher).

По способу развёртывания

  • Встроенный в управляемый сервис: В Amazon EKS, Google GKE, Azure AKS Cluster Autoscaler работает как часть управляемого слоя, не требуя от пользователя отдельной установки.
  • Отдельный компонент: В самостоятельных кластерах (self-managed) Cluster Autoscaler развёртывается как обычное приложение в пространстве имён kube-system. Для этого требуется настроить доступ к API облачного провайдера и указать параметры групп узлов.

Устройство и компоненты

Cluster Autoscaler состоит из нескольких ключевых модулей:

  1. Модуль обнаружения неудовлетворённых подов: Сканирует API Kubernetes на предмет подов, находящихся в состоянии Pending с причиной Unschedulable.
  2. Модуль оценки узлов: Анализирует текущую загрузку узлов и определяет, какие из них можно безопасно удалить.
  3. Модуль взаимодействия с облачным провайдером: Реализует интерфейс для создания и удаления виртуальных машин. Для каждого провайдера существует своя реализация (например, aws, gce, azure).
  4. Модуль управления группами узлов: Хранит информацию о доступных типах узлов, их максимальном и минимальном количестве, а также о метках и ограничениях.
  5. Модуль обработки исключений: Обрабатывает ситуации, когда масштабирование невозможно из-за квот облачного провайдера, ошибок API или конфликтов с другими компонентами (например, с Horizontal Pod Autoscaler).

Применение и значение

Cluster Autoscaler является критически важным компонентом для эксплуатации Kubernetes в производственных средах, особенно в облачных развёртываниях.

Основные сценарии использования

  • Автоматизация затрат: Позволяет сократить расходы на облачные ресурсы, автоматически удаляя простаивающие узлы в периоды низкой нагрузки (например, ночью или в выходные дни).
  • Обработка пиковых нагрузок: Обеспечивает быстрое добавление узлов при резком увеличении трафика, например, во время рекламных акций или сезонных распродаж.
  • Оптимизация ресурсов: Позволяет использовать кластеры с минимальным базовым количеством узлов, полагаясь на автоматическое масштабирование для покрытия временных потребностей.
  • Поддержка мульти-тенантности: В кластерах, где работают несколько команд или приложений, Cluster Autoscaler помогает справедливо распределять ресурсы между ними.

Взаимодействие с другими компонентами

Cluster Autoscaler часто работает в связке с Horizontal Pod Autoscaler (HPA), который масштабирует количество подов, и Vertical Pod Autoscaler (VPA), который корректирует запросы ресурсов для подов. Типичный сценарий: HPA увеличивает количество подов, что приводит к нехватке ресурсов на существующих узлах, после чего Cluster Autoscaler добавляет новый узел. При снижении нагрузки HPA уменьшает количество подов, а Cluster Autoscaler удаляет освободившиеся узлы.

Примеры реализации

Настройка в Google Kubernetes Engine (GKE)

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

Настройка в Amazon Elastic Kubernetes Service (EKS)

В EKS Cluster Autoscaler развёртывается как отдельное приложение. Для этого необходимо:

  1. Создать Auto Scaling Group (ASG) для узлов.
  2. Настроить IAM-роль для Cluster Autoscaler, дающую права на изменение ASG.
  3. Развернуть манифест Cluster Autoscaler в кластере, указав имя ASG и регион.
  4. Настроить параметры, такие как интервал проверки (--scan-interval) и время бездействия перед удалением узла (--scale-down-delay-after-add).

Критика и ограничения

Несмотря на широкое распространение, Cluster Autoscaler имеет ряд недостатков и ограничений:

  • Задержки при масштабировании: Процесс добавления узла может занимать от 30 секунд до нескольких минут, что может быть критично для приложений, чувствительных к задержкам. Для таких случаев рекомендуется использовать избыточное резервирование (over-provisioning) или буферные узлы.
  • Неэффективность при неравномерной нагрузке: Если нагрузка на кластер колеблется с высокой частотой, Cluster Autoscaler может не успевать адекватно реагировать, что приводит к частым циклам масштабирования.
  • Сложность настройки: Для корректной работы требуется точная настройка параметров, таких как пороги загрузки, типы узлов и политики масштабирования. Неправильная конфигурация может привести к нехватке ресурсов или избыточным затратам.
  • Ограничения по типам подов: Поды с локальным хранилищем или с жёсткими ограничениями на привязку к узлу могут блокировать масштабирование вниз, что приводит к простаиванию ресурсов.
  • Зависимость от облачного провайдера: При сбоях в API облачного провайдера или при исчерпании квот Cluster Autoscaler может перестать работать корректно.
  • Конфликты с другими инструментами: При одновременном использовании нескольких инструментов масштабирования (например, Cluster Autoscaler и Karpenter) могут возникать конфликты, приводящие к непредсказуемому поведению.

Источники

  1. Документация Kubernetes: Cluster Autoscaler (kubernetes.io/docs/tasks/administer-cluster/cluster-management/).
  2. Репозиторий проекта Cluster Autoscaler на GitHub (github.com/kubernetes/autoscaler).
  3. Документация Amazon EKS: Cluster Autoscaler (docs.aws.amazon.com/eks/latest/userguide/cluster-autoscaler.html).
  4. Документация Google GKE: Cluster Autoscaler (cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler).
  5. Документация Microsoft Azure AKS: Cluster Autoscaler (docs.microsoft.com/azure/aks/cluster-autoscaler).
  6. Документация Яндекс.Облака: Автоматическое масштабирование групп узлов (cloud.yandex.ru/docs/managed-kubernetes/operations/node-group-autoscale).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →