Compartilhar via


Usar taints do nó em um cluster do AKS (Serviço de Kubernetes do Azure)

Este artigo descreve como usar os taints de nó em um cluster do AKS (Serviço de Kubernetes do Azure).

Visão geral

O mecanismo de agendamento do AKS é responsável por colocar pods em nós e se baseia no agendador upstream do Kubernetes, kube-scheduler. Você pode restringir um pod a ser executado em nós específicos anexando os pods a um conjunto de nós usando a afinidade de nó ou instruindo o nó a repelir um conjunto de pods usando taints de nós, que interagem com o agendador do AKS.

Os taints de nó funcionam marcando um nó para que o agendador evite colocar determinados pods nos nós marcados. Você pode colocar tolerâncias em um pod para permitir que o agendador agende esse pod em um nó com um taint correspondente. Os taints e as tolerâncias funcionam juntos para ajudá-lo a controlar como o agendador coloca pods em nós. Para obter mais informações, consulte exemplo de casos de uso de taints e tolerâncias.

Os taints são pares chave-valor com um efeito. Há três valores para o campo de efeito ao usar taints de nó: NoExecute, NoSchedule e PreferNoSchedule.

  • NoExecute: os pods já em execução no nó serão removidos imediatamente se não tiverem uma tolerância correspondente. Se um pod tiver uma tolerância correspondente, ele poderá ser removido se tolerationSeconds forem especificados.
  • NoSchedule: somente pods com tolerância correspondente são colocados neste nó. Pods existentes não são removidos.
  • PreferNoSchedule: o agendador evita colocar pods que não tenham tolerância correspondente.

Opções de taint de nó

Há dois tipos de taints de nó que podem ser aplicados aos nós do AKS: taints de nó e taint de inicialização de nó.

  • Os taints de nó devem ficar permanentemente no nó para agendar pods com afinidade de nó. Os taints de nó só podem ser adicionados, atualizados ou removidos completamente usando a API do AKS.
  • Os taint de inicialização de nó são colocadas no nó no momento da inicialização e devem ser usados temporariamente, como em cenários em que talvez seja necessário tempo extra para configurar seus nós. Você pode remover o taint de inicialização de nó usando a API do Kubernetes e não é garantido durante o ciclo de vida do nó. Eles aparecem somente depois que um nó é escalado verticalmente ou atualizado/recriado. Os novos nós ainda têm o taint de inicialização de nó após o dimensionamento. Os taints de inicialização de nó aparecem em todos os nós após a atualização. Se você quiser remover completamente os taints de inicialização, poderá removê-los usando a API do AKS depois de desvincular os nós usando a API do Kubernetes. Depois de remover os taints de inicialização da especificação de cluster usando a API do AKS, os nós recém-criados não aparecerão com esses taints de inicialização. Se o taint de inicialização ainda estiver presente em nós existentes, você poderá removê-lo permanentemente executando uma operação de atualização de imagem de nó.

Observação

Os nós e os rótulos aplicados usando a API do pool de nós do AKS não são modificáveis da API do Kubernetes e vice-versa. Modificações em taints do sistema não são permitidas.

Isso não se aplica a contaminações de inicialização de nó.

Usar taints de nó

Pré-requisitos

Este artigo pressupõe que você tenha um cluster do AKS. Se você precisar de um cluster do AKS, crie um usando a CLI do Azure, o Azure PowerShell ou o portal do Azure.

Criar um pool de nós com um taint de nó

  1. Crie um pool de nós com um taint usando o comando az aks nodepool add e use o parâmetro --node-taints para especificar sku=gpu:NoSchedule para o 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. Verifique o status do pool de nós.

  3. Verifique se o taint está definido no nó.

Atualizar um pool de nós para adicionar um taint de nó

  1. Atualize um pool de nós para adicionar um taint de nó usando o comando az aks nodepool update e use o parâmetro --node-taints para especificar sku=gpu:NoSchedule para o taint.

    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. Verifique o status do pool de nós.

  3. Verifique se o taint foi definido no nó.

Usar taints de inicialização de nó (versão prévia)

Importante

As versões prévias do recurso AKS estão disponíveis em uma base de autoatendimento e aceitação. As visualizações são fornecidas "como estão" e "conforme disponíveis" e estão excluídas dos acordos de nível de serviço e da garantia limitada. As versões prévias do AKS são parcialmente cobertas pelo suporte ao cliente em uma base de melhor esforço. Dessa forma, esses recursos não são destinados ao uso em produção. Para obter mais informações, consulte os seguintes artigos:

Pré-requisitos e limitações

  • Será necessária a CLI do Azure versão 3.0.0b3 ou posterior instalada e configurada. Execute az --version para encontrar a versão. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.
  • Você só pode aplicar os taints de inicialização por meio da criação ou atualização do cluster ao usar a API do AKS. Se estiver usando modelos do ARM, você poderá especificar os taints de inicialização de nó durante a criação e a atualização do pool de nós.
  • Você não pode aplicar os taints de inicialização aos pools de nós do Windows usando a CLI do Azure.

Obter as credenciais para o cluster

  • Obtenha as credenciais do cluster do AKS usando o comando az aks get-credentials.

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

