Поделиться через


Управление пулами узлов для кластера в Служба Azure Kubernetes (AKS)

В службе Azure Kubernetes Service (AKS) узлы одной и той же конфигурации группируются в пулы узлов. Эти узлы содержат базовые виртуальные машины, на которых выполняются ваши приложения. При создании кластера AKS вы определяете начальное число узлов и их размер (SKU). По мере изменения требований приложения может потребоваться изменить параметры пулов узлов. Например, может потребоваться масштабировать количество узлов в пуле узлов или обновить версию пула узлов Kubernetes.

В этой статье показано, как управлять одним или несколькими пулами узлов в кластере AKS.

Подготовка к работе

Ограничения

При создании и администрировании кластеров AKS, поддерживающих несколько пулов узлов, действуют следующие ограничения:

  • См. раздел Квоты, ограничения размера виртуальной машины и доступность региона в службе Kubernetes Azure (AKS).
  • Системные пулы должны содержать по крайней мере один узел, а пулы пользовательских узлов могут содержать ноль или несколько узлов.
  • Размер виртуальной машины для пула узлов нельзя изменить после создания.
  • При создании нескольких пулов узлов во время создания кластера все версии Kubernetes, используемые пулами узлов, должны соответствовать версии уровня управления. После подготовки кластера можно вносить обновления с помощью операций пула узлов.
  • Вы не можете одновременно запускать операции обновления и масштабирования в кластере или пуле узлов. Если вы пытаетесь запустить их одновременно, вы получите сообщение об ошибке. Каждый тип операции должен завершиться на целевом ресурсе до следующего запроса на тот же ресурс. Дополнительные сведения см. в руководстве по устранению неполадок.

Обновление пула отдельных узлов

Примечание.

Версия образа ОС пула узлов привязана к версии Kubernetes кластера. После обновления кластера вы получаете только обновления образа ОС.

В этом примере мы обновим пул узлов mynodepool . Так как существует два пула узлов, мы должны использовать az aks nodepool upgrade команду для обновления.

  1. Проверьте наличие доступных обновлений az aks get-upgrades с помощью команды.

    az aks get-upgrades --resource-group myResourceGroup --name myAKSCluster
    
  2. Обновите пул узлов mynodepool с помощью az aks nodepool upgrade команды.

    az aks nodepool upgrade \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name mynodepool \
        --kubernetes-version KUBERNETES_VERSION \
        --no-wait
    
  3. Выведите список состояний пулов узлов с помощью 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, связанными с ними:

  1. Версия Kubernetes уровня управления кластером и
  2. Пул узлов с версией 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 объявление возвращается к существующей версии, определенной для пула узлов. Если ничего не задано, она использует версию уровня управления для возврата.
    • Вы не можете одновременно отправлять несколько операций в одном уровне управления или ресурсе пула узлов. Вы можете обновить или масштабировать плоскость управления или пул узлов в определенное время.

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

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

  1. Масштабируйте количество узлов в пуле узлов с помощью az aks node pool scale команды.

    az aks nodepool scale \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name mynodepool \
        --node-count 5 \
        --no-wait
    
  2. Выведите список состояний пулов узлов с помощью 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, работающих в настоящее время на виртуальной машине, которые вы планируете удалить, выполните кордон и очистку на виртуальной машине перед удалением. Дополнительные сведения о кордоне и очистке см. в примере сценария, предоставленного в руководстве по изменение размера пулов узлов.

  1. Перечислить существующие узлы с помощью 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
    
  2. Удалите указанные виртуальные машины с помощью 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>
    
  3. Убедитесь, что виртуальные машины успешно удалены с помощью 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.

  1. Создайте пул узлов с помощью 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
    
  2. Проверьте состояние пула узлов с помощью 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 на узле в этом пуле узлов.

  1. Создайте файл 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"
    
  2. Запланируйте модуль pod с помощью kubectl apply команды.

    kubectl apply -f nginx-toleration.yaml
    

    Планирование объекта Pod и извлечение образа NGINX займет несколько секунд.

  3. Проверьте состояние с помощью 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.

  1. Создайте шаблон, например 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"
                }
            }
        ]
    }
    
  2. Разверните шаблон с помощью az deployment group create команды.

    az deployment group create \
        --resource-group myResourceGroup \
        --template-file aks-agentpools.json
    

    Совет

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

    ...
    "resources": [
    {
      ...
      "properties": {
        ...
        "tags": {
          "name1": "val1"
        },
        ...
      }
    }
    ...
    

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

Следующие шаги