Управление пулами узлов для кластера в Служба Azure Kubernetes (AKS)
В службе Azure Kubernetes Service (AKS) узлы одной и той же конфигурации группируются в пулы узлов. Эти узлы содержат базовые виртуальные машины, на которых выполняются ваши приложения. При создании кластера AKS вы определяете начальное число узлов и их размер (SKU). По мере изменения требований приложения может потребоваться изменить параметры пулов узлов. Например, может потребоваться масштабировать количество узлов в пуле узлов или обновить версию пула узлов Kubernetes.
В этой статье показано, как управлять одним или несколькими пулами узлов в кластере AKS.
Подготовка к работе
- Ознакомьтесь с разделом "Создание пулов узлов" для кластера в Служба Azure Kubernetes (AKS), чтобы узнать, как создавать пулы узлов для кластеров AKS.
- Необходимо установить и настроить Azure CLI версии 2.2.0 или более поздней. Чтобы узнать версию, выполните команду
az --version
. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0. - Просмотрите параметры хранилища для приложений в Служба Azure Kubernetes, чтобы спланировать конфигурацию хранилища.
Ограничения
При создании и администрировании кластеров AKS, поддерживающих несколько пулов узлов, действуют следующие ограничения:
- См. раздел Квоты, ограничения размера виртуальной машины и доступность региона в службе Kubernetes Azure (AKS).
- Системные пулы должны содержать по крайней мере один узел, а пулы пользовательских узлов могут содержать ноль или несколько узлов.
- Размер виртуальной машины для пула узлов нельзя изменить после создания.
- При создании нескольких пулов узлов во время создания кластера все версии Kubernetes, используемые пулами узлов, должны соответствовать версии уровня управления. После подготовки кластера можно вносить обновления с помощью операций пула узлов.
- Вы не можете одновременно запускать операции обновления и масштабирования в кластере или пуле узлов. Если вы пытаетесь запустить их одновременно, вы получите сообщение об ошибке. Каждый тип операции должен завершиться на целевом ресурсе до следующего запроса на тот же ресурс. Дополнительные сведения см. в руководстве по устранению неполадок.
Обновление пула отдельных узлов
Примечание.
Версия образа ОС пула узлов привязана к версии Kubernetes кластера. После обновления кластера вы получаете только обновления образа ОС.
В этом примере мы обновим пул узлов mynodepool . Так как существует два пула узлов, мы должны использовать az aks nodepool upgrade
команду для обновления.
Проверьте наличие доступных обновлений
az aks get-upgrades
с помощью команды.az aks get-upgrades --resource-group myResourceGroup --name myAKSCluster
Обновите пул узлов mynodepool с помощью
az aks nodepool upgrade
команды.az aks nodepool upgrade \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name mynodepool \ --kubernetes-version KUBERNETES_VERSION \ --no-wait
Выведите список состояний пулов узлов с помощью
az aks nodepool list
команды.az aks nodepool list --resource-group myResourceGroup --cluster-name myAKSCluster
В следующем примере выходных данных показано, что mynodepool находится в состоянии обновления :
[ { ... "count": 3, ... "name": "mynodepool", "orchestratorVersion": "KUBERNETES_VERSION", ... "provisioningState": "Upgrading", ... "vmSize": "Standard_DS2_v2", ... }, { ... "count": 2, ... "name": "nodepool1", "orchestratorVersion": "1.15.7", ... "provisioningState": "Succeeded", ... "vmSize": "Standard_DS2_v2", ... } ]
Обновление узлов до указанной версии занимает несколько минут.
Рекомендуется обновить все пулы узлов в кластере AKS до одной версии Kubernetes. Поведение по умолчанию az aks upgrade
— обновление всех пулов узлов вместе с уровнем управления для достижения этого выравнивания. Возможность обновления индивидуальных пулов узлов позволяет выполнять последовательное обновление и распланировать обновление модулей Pod в пулах узлов, чтобы поддерживать время работы приложения в указанных выше ограничениях.
Обновление уровня управления кластера с несколькими пулами узлов
Примечание.
Kubernetes использует стандартную схему управления версиями. См. раздел Семантическое управление версиями. Номер версии выражается в виде x. y. z, где x — основная версия, y — дополнительный номер версии, а z — версия исправления. Например, в версии 1.12.6 1 — основной номер версии, 12 — дополнительный номер версии, а 6 — версия исправления. Версия Kubernetes плоскости управления и начальный пул узлов устанавливаются во время создания кластера. Другие пулы узлов имеют набор версий Kubernetes при добавлении в кластер. Версии Kubernetes могут отличаться между пулами узлов и между пулом узлов и плоскостью управления.
Кластер AKS имеет два объекта ресурсов кластера с версиями Kubernetes, связанными с ними:
- Версия Kubernetes уровня управления кластером и
- Пул узлов с версией Kubernetes.
Плоскость управления сопоставляется с одним или несколькими пулами узлов. Поведение операции обновления зависит от используемой команды Azure CLI.
az aks upgrade
обновляет плоскость управления и все пулы узлов в кластере до одной версии Kubernetes.az aks upgrade
--control-plane-only
при обновлении флага выполняется обновление только плоскости управления кластером и оставляет все пулы узлов без изменений.az aks nodepool upgrade
обновляет только целевой пул узлов с указанной версией Kubernetes.
Правила проверки для обновлений
Обновления Kubernetes для плоскости управления кластером и пулов узлов проверяются с помощью следующих наборов правил:
Правила для допустимых версий для обновления пулов узлов:
- Версия пула узлов должна иметь ту же основную версию, что и уровень управления.
- Дополнительная версия пула узлов должна быть в пределах двух промежуточных дополнительных версий уровня управления.
- Версия пула узлов не может быть больше версии
major.minor.patch
.
Правила отправки операции обновления:
- Нельзя перейти на более раннюю версию уровня управления или пула узлов Kubernetes.
- Если версия Kubernetes пула узлов не указана, поведение зависит от клиента. В шаблонах Resource Manager объявление возвращается к существующей версии, определенной для пула узлов. Если ничего не задано, она использует версию уровня управления для возврата.
- Вы не можете одновременно отправлять несколько операций в одном уровне управления или ресурсе пула узлов. Вы можете обновить или масштабировать плоскость управления или пул узлов в определенное время.
Масштабирование пула узлов вручную
По мере изменения требований к рабочей нагрузке приложения может потребоваться масштабирование количества узлов в пуле узлов. Число узлов можно увеличивать или уменьшать.
Масштабируйте количество узлов в пуле узлов с помощью
az aks node pool scale
команды.az aks nodepool scale \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name mynodepool \ --node-count 5 \ --no-wait
Выведите список состояний пулов узлов с помощью
az aks node pool list
команды.az aks nodepool list --resource-group myResourceGroup --cluster-name myAKSCluster
В следующем примере выходных данных показано, что mynodepool находится в состоянии масштабирования с новым числом пяти узлов:
[ { ... "count": 5, ... "name": "mynodepool", "orchestratorVersion": "1.15.7", ... "provisioningState": "Scaling", ... "vmSize": "Standard_DS2_v2", ... }, { ... "count": 2, ... "name": "nodepool1", "orchestratorVersion": "1.15.7", ... "provisioningState": "Succeeded", ... "vmSize": "Standard_DS2_v2", ... } ]
Операция масштабирования занимает несколько минут.
Автоматическое масштабирование определенного пула узлов с помощью автомасштабирования кластера
AKS предлагает отдельную функцию автоматического масштабирования пулов узлов с помощью функции, которая называется Автомасштабирование кластера. Эту функцию можно включить с уникальными минимальными и максимальными счетчиками масштабирования на пул узлов.
Дополнительные сведения см. в статье об использовании автомасштабирования кластера.
Удаление определенных виртуальных машин в существующем пуле узлов
Примечание.
При удалении виртуальной машины с помощью этой команды AKS не выполняет кордон и очистку. Чтобы свести к минимуму прерывание планирования модулей pod, работающих в настоящее время на виртуальной машине, которые вы планируете удалить, выполните кордон и очистку на виртуальной машине перед удалением. Дополнительные сведения о кордоне и очистке см. в примере сценария, предоставленного в руководстве по изменение размера пулов узлов.
Перечислить существующие узлы с помощью
kubectl get nodes
команды.kubectl get nodes
Выходные данные должны выглядеть примерно так:
NAME STATUS ROLES AGE VERSION aks-mynodepool-20823458-vmss000000 Ready agent 63m v1.21.9 aks-mynodepool-20823458-vmss000001 Ready agent 63m v1.21.9 aks-mynodepool-20823458-vmss000002 Ready agent 63m v1.21.9
Удалите указанные виртуальные машины с помощью
az aks nodepool delete-machines
команды. Обязательно замените заполнители собственными значениями.az aks nodepool delete-machines \ --resource-group <resource-group-name> \ --cluster-name <cluster-name> \ --name <node-pool-name> --machine-names <vm-name-1> <vm-name-2>
Убедитесь, что виртуальные машины успешно удалены с помощью
kubectl get nodes
команды.kubectl get nodes
Выходные данные больше не должны включать виртуальные машины, указанные в команде
az aks nodepool delete-machines
.
Связывание групп резервирования емкости с пулами узлов
По мере изменения требований рабочей нагрузки можно связать существующие группы резервирования емкости с пулами узлов, чтобы гарантировать выделенную емкость пулов узлов.
Предварительные требования для использования групп резервирования емкости с AKS
Используйте интерфейс командной строки 2.56 или более поздней версии и API версии 2023-10-01 или более поздней.
Группа резервирования емкости уже должна существовать и должна содержать минимальное резервирование емкости, в противном случае пул узлов добавляется в кластер с предупреждением и не связана группа резервирования емкости. Дополнительные сведения см . в группах резервирования емкости.
Необходимо создать управляемое удостоверение, назначаемое пользователем, для группы ресурсов, содержащей группу резервирования емкости (CRG). Назначаемые системой управляемые удостоверения не будут работать для этой функции. В следующем примере замените переменные среды собственными значениями.
IDENTITY_NAME=myID RG_NAME=myResourceGroup CLUSTER_NAME=myAKSCluster VM_SKU=Standard_D4s_v3 NODE_COUNT=2 LOCATION=westus2 az identity create --name $IDENTITY_NAME --resource-group $RG_NAME IDENTITY_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RG_NAME --query identity.id -o tsv)
Необходимо назначить
Contributor
роль назначенному пользователем удостоверению, созданному выше. Дополнительные сведения см. в разделе "Действия по назначению роли Azure".Создайте новый кластер и назначьте только что созданное удостоверение.
az aks create \ --resource-group $RG_NAME \ --name $CLUSTER_NAME \ --location $LOCATION \ --node-vm-size $VM_SKU --node-count $NODE_COUNT \ --assign-identity $IDENTITY_ID \ --generate-ssh-keys
Вы также можете назначить управляемое пользователем удостоверение в существующем управляемом кластере с помощью команды обновления.
az aks update \ --resource-group $RG_NAME \ --name $CLUSTER_NAME \ --location $LOCATION \ --node-vm-size $VM_SKU \ --node-count $NODE_COUNT \ --enable-managed-identity \ --assign-identity $IDENTITY_ID
Связывание существующей группы резервирования емкости с пулом узлов
Свяжите существующую группу резервирования емкости с пулом узлов с помощью az aks nodepool add
команды и укажите группу резервирования емкости с флагом --crg-id
. В следующем примере предполагается, что у вас есть CRG с именем myCRG.
RG_NAME=myResourceGroup
CLUSTER_NAME=myAKSCluster
NODEPOOL_NAME=myNodepool
CRG_NAME=myCRG
CRG_ID=$(az capacity reservation group show --capacity-reservation-group $CRG_NAME --resource-group $RG_NAME --query id -o tsv)
az aks nodepool add --resource-group $RG_NAME --cluster-name $CLUSTER_NAME --name $NODEPOOL_NAME --crg-id $CRG_ID
Связывание существующей группы резервирования емкости с пулом системных узлов
Чтобы связать существующую группу резервирования емкости с пулом системных узлов, свяжите кластер с удостоверением, назначенным пользователем, с ролью участника в CRG и самой CRG во время создания кластера. az aks create
Используйте команду с --assign-identity
флагами и --crg-id
флагами.
IDENTITY_NAME=myID
RG_NAME=myResourceGroup
CLUSTER_NAME=myAKSCluster
NODEPOOL_NAME=myNodepool
CRG_NAME=myCRG
CRG_ID=$(az capacity reservation group show --capacity-reservation-group $CRG_NAME --resource-group $RG_NAME --query id -o tsv)
IDENTITY_ID=$(az identity show --name $IDENTITY_NAME --resource-group $RG_NAME --query identity.id -o tsv)
az aks create \
--resource-group $RG_NAME \
--cluster-name $CLUSTER_NAME \
--crg-id $CRG_ID \
--assign-identity $IDENTITY_ID \
--generate-ssh-keys
Примечание.
Удаление пула узлов неявно разобщает пул узлов из любой связанной группы резервирования емкости перед удалением пула узлов. Удаление кластера неявно разобщает все пулы узлов в этом кластере от связанных групп резервирования емкости.
Примечание.
Невозможно обновить существующий пул узлов с группой резервирования емкости. Рекомендуется связать группу резервирования емкости во время создания пула узлов.
Указание размера виртуальной машины для пула узлов
Возможно, потребуется создать пулы узлов с разными размерами и возможностями виртуальной машины. Например, можно создать пул узлов, содержащий узлы с большим количеством ЦП или памяти или пула узлов, который обеспечивает поддержку GPU. В следующем разделе вы используете тоны и терпимые методы , чтобы сообщить планировщику Kubernetes, как ограничить доступ к модулям pod, которые могут выполняться на этих узлах.
В следующем примере мы создадим пул узлов на основе GPU, использующий размер Standard_NC6s_v3 виртуальной машины. Эти виртуальные машины созданы на базе видеокарты Tesla K80 от NVIDIA. Дополнительные сведения см. в разделе "Доступные размеры для виртуальных машин Linux" в Azure.
Создайте пул узлов с помощью
az aks node pool add
команды. Укажите имя gpunodepool и используйте--node-vm-size
параметр, чтобы указать размер Standard_NC6 .az aks nodepool add \ --resource-group myResourceGroup \ --cluster-name myAKSCluster \ --name gpunodepool \ --node-count 1 \ --node-vm-size Standard_NC6s_v3 \ --no-wait
Проверьте состояние пула узлов с помощью
az aks nodepool list
команды.az aks nodepool list --resource-group myResourceGroup --cluster-name myAKSCluster
В следующем примере выходных данных показано, как пул узлов gpunodepool — создание узлов с указанным vmSize:
[ { ... "count": 1, ... "name": "gpunodepool", "orchestratorVersion": "1.15.7", ... "provisioningState": "Creating", ... "vmSize": "Standard_NC6s_v3", ... }, { ... "count": 2, ... "name": "nodepool1", "orchestratorVersion": "1.15.7", ... "provisioningState": "Succeeded", ... "vmSize": "Standard_DS2_v2", ... } ]
Создание gpunodepool занимает несколько минут.
Указание отметки (taint), метки или тега для пула узлов
При создании пула узлов в него можно добавлять фрагменты, метки или теги. При добавлении отметки, метки или тега все узлы в этом пуле узлов также получают эти отметку, метку или тег.
Внимание
Добавление отметок, меток или тегов в узлы необходимо выполнять с помощью az aks nodepool
для всего пула узлов. Мы не рекомендуем применять kubectl
тоны, метки или теги к отдельным узлам в пуле узлов.
Настройка фрагментов пула узлов
AKS поддерживает два типа тонов узлов: инициализации узлов и инициализации узлов (предварительная версия). Дополнительные сведения см. в разделе "Использование запятых узлов" в кластере Служба Azure Kubernetes (AKS).
Дополнительные сведения о том, как использовать расширенные функции Kubernetes Schedule, см. в статье Рекомендации по использованию расширенных функций планировщика в AKS.
Настройка толерации пула узлов
На предыдущем шаге вы применили sku=gpu:NoSchedule taint при создании пула узлов. В следующем примере манифест YAML использует толер, чтобы разрешить планировщику Kubernetes запускать pod NGINX на узле в этом пуле узлов.
Создайте файл
nginx-toleration.yaml
и скопируйте в него следующий пример кода YAML:apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - image: mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine name: mypod resources: requests: cpu: 100m memory: 128Mi limits: cpu: 1 memory: 2G tolerations: - key: "sku" operator: "Equal" value: "gpu" effect: "NoSchedule"
Запланируйте модуль pod с помощью
kubectl apply
команды.kubectl apply -f nginx-toleration.yaml
Планирование объекта Pod и извлечение образа NGINX займет несколько секунд.
Проверьте состояние с помощью
kubectl describe pod
команды.kubectl describe pod mypod
В следующем сжатом примере выходных данных показано, что применяется толерантность sku=gpu:NoSchedule. В разделе событий планировщик назначил модуль pod узлу aks-taintnp-28993262-vms0000000 :
[...] Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s sku=gpu:NoSchedule Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m48s default-scheduler Successfully assigned default/mypod to aks-taintnp-28993262-vmss000000 Normal Pulling 4m47s kubelet pulling image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine" Normal Pulled 4m43s kubelet Successfully pulled image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine" Normal Created 4m40s kubelet Created container Normal Started 4m40s kubelet Started container
На узлах в taintnp можно планировать только те модули, к которым применена эта толерантность. Все остальные модули pod запланированы в пуле узлов nodepool1 . При создании дополнительных пулов узлов можно использовать тоны и терпимые элементы, чтобы ограничить запланированные модули pod на этих ресурсах узлов.
Настройка меток пула узлов
Дополнительные сведения см. в разделе "Использование меток" в кластере Служба Azure Kubernetes (AKS).
Настройка тегов пула узлов Azure
Дополнительные сведения см. в разделе "Использование тегов Azure" в Служба Azure Kubernetes (AKS).
Управление пулами узлов с помощью шаблона диспетчера ресурсов
При использовании шаблона Azure Resource Manager для создания ресурсов и управления ими можно изменить параметры в шаблоне и повторно развернуть его для обновления ресурсов. С помощью пулов узлов AKS невозможно обновить профиль начального пула узлов после создания кластера AKS. Это означает, что вы не можете обновить существующий шаблон Resource Manager, внести изменения в пулы узлов, а затем повторно развернуть шаблон. Вместо этого необходимо создать отдельный шаблон Resource Manager, который обновляет пулы узлов для существующего кластера AKS.
Создайте шаблон, например
aks-agentpools.json
, и вставьте его в следующий пример манифеста. При необходимости измените значения. В примере шаблона задаются нижеследующие настройки.- Обновляется пул узлов Linux с именем myagentpool для запуска трех узлов.
- Для узлов в пуле применяется запуск Kubernetes версии 1.15.7.
- Определяется размер узла как Standard_DS2_v2.
{ "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "clusterName": { "type": "string", "metadata": { "description": "The name of your existing AKS cluster." } }, "location": { "type": "string", "metadata": { "description": "The location of your existing AKS cluster." } }, "agentPoolName": { "type": "string", "defaultValue": "myagentpool", "metadata": { "description": "The name of the agent pool to create or update." } }, "vnetSubnetId": { "type": "string", "defaultValue": "", "metadata": { "description": "The Vnet subnet resource ID for your existing AKS cluster." } } }, "variables": { "apiVersion": { "aks": "2020-01-01" }, "agentPoolProfiles": { "maxPods": 30, "osDiskSizeGB": 0, "agentCount": 3, "agentVmSize": "Standard_DS2_v2", "osType": "Linux", "vnetSubnetId": "[parameters('vnetSubnetId')]" } }, "resources": [ { "apiVersion": "2020-01-01", "type": "Microsoft.ContainerService/managedClusters/agentPools", "name": "[concat(parameters('clusterName'),'/', parameters('agentPoolName'))]", "location": "[parameters('location')]", "properties": { "maxPods": "[variables('agentPoolProfiles').maxPods]", "osDiskSizeGB": "[variables('agentPoolProfiles').osDiskSizeGB]", "count": "[variables('agentPoolProfiles').agentCount]", "vmSize": "[variables('agentPoolProfiles').agentVmSize]", "osType": "[variables('agentPoolProfiles').osType]", "type": "VirtualMachineScaleSets", "vnetSubnetID": "[variables('agentPoolProfiles').vnetSubnetId]", "orchestratorVersion": "1.15.7" } } ] }
Разверните шаблон с помощью
az deployment group create
команды.az deployment group create \ --resource-group myResourceGroup \ --template-file aks-agentpools.json
Совет
Вы можете добавить тег в пул узлов, добавив свойство тега в шаблон, как показано в следующем примере:
... "resources": [ { ... "properties": { ... "tags": { "name1": "val1" }, ... } } ...
Обновление кластера AKS может занять несколько минут в зависимости от параметров пула узлов и операций, определенных в шаблоне диспетчера ресурсов.
Следующие шаги
- Дополнительные сведения об управлении модулями Pod в пулах узлов см. в разделе рекомендации по использованию расширенных функций планировщика в AKS.
- Использование групп размещения близкого взаимодействия, чтобы сократить задержку приложений AKS.
- Используйте общедоступные IP-адреса уровня экземпляра , чтобы узлы могли напрямую обслуживать трафик.
Azure Kubernetes Service