Изменение размера пулов узлов в службе Azure Kubernetes (AKS)

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

Узлы агента AKS отображаются на портале Azure как обычные ресурсы Azure IaaS. Но эти виртуальные машины развертываются в настраиваемой группе ресурсов Azure (обычно с префиксом MC_*). Вы не можете вносить прямые настройки на эти узлы с помощью API или ресурсов IaaS. Любые пользовательские изменения, которые не выполняются через API AKS, не будут сохраняться при обновлении, масштабировании, обновлении или перезагрузке.

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

Важно

Этот метод предназначен для кластеров AKS на основе масштабируемых наборов виртуальных машин. При использовании пулов узлов на основе виртуальных машин можно легко обновить размеры виртуальных машин в существующем пуле узлов с помощью одной команды Azure CLI и иметь несколько размеров виртуальных машин в одном пуле узлов. Дополнительные сведения см. в документации по пулам узлов виртуальных машин.

Изменение размера пула узлов VMSS на месте (предварительная версия)

Важно

Предварительные версии функций AKS доступны на условиях самообслуживания и по выбору пользователя. Предварительные версии предоставляются "как есть" и "при наличии". На них не распространяются соглашения об уровне обслуживания и ограниченная гарантия. Предварительные версии AKS сопровождаются частичной поддержкой клиентов на основе принципа лучших усилий. Как таковые, эти функции не предназначены для использования в производстве. Для получения дополнительной информации ознакомьтесь со следующими статьями поддержки:

Теперь можно изменить размер виртуальной машины (SKU) существующего пула узлов на основе VMSS в одной команде.az aks nodepool update --node-vm-size <new-size> При активации этого обновления поставщик ресурсов AKS выполняет последовательное обновление следующим образом:

  1. Добавление новых узлов с целевым размером виртуальной машины.
  2. Кордонирование и очистка старых узлов.
  3. Удаление старых узлов.

Это позволяет избежать ручного процесса создания, изоляции, высвобождения и удаления, описанного далее в этой статье.

Как работает поэтапное внедрение изменения размера

Развертывание изменения размера использует тот же механизм последовательного обновления, что и обновление образа узла и обновление версии Kubernetes, поэтому он учитывает следующие параметры, связанные с обновлением, уже настроенные в пуле узлов. В частности, изменение размеров выполняется с учётом:

  • Максимальное увеличение нагрузки (--max-surge): определяет, сколько дополнительных узлов с целевым размером виртуальной машины добавляются во время развертывания. Более высокое значение позволяет быстрее масштабировать пул, но потребляет больше вычислительных ресурсов и квоты IP-адресов; меньшее значение делает это медленнее, но вызывает меньше нарушений в работе. По умолчанию в AKS используется 1, а 33% рекомендуется для рабочих пулов узлов.
  • Время ожидания освобождения узла (--drain-timeout): Как долго AKS ожидает вытеснения подов с каждого старого узла, прежде чем принудительно удалить этот узел. Значение по умолчанию — 30 минут. Используйте это вместе с соответствующими PodDisruptionBudgets, чтобы рабочие нагрузки можно было безопасно высвобождать.
  • Длительность выдержки узла (--node-soak-duration): Сколько времени AKS ожидает после того, как новый узел переходит в состояние Ready, прежде чем перейти к следующей партии. Полезно для стабилизации рабочих нагрузок на новом размере виртуальной машины перед продолжением развертывания.

Так как изменение размера повторно использует конвейер обновления, применяются те же предварительные требования: убедитесь, что у вашей подписки достаточно целевой емкости замены размера виртуальной машины и доступные IP-адреса подсети для узлов всплесков, и что PodDisruptionBudgets позволяет по крайней мере одну реплику вытеснить одновременно, в противном случае изменение размера может быть заблокировано во время очистки. Подробные рекомендации см. в статье Рекомендации по использованию лучших практик при обновлении пула узлов AKS.

Необходимые условия

Изменение размера пула узлов

az aks nodepool update Используйте команду с --node-vm-size параметром, чтобы изменить размер виртуальной машины существующего пула узлов на основе VMSS:

az aks nodepool update \
    --resource-group MyResourceGroup \
    --cluster-name MyManagedCluster \
    --name nodepool1 \
    --node-vm-size Standard_D4s_v3

Проверка и неподдерживаемые сочетания

Поставщик ресурсов AKS проверяет изменение размера запроса и блокирует несовместимые изменения размера виртуальной машины. Следующие изменения не поддерживаются в рамках изменения размера VMSS на месте:

  • Изменение типа контроллера диска (например, SCSI на NVMe).
  • Изменение архитектуры ЦП (например, x64 на ARM64).
  • Изменение поддержки конфиденциальных вычислений (например, включение или отключение SNP).
  • Изменение поколения гипервизора (например, V1 на V2).
  • Объединение изменения размера с обновлением версии Kubernetes или изменением количества узлов в той же операции.

Если для целевого размера виртуальной машины требуется внести какие-либо из указанных выше изменений, вместо этого используйте описанную в следующих разделах ручную процедуру cordon-and-drain.

Примечание

Для изменения размера на месте требуется дополнительный резерв мощности для выделения новых узлов с целевым размером виртуальной машины перед выводом старых из эксплуатации. Если пул узлов настроен с использованием --max-surge 0 (то есть используется --max-unavailable), запрос на изменение размера отклоняется с ошибкой 400 Bad Request. Чтобы продолжить, установите --max-surge как минимум на 1 при изменении размера с использованием

az aks nodepool update \
    --resource-group MyResourceGroup \
    --cluster-name MyManagedCluster \
    --name nodepool1 \
    --node-vm-size Standard_D4s_v3 \
    --max-surge 33%

и при необходимости восстановите исходные --max-surge и --max-unavailable значения после завершения изменения размера.

Создайте новый пул узлов с желаемым номером SKU

Примечание

Каждый кластер AKS должен содержать по крайней мере один системный пул узлов с по крайней мере одним узлом. В этом примере мы используем --mode и System для добавления пула системных узлов, чтобы заменить пул системных узлов, который мы хотим изменить в размере. Вы можете обновить режим пула узлов в любое время. Вы также можете добавить пул узлов пользователя, установив --mode в User.

При изменении размера убедитесь, что вы учитываете все требования к рабочей нагрузке, такие как зоны доступности, и настраиваете пул узлов VMSS соответствующим образом. Возможно, вам потребуется изменить следующую команду в соответствии с вашими потребностями. Полный список параметров конфигурации см. на az aks nodepool add странице справки.

  1. Создайте пул узлов с помощью az aks nodepool add команды. В этом примере мы создадим пул mynodepoolузлов с тремя узлами и Standard_DS3_v2 номером SKU виртуальной машины для замены существующего пула узлов, nodepool1имеющего Standard_DS2_v2 номер SKU виртуальной машины.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name mynodepool \
        --node-count 3 \
        --node-vm-size Standard_DS3_v2 \
        --mode System \
        --no-wait
    

    Создание нового пула узлов занимает несколько минут.

  2. Получите состояние нового пула узлов с помощью kubectl get nodes команды.

    kubectl get nodes
    

    Выходные данные должны выглядеть примерно так, как в новом пуле mynodepool узлов, так и в существующем пуле nodepool1узлов:

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   23m   v1.21.9
    aks-nodepool1-12345678-vmss000000    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000001    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000002    Ready    agent   10d   v1.21.9
    

Ограничьте доступ к существующим узлам

Кордонирование помечает указанные узлы как недоступные для планирования и предотвращает добавление дополнительных pod в узлы.

  1. Получите имена узлов, которые требуется оцепить с помощью команды kubectl get nodes.

    kubectl get nodes
    

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

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-12345678-vmss000000   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000001   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000002   Ready    agent   7d21h   v1.21.9
    
  2. Объедините существующие узлы с помощью kubectl cordon команды, указав нужные узлы в разделенном пробелом списке. Рассмотрим пример.

    kubectl cordon aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002
    

    Выходные данные должны выглядеть примерно так, как показано, что узлы оцеплены:

    node/aks-nodepool1-12345678-vmss000000 cordoned
    node/aks-nodepool1-12345678-vmss000001 cordoned
    node/aks-nodepool1-12345678-vmss000002 cordoned
    

Очистка существующих узлов

Важно

Для успешного очистки узлов и вытеснения запущенных модулей pod убедитесь, что все модули PodDisruptionBudgets (PDBS) позволяют перемещать по крайней мере одну реплику pod одновременно. В противном случае операция дренирования/выселения завершается ошибкой. Чтобы проверить это, можно запустить kubectl get pdb -A и убедиться, что ALLOWED DISRUPTIONS не меньше 1.

Когда вы освобождаете узлы, поды, работающие на них, вытесняются и воссоздаются на других узлах, доступных для планирования.

  1. Выполните очистку существующих узлов с помощью kubectl drain команды и --ignore-daemonsets--delete-emptydir-data флагов, указав нужные узлы в разделенном пробелом списке. Рассмотрим пример.

    Важно

    Использование --delete-emptydir-data требуется для вытеснения pod, созданных AKS, таких как coredns и metrics-server. Если этот флаг не используется, вы получите ошибку. Дополнительные сведения см. в документации по emptydir.

    kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data
    
  2. После завершения операции очистки все поды (за исключением подов, управляемых демон-сетами) должны работать в новом пуле узлов. Это можно проверить с помощью kubectl get pods команды.

    kubectl get pods -o wide -A
    

Устранение проблем с вытеснением pod

При очистке узлов может возникнуть следующая ошибка:

Error when evicting pods/[podname] -n [namespace] (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.

По умолчанию в вашем кластере имеются управляемые системой AKS бюджеты прерываний подов (например, coredns-pdb или konnectivity-agent) с параметром MinAvailable значением 1. Например, если выполняется два coredns модуля pod, одновременно может быть нарушено только одно из них. Хотя один из них создается повторно и недоступен, другой coredns модуль pod не может быть вытеснен из-за нарушения бюджета pod. Эта проблема устраняется после планирования и запуска начального coredns модуля, что позволяет второму модулю быть правильно вытесненным и заново созданным.

Tip

Рассмотрите возможность очистки узлов по одному для более плавного вытеснения и предотвращения регулирования. Дополнительные сведения можно найти здесь

Удаление существующего пула узлов

Важно

При удалении пула узлов AKS не выполняет кордон и очистку. Чтобы свести к минимуму нарушение работы модулей pod, работающих в пуле узлов, который вы планируете удалить, выполните выставление ограничения и очистку всех узлов в этом пуле перед удалением.

  1. Удалите исходный пул узлов с помощью az aks nodepool delete команды.

    az aks nodepool delete \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name nodepool1
    
  2. Убедитесь, что в вашем кластере AKS есть только новый пул узлов, и приложения и поды работают должным образом, используя команду kubectl get nodes.

    kubectl get nodes
    

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

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   63m   v1.21.9
    

Дальнейшие шаги

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