Instale a extensão aks-preview da CLI do Azure

  • Registre ou atualize a extensão aks-preview usando o comando az extension add ou 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
    

Registrar o sinalizador de recurso NodeInitializationTaintsPreview

  1. Registre o sinalizador de recurso NodeInitializationTaintsPreview usando o comando az feature register.

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

    Demora alguns minutos para o status exibir Registrado.

  2. Verifique o status do registro usando o comando az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    
  3. Quando o status reflete Registrado, atualize o registro do provedor de recursos Microsoft.ContainerService usando o comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Criar um cluster com um taint de inicialização de nó

  1. Crie um cluster com um taint de inicialização de nó usando o comando az aks create e o parâmetro --node-initialization-taints para especificar sku=gpu:NoSchedule para o taint.

    Importante

    A inicialização do nó que você especifica se aplica a todos os pools de nós no cluster. Para aplicar o taint de inicialização a um nó específico, você pode usar um modelo do ARM em vez da CLI.

    az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --node-init-taints "sku=gpu:NoSchedule"
    
  2. Verifique o status do pool de nós.

  3. Verifique se o taint está definido no nó.

Atualizar um cluster para adicionar um taint de inicialização de nó

  1. Atualize um cluster para adicionar um taint de inicialização de nó usando o comando az aks update e o parâmetro --node-initialization-taints para especificar sku=gpu:NoSchedule para o taint.

    Importante

    Ao atualizar um cluster com um taint de inicialização de nó, os taints se aplicam a todos os pools de nós no cluster. Você pode exibir atualizações para os taints de inicialização de nó no nó após uma operação de nova imagem.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints "sku=gpu:NoSchedule"
    
  2. Verifique o status do pool de nós.

  3. Verifique se o taint está definido no nó.

Verificar o status do pool de nós

  • Depois de aplicar o taint de nó ou o taint de inicialização, verifique o status do pool de nós usando o comando az aks nodepool list.

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

    Se você aplicou os taints de nó, a saída de exemplo a seguir mostra que o pool de nós <node-pool-name> é Creating nós com o nodeTaints especificado:

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

    Se você aplicou os taints de inicialização de nó, a saída de exemplo a seguir mostra que o pool de nós <node-pool-name> é Creating nós com o nodeInitializationTaints especificado:

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

Verificar se o taint está definido no nó

  • Verifique os taints do nó e os taints de inicialização de nó na configuração do nó usando o comando kubectl describe node.

    kubectl describe node $NODE_NAME
    

    Se você aplicou os taints de nó, a saída de exemplo a seguir mostra que o pool de nós <node-pool-name> especificou o Taints:

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

Remover taints de nó

Remover um taint de nó específico

  • Remova os taints de nó usando o comando az aks nodepool update. O comando de exemplo a seguir remove o taint de nó "sku=gpu:NoSchedule" do pool de nós.

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --name $NODE_POOL_NAME \
    --node-taints "sku=gpu:NoSchedule"
    

Remover todos os taints de nó

  • Remova todos os taints de nó de um pool de nós usando o comando az aks nodepool update. O comando de exemplo a seguir remove todos os taints de nó do pool de nós.

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

Remover taints de inicialização de nó

Você tem as seguintes opções para remover os taints de inicialização do nó:

  • Remover os taints de inicialização de nó temporariamente usando a API do Kubernetes. Se você removê-los dessa forma, os taints reaparecerão após a colocação em escala ou a atualização do nó ocorrer. Os novos nós ainda têm o taint de inicialização de nó após o dimensionamento. Os taints de inicialização de nó aparecem em todos os nós após a atualização.
  • Remover os taints de inicialização de nó permanentemente desvinculando o nó usando a API do Kubernetes e removendo o taint usando a API do AKS. Depois que os taints de inicialização são removidos da especificação de cluster usando a API do AKS, os nós recém-criados após as operações de nova imagem não têm mais taints de inicialização.

Quando você remove todas as ocorrências de contaminação de inicialização de réplicas do pool de nós, o taint de inicialização existente pode reaparecer após uma atualização com quaisquer novas contaminações de inicialização.

Remover os taints de inicialização de nó temporariamente

  • Remova os taints de inicialização de nó temporariamente usando o comando kubectl taint nodes.

    Esse comando só remove o taint do nó especificado. Se você quiser remover o taint de cada nó no pool de nós, será necessário executar o comando para cada nó do qual deseja remover o taint.

    kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
    

    Após a remoção, os taints de inicialização de nó reaparecem após a colocação em escala ou a atualização do nó.

Remover os taints de inicialização de nó permanentemente

  1. Siga as etapas em Remover taints de inicialização do nó temporariamente para remover o taint de inicialização do nó usando a API do Kubernetes.

  2. Remova o taint do nó usando a API do AKS usando o comando az aks update. Esse comando remove o taint de inicialização de nó de cada nó no cluster.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints "sku=gpu:NoSchedule"
    

Verifique se o taint foi removido do nó

  • Verifique os taints do nó e os taints de inicialização de nó na configuração do nó usando o comando kubectl describe node.

    kubectl describe node $NODE_NAME
    

    Se você removeu um taint do nó, a saída de exemplo a seguir mostra que o pool de nós <node-pool-name> não tem o taint removido em Taints:

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

Próximas etapas