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


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

В этой статье описывается, как использовать таинты узлов в кластере службы Azure Kubernetes (AKS).

Обзор

Механизм планирования AKS отвечает за размещение подов на узлах и основан на стандартном планировщике Kubernetes, kube-scheduler. Вы можете ограничить модуль для работы на определенных узлах, подключив его к набору узлов, используя сходство узлов (node affinity), или настроив узел для отталкивания группы модулей с помощью таинтов узла, которые взаимодействуют с планировщиком AKS.

Запятнанные узлы работают так, что планировщик избегает размещения определенных pod на таких узлах. Вы можете разместить допуски на pod, чтобы планировщик мог назначить этот pod на узел с соответствующим пятном. Ограничения и терпимые элементы работают вместе, чтобы управлять тем, как планировщик помещает модули pod на узлы. Подробнее см. примеры использования taints и tolerations.

Таинты — это пары "ключ-значение" с эффектом. При использовании загрязнений узлов имеется три значения для поля эффекта: NoExecute, NoSchedule, и PreferNoSchedule.

  • NoExecute: Модули, уже работающие на узле, немедленно вытесняются, если они не имеют соответствующих допусков. Если модуль pod имеет соответствующую терпимость, его можно вытеснить, если tolerationSeconds они указаны.
  • NoSchedule: на этом узле размещаются только модули с соответствующими разрешениями. Существующие pods не выселяются.
  • PreferNoSchedule: Планировщик избегает размещения любых pod, которые не имеют соответствующей толерантности.

Параметры окраса узла

К узлам AKS могут применяться два типа меток узлов: метки узлов и метки инициализации узлов.

  • Ограничения узлов предназначены для постоянного сохранения на узле для планирования модулей pod с сходством узлов. Теинты узлов можно добавлять, полностью обновлять или удалять только с помощью API AKS.
  • Инициализационные метки (taints) узла размещаются на узле во время загрузки и предназначены для временного использования, например, в сценариях, когда может потребоваться дополнительное время для настройки узлов. Вы можете удалить метку инициализации узла с помощью API Kubernetes, и эта метка не гарантируется во время жизненного цикла узла. Они будут отображаться на новых репликах узла при масштабировании или во всех репликах при обновлении узла. Если вы хотите полностью удалить метки инициализации, их можно удалить с помощью API AKS после удаления меток с узлов с помощью API Kubernetes. После удаления инициализационных меток из спецификации кластера с помощью API AKS, новые узлы не запускаются с этими метками. Если метка инициализации все еще присутствует на существующих узлах, то ее можно полностью удалить, выполнив операцию обновления образа узла.

Примечание.

Пометки и метки узла, применяемые с помощью API пула узлов AKS, не могут быть изменены из API Kubernetes и наоборот. Изменения системных меток не допускаются.

Это не относится к инициализации узлов.

Использование таинтов узлов

Предварительные условия

В этой статье предполагается, что у вас есть существующий кластер AKS. Если вам нужен кластер AKS, можно создать его с помощью Azure CLI, Azure PowerShell или портал Azure.

Создайте пул узлов с пометкой узла

  1. Создайте пул узлов с taint с помощью команды az aks nodepool add и используйте параметр --node-taints, чтобы указать sku=gpu:NoSchedule для taint.

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-count 1 \
        --node-taints "sku=gpu:NoSchedule" \
        --no-wait
    
  2. Проверьте состояние пула узлов.

  3. Убедитесь, что на узле установлен метка taint.

Обновление пула узлов для добавления анатемы узла

  1. Обновите пул узлов, чтобы добавить метку узла с помощью команды az aks nodepool update и используйте параметр --node-taints, чтобы указать sku=gpu:NoSchedule для метки.

    az aks nodepool update \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-taints "sku=gpu:NoSchedule" \
        --no-wait
    
  2. Проверьте состояние пула узлов.

  3. Убедитесь, что на узле установлен тейнт.

Использование начальных меток узлов (предварительный просмотр)

Внимание

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

Предварительные требования и ограничения

  • Вам нужна версия 3.0.0b3 Azure CLI или более поздняя, установленная и настроенная. Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.
  • Инициализационные метки можно применять только при создании или обновлении кластера через API AKS. При использовании шаблона ARM, который приведет к операции на уровне управляемого кластера, вы можете указать пометки инициализации узлов во время создания и обновления пула узлов. Операции на уровне агентпула блокируются, если в теле запроса присутствует NodeInitializationTaints.
  • Невозможно применить таинты инициализации к пулам узлов Windows с помощью Azure CLI.

Получение учетных данных для кластера

  • Получите учетные данные для кластера AKS с помощью az aks get-credentials команды.

    az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
    

Установка расширения Azure CLI aks-preview

  • Зарегистрируйте или обновите расширение aks-preview с помощью az extension add команды или az extension update команды.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

Регистрация флага компонента NodeInitializationTaintsPreview

  1. NodeInitializationTaintsPreview Зарегистрируйте флаг компонента с помощью az feature register команды.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    

    Через несколько минут отобразится состояние Registered (Зарегистрировано).

  2. Проверьте состояние регистрации с помощью az feature show команды.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    
  3. Когда состояние отражает зарегистрировано, обновите регистрацию поставщика ресурсов Microsoft.ContainerService с помощью az provider register команды.

    az provider register --namespace Microsoft.ContainerService
    

Создайте кластер с инициализацией узла и применением taint

  1. Создайте кластер с инициализацией узла с помощью команды az aks create и параметра --node-initialization-taints, чтобы указать sku=gpu:NoSchedule для taint.

    Внимание

    Указанные вами метки для инициализации узлов применяются ко всем пулам узлов в кластере. Чтобы применить инициализацию к конкретному узлу, можно использовать шаблон ARM вместо интерфейса командной строки.

    az aks create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --node-count 1 \
        --node-init-taints "sku=gpu:NoSchedule" \
        --generate-ssh-keys
    
  2. Проверьте состояние пула узлов.

  3. Убедитесь, что на узле установлен метка taint.

Обновление кластера для добавления метки инициализации узла

  1. Обновите кластер, чтобы добавить метку инициализации узла с помощью команды az aks update и параметра --node-initialization-taints, указывая sku=gpu:NoSchedule для метки.

    Внимание

    При обновлении кластера с меткой инициализации узла метки применяются ко всем пулам узлов в кластере. Если ваши узлы используют VMSS, вы можете просмотреть обновления в метках инициализации узла на самом узле после обновления модели VMSS узла (например, после операции обновления версии образа узла). Метки инициализации не появятся на ваших узлах до тех пор, пока операция, которая вызывает обновление модели масштабируемого набора виртуальных машин (VMSS), не произойдет.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints "sku=gpu:NoSchedule"
    
  2. Проверьте состояние пула узлов.

  3. Убедитесь, что на узле установлен метка taint.

Проверка состояния пула узлов

  • После применения загрязнения узла или инициализации загрязнения проверьте состояние пула узлов с помощью команды az aks nodepool list.

    az aks nodepool list --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME
    

    Если вы применили метки узлов, в следующем примере выходных данных показано, что в <node-pool-name> пуле узлов Creating узлы с указанными nodeTaints.

    [
      {
        ...
        "count": 1,
        ...
        "name": "<node-pool-name>",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

    Если вы применили метки инициализации узлов, в следующем примере выходных данных показано, что в <node-pool-name> пуле узлов находится Creating узлов с указанной nodeInitializationTaints.

    [
      {
        ...
        "count": 1,
        ...
        "name": "<node-pool-name>",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeInitializationTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

Проверьте, установлен ли taint на узле

  • Проверьте метки узлов и метки инициализации узлов в конфигурации узла с помощью команды kubectl describe node.

    kubectl describe node $NODE_NAME
    

    Если применены исключения узлов, в следующем примере результатов показано, что пул узлов <node-pool-name> имеет указанный Taints.

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: sku=gpu:NoSchedule
        ...
        ],
        ...
     ...
    ]
    

Внимание

Если узлы используют VMSS, инициализация узлов не будет отображаться на фактических узлах в кластере до тех пор, пока не будет выполнена операция, которая активирует обновление модели VMSS (например, обновление версии Kubernetes или обновление версии образа узла).

Удаление таинтов узлов

Удаление метки загрязнения определенного узла

  • Удалите таинты узлов с помощью команды az aks nodepool update. Команда в следующем примере удаляет метку узла "sku=gpu:NoSchedule" из пула узлов.

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --name $NODE_POOL_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --node-taints ""
    

Удалить все таинты узлов

  • Удалите все фрагменты узлов из пула узлов с помощью az aks nodepool update команды. В следующем примере команда удаляет все метки узлов из пула узлов.

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $NODE_POOL_NAME \
    --node-taints ""
    

Удаление таинтов инициализации узлов

У вас есть следующие варианты, чтобы удалить метки инициализации узла с узла:

  • Временно удалите метки инициализации узла с помощью Kubernetes API. Если удалить их таким образом, то они вновь появляются после масштабирования узла или обновления. Новые узлы по-прежнему имеют сбой инициализации узла после масштабирования. На всех узлах после обновления появляются загрязнения инициализации узла.
  • Удалите метки инициализации узла безвозвратно, сняв метку с узла через API Kubernetes, а затем удалив метку с помощью API AKS. После удаления проблем инициализации из спецификации кластера с помощью API AKS, вновь созданные узлы после операций восстановления больше не имеют проблем инициализации.

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

Временно удалить метки инициализации узла

  • Временно удалите метки инициализации узла с помощью команды kubectl taint nodes.

    Эта команда удаляет метку только из указанного узла. Если вы хотите удалить фрагмент из каждого узла в пуле узлов, необходимо выполнить команду для каждого узла, из которого требуется удалить фрагмент.

    kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
    

    После удаления инициализация узла повторно появится после масштабирования узла или обновления.

Окончательное удаление тайнтов инициализации узла

  1. Выполните шаги, описанные в разделе «Временное удаление меток инициализации узла», чтобы удалить метку инициализации узла с помощью API Kubernetes.

  2. Удалите пятно с ноды с помощью API AKS, используя команду az aks update. Эта команда удаляет метку инициализации узла с каждого узла в кластере.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints ""
    

Убедитесь, что с узла удалена метка загрязнения.

  • Проверьте метки узлов и метки инициализации узлов в конфигурации узла с помощью команды kubectl describe node.

    kubectl describe node $NODE_NAME
    

    Если вы удалили метку узла, в следующем примере выходных данных показано, что <node-pool-name> пул узлов не содержит удаленной метки в разделе Taints:

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: 
        ...
        ],
        ...
     ...
    ]
    

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