Масштабирование узлов

В графическом интерфейсе платформы «Штурвал» доступно управление количеством узлов ранее созданных кластеров (клиентские кластеры, кластер управления).

Инструкция применима для кластеров c провайдерами:

  • Basis Dynamix;
  • oVirt (zVirt, HostVM, РЕД Виртуализация, ROSA Virtualization);
  • VMware vSphere;
  • OpenStack (VK Cloud, Selectel);
  • Yandex Cloud;
  • vCloud Director.

Чтобы изменить количество узлов в кластере с провайдером Shturval v2, используйте инструкции Добавить хосты и Уменьшить число узлов в группе.

Управление доступно в конфигурации групп узлов. Вы можете масштабировать (увеличить или уменьшить) Control Plane узлы и Worker-узлы.

Обратите внимание! В пакете лицензии платформы «Штурвал» установлен лимит по количеству Worker-узлов и vCPU. При превышении лимита на экранах графического интерфейса отображается уведомление.

Выбор типа масштабирования

Для групп Worker-узлов доступны два режима: ручное и автоматическое масштабирование. Выбор зависит от предсказуемости нагрузки, требований к доступности и операционного контроля.

Когда предпочтительнее ручное масштабирование

  • Стабильная или предсказуемая нагрузка — потребности в ресурсах известны и меняются редко.
  • Жёсткие ограничения по бюджету или лицензиям — нужно точно контролировать количество узлов и не допускать неожиданного роста.
  • Критичные к задержкам или изоляции нагрузки — добавление и удаление узлов нужно планировать вручную.
  • Соответствие регламентам — любое изменение инфраструктуры должно проходить согласование.
  • Малое количество групп или узлов — ручное изменение «Запрошено реплик» не создаёт операционной нагрузки.

Когда предпочтительнее автоматическое масштабирование

  • Переменная или непредсказуемая нагрузка — трафик, события или объём задач сильно колеблются.
  • Оптимизация затрат при простаивании — в периоды низкой нагрузки кластер может уменьшаться, в пики — увеличиваться без ручного вмешательства.
  • Несколько групп Worker-узлов с разным назначением — удобно задать мин/макс реплик по группам.
  • Высокие требования к доступности — автоматическое добавление узлов при нехватке ресурсов снижает риск Pending-подов.

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

Горизонтальное и вертикальное масштабирование

Масштабирование узлов в кластере (добавление или удаление узлов) — это горизонтальное масштабирование на уровне инфраструктуры. Вертикальное — изменение ресурсов (CPU, RAM) уже существующих узлов или подов.

Когда предпочтительнее горизонтальное масштабирование

  • Бесстатусные и распределённые приложения — нагрузку лучше распределять по новым узлам и подам.
  • Высокая доступность и отказоустойчивость — больше узлов снижают влияние отказа одного узла.
  • Рост упирается в количество подов, а не в размер одного пода — приложения масштабируются по репликам (HPA), и нужны дополнительные узлы.
  • Ограничения по размеру одной машины — проще добавить узлы стандартного размера, чем менять тип инстанса.

Рекомендуется сочетать горизонтальное масштабирование подов (HPA) с масштабированием узлов: сначала масштабируются поды, при нехватке узлов добавляются узлы.

Когда предпочтительнее вертикальное масштабирование

  • Ресурсоёмкие задачи на одном узле — тяжёлые вычисления, ML, обработка данных.
  • Stateful-нагрузки — базы данных, очереди с состоянием; увеличение реплик сложнее, чем увеличение ресурсов.
  • Жёсткие требования к памяти или CPU на процесс — приложение не масштабируется горизонтально без переработки.
  • Ограничение по количеству узлов — лимиты лицензии или облака делают выгодным увеличение размера узлов вместо добавления новых.

В платформе «Штурвал» изменение размера узлов (вертикальное масштабирование на уровне машин) может потребовать действий в конфигурации группы узлов или провайдера, например смены типа инстанса или параметров InfraMachineTemplate. Масштабирование ресурсов подов (CPU/Memory requests/limits) выполняется в манифестах workload’ов или через VPA, если он включён.

Масштабирование узлов в кластере

Выполните следующие действия, чтобы изменить количество узлов в кластере:

  1. Перейдите на страницу Управление узлами раздела Администрирование.
  2. Определите группу, в которой необходимо масштабировать узлы:
    • группа Control Plane узлов;
    • группа Worker-узлов. В клиентских кластерах можно управлять количеством узлов для каждой Worker-группы: Default, Infra или кастомной.
Скриншот: Control Plane

Группа Control Plane на странице управления узлами

Обратите внимание! Уменьшение количества Control Plane узлов в кластере управления может привести к поломке кластера управления.
Скриншот: Worker-узлы в кластере управления

Worker-узлы кластера управления

Скриншот: Worker-узлы в клиентском кластере

Worker-узлы клиентского кластера

  1. Перейдите к конфигурации группы узлов, нажав Конфигурация группы.

Группа Control Plane узлов

На вкладке Конфигурация Cluster API группы Control Plane узлов доступно ручное масштабирование. Укажите желаемое количество узлов в поле Запрошено реплик.

Скриншот: конфигурация группы Control Plane узлов

Скриншот: Группа Control Plane узлов

Сохраните изменения. На странице Управление узлами можно отследить процесс масштабирования.

Группа Worker-узлов

На вкладке Конфигурация Cluster API группы Worker-узлов доступны два способа масштабирования:

  • Ручной — укажите желаемое количество узлов в поле Запрошено реплик.
  • Автоматическое — задайте диапазон в полях Минимально реплик и Максимально реплик.
Скриншот: ручное масштабирование

Ручное масштабирование группы узлов

Скриншот: автоматическое масштабирование

Автоматическое масштабирование группы узлов

Сохраните изменения. На странице Управление узлами можно отследить процесс масштабирования.

Рекомендации по ручному масштабированию

При ручном изменении количества узлов учитывайте следующее:

  • Увеличение узлов планируйте до наступления пиковой нагрузки или перед развёртыванием новых приложений, чтобы поды не оставались в состоянии Pending.
  • Уменьшение узлов выполняйте в период низкой нагрузки; убедитесь, что на остающихся узлах достаточно места для подов с выводимых узлов.
  • Изменяйте количество реплик пошагово (например, по одному-два узла в группе), особенно при уменьшении.
  • После изменения проверьте страницу Управление узлами: новые узлы должны перейти в состояние Ready, при уменьшении дождитесь завершения drain и удаления узлов.
  • Для групп Control Plane не уменьшайте количество узлов ниже требуемого для кворума.
  • Учитывайте лимиты лицензии по Worker-узлам и vCPU.

Cluster Autoscaler

Cluster Autoscaler изменяет размер Kubernetes-кластера на основе использования подов и узлов. В Cluster API он управляет созданием и удалением узлов через ресурсы Cluster API и применяется только к Worker Machines.

По данным Cluster API Book, autoscaler с провайдером Cluster API работает с ресурсами MachineSet, MachineDeployment или MachinePool, если на них есть обе аннотации диапазона. В «Штурвале» автоматическое масштабирование Worker-группы настраивается в интерфейсе на вкладке Конфигурация Cluster API (Группы узлов); для Worker-групп используется MachineDeployment.

Аннотации диапазона

Аннотация Назначение
cluster.x-k8s.io/Cluster API-autoscaler-node-group-min-size Минимальное число узлов в группе. Autoscaler не уменьшает группу ниже этого значения.
cluster.x-k8s.io/Cluster API-autoscaler-node-group-max-size Максимальное число узлов в группе. Autoscaler не увеличивает группу выше этого значения.

Autoscaler отслеживает ресурсы Cluster API, на которых есть обе аннотации. В «Штурвале» эти значения соответствуют полям Минимально реплик и Максимально реплик.

Пример фрагмента 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"

Просмотр YAML выполняется в кластере управления: АдминистрированиеКастомные ресурсы.

Обратите внимание! Внимание: autoscaler не приводит группу к min/max автоматически, если текущее число узлов уже ниже минимума или выше максимума. Для принудительного соблюдения минимума в upstream Cluster Autoscaler используется флаг --enforce-node-group-min-size; доступность настройки в «Штурвале» зависит от поставки.

Scale from zero

В Cluster API scale-from-zero — опциональная возможность инфраструктурного провайдера. Если провайдер не отдаёт autoscaler сведения о размере будущих узлов, можно использовать capacity-аннотации на MachineDeployment или MachineSet (минимум CPU и memory), например:

capacity.cluster-autoscaler.kubernetes.io/cpu: "16"
capacity.cluster-autoscaler.kubernetes.io/memory: "128G"

Capacity-аннотации имеют приоритет над данными, полученными от infrastructure machine templates.

Обратите внимание! Внимание: в «Штурвале» автомасштабирование с нуля реплик в группе не включено. Для отказоустойчивости рекомендуется не менее двух Worker-узлов; в интерфейсе нельзя задать минимум меньше 2.

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

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

  • ищет поды в статусе Pending с причиной Unschedulable;
  • оценивает запросы подов на CPU, RAM и GPU;
  • анализирует загрузку узлов группы.

Дальше он может добавить узлы при дефиците ресурсов или удалить узел, если одновременно выполняются условия, в том числе:

  • суммарные requests подов на узле меньше порога утилизации;
  • поды, кроме системных подов на всех узлах, можно перенести;
  • на узле нет аннотации запрета уменьшения масштаба.
cluster-autoscaler.kubernetes.io/scale-down-disabled: "true"

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

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

Учёт PodDisruptionBudget и affinity

Autoscaler учитывает PodDisruptionBudget, nodeSelector и nodeAffinity с типом requiredDuringSchedulingIgnoredDuringExecution. preferredDuringSchedulingIgnoredDuringExecution не учитывается.

Почему узел не удаляют

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

  • на поды действует PDB;
  • есть «отдельностоящие» поды, которые не принадлежат Deployment, ReplicaSet, StatefulSet и т.д.;
  • поды используют локальное хранилище;
  • на других узлах недостаточно ресурсов под запросы подов;
  • другие узлы не подходят под nodeSelector или nodeAffinity подов.

При необходимости подам можно добавить аннотацию, разрешающую вытеснение:

cluster-autoscaler.kubernetes.io/safe-to-evict: "true"