Partilhar via


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

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

Descrição geral

O mecanismo de agendamento AKS é responsável por colocar pods em nós e é baseado no agendador Kubernetes upstream, 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 afinidade de nó ou instruindo o nó a repelir um conjunto de pods usando manchas de nó, que interagem com o agendador AKS.

Tintas de nó funcionam ao marcar um nó para que o agendador evite colocar certos pods nesses nós. Você pode colocar tolerações em um pod para permitir que o agendador programe esse pod em um nó com uma mancha correspondente. Manchas e tolerâncias trabalham juntas para ajudá-lo a controlar como o agendador coloca pods em nós. Para obter mais informações, consulte exemplos de casos de uso de manchas e tolerâncias.

Taints são pares chave-valor com um efeito. Há três valores para o campo de efeito ao usar manchas de nó: NoExecute, NoSchedulee PreferNoSchedule.

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

Opções de mancha de nó

Existem dois tipos de marcas de nó que podem ser aplicadas aos seus nós AKS: marcas de nó e marcas de inicialização de nó.

  • As marcações de nó destinam-se a permanecer permanentemente no nó para programar pods com afinidade de nó. As manchas de nó só podem ser adicionadas, atualizadas ou removidas completamente usando a API AKS.
  • As contaminações de inicialização do nó são colocadas no nó no momento da inicialização e devem ser usadas temporariamente, como em cenários em que pode precisar de tempo extra para configurar os nós. Você pode remover a mancha de inicialização do nó usando a API do Kubernetes e eles não são garantidos durante o ciclo de vida do nó. Eles aparecerão em novas réplicas do nó quando ele for ampliado ou em todas as réplicas quando um nó for atualizado. Se você quiser remover completamente as manchas de inicialização, poderá removê-las usando a API AKS depois de desmanchar os nós usando a API do Kubernetes. Depois de remover as manchas de inicialização da especificação do cluster usando a API do AKS, os nós recém-criados não apresentam essas manchas de inicialização. Se a mancha de inicialização ainda estiver presente nos nós existentes, você poderá removê-la permanentemente executando uma operação de atualização de imagem de nó.

Nota

Os taints e rótulos aplicados aos nós usando a API do pool de nós AKS não são modificáveis a partir da API do Kubernetes e vice-versa. Não são permitidas modificações nas contaminações do sistema.

Isso não se aplica a manchas de inicialização de nó.

Usar tintes de nó

Pré-requisitos

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

Crie um pool de nós com uma marcação de nó

  1. Crie um pool de nós com uma marca (taint) usando o comando az aks nodepool add e utilize o parâmetro --node-taints para especificar sku=gpu:NoSchedule para a marca.

    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 a mancha está definida no nó.

Atualizar um pool de nós para adicionar uma mancha de nó

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

    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 a mancha foi definida no nó.

Usar manchas de inicialização de nó (visualização)

Importante

Os recursos de pré-visualização do AKS estão disponíveis em base de autoatendimento e aderência voluntária. As visualizações prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As visualizações do AKS são parcialmente cobertas pelo suporte ao cliente numa base de melhor esforço. Como tal, estas funcionalidades não se destinam a utilização em produção. Para obter mais informações, consulte os seguintes artigos de suporte:

Pré-requisitos e limitações

  • Você precisa ter a versão 3.0.0b3 ou posterior da CLI do Azure instalada e configurada. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).
  • Só pode aplicar taints de inicialização ao criar ou atualizar um cluster utilizando a API AKS. Se estiver a utilizar um modelo ARM que resulte numa operação ao nível de Cluster Gerenciado, pode especificar tolerâncias de inicialização de nó durante a criação e atualização do pool de nós. As operações no nível do Agentpool são bloqueadas quando NodeInitializationTaints estão presentes no corpo da solicitação.
  • Não é possível aplicar manchas de inicialização a pools de nós do Windows usando a CLI do Azure.

Obtenha as credenciais para o seu cluster

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

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

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

  • Registe 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
    

Registar a flag de funcionalidade NodeInitializationTaintsPreview

  1. Registe a flag de funcionalidade NodeInitializationTaintsPreview usando o comando az feature register.

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

    Leva alguns minutos para que o status mostre Registrado.

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

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

    az provider register --namespace Microsoft.ContainerService
    

Criar um cluster com uma restrição de inicialização de nó

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

    Importante

    As marcações de inicialização dos nós especificadas aplicam-se a todos os pools de nós no agrupamento. Para aplicar a mancha de inicialização a um nó específico, você pode usar um modelo 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" \
        --generate-ssh-keys
    
  2. Verifique o status do pool de nós.

  3. Verifique se a mancha está definida no nó.

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

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

    Importante

    Ao atualizar um cluster com uma mancha de inicialização de nó, as manchas se aplicam a todos os pools de nós no cluster. Se os nós estiverem usando o VMSS, você poderá exibir atualizações para as manchas de inicialização do nó no nó depois que o modelo VMSS do nó for atualizado (por exemplo, após uma operação de atualização da versão da imagem do nó). As manchas de inicialização não aparecerão em seus nós até que ocorra uma operação que acione uma atualização de modelo VMSS.

    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 a mancha está definida no nó.

Verificar o status do pool de nós

  • Depois de aplicar a tintura de nó ou a tintura 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 manchas de nó, a saída de exemplo a seguir mostra que o <node-pool-name> pool de nós é Creating de nós com o especificado nodeTaints:

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

    Se aplicou marcas de inicialização de nós, o exemplo de saída a seguir mostra que o <node-pool-name> grupo de nós contém Creating nós com o especificado nodeInitializationTaints.

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

Verifique se a mancha está definida no nó

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

    kubectl describe node $NODE_NAME
    

    Se aplicar tolerâncias de nó, a seguinte saída de exemplo mostra que o <node-pool-name> conjunto de nós possui as especificações Taints.

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

Importante

Se os nós estiverem usando o VMSS, as manchas de inicialização do nó não serão visíveis nos nós reais do cluster até que ocorra uma operação que acione a atualização do modelo VMSS (por exemplo, atualização da versão do Kubernetes ou atualização da versão da imagem do nó).

Remover manchas de nó

Remover uma marcação específica de nó

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

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

Remova todas as manchas de nó

  • Remova todas as contaminações de nó de um pool de nós usando o comando az aks nodepool update. O seguinte comando de exemplo remove todas as marcas da pool de nós.

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

Remover manchas de inicialização de nó

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

  • Remova temporariamente as manchas de inicialização do nó usando a API do Kubernetes. Se você removê-los dessa forma, as manchas reaparecerão após o dimensionamento ou atualização do nó. Novos nós ainda têm a restrição de inicialização do nó após o dimensionamento. As perturbações de inicialização aparecem em todos os nós após a atualização.
  • Remova as manchas de inicialização do nó permanentemente desmantendo o nó usando a API do Kubernetes e, em seguida, removendo a mancha usando a API do AKS. Depois que as manchas de inicialização são removidas das especificações do cluster usando a API do AKS, os nós recém-criados após as operações de reimagem não têm mais manchas de inicialização.

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

Remover temporariamente as manchas de inicialização do nó

  • Remova as manchas de inicialização do nó temporariamente usando o kubectl taint nodes comando.

    Este comando remove a mancha apenas do nó especificado. Se você quiser remover a mancha de cada nó no pool de nós, você precisa executar o comando para cada nó do qual deseja remover a mancha.

    kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
    

    Depois de removidas, as manchas de inicialização do nó reaparecem após a expansão ou atualização do nó.

Remover manchas de inicialização do nó permanentemente

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

  2. Remova a mancha do nó usando a API AKS usando o az aks update comando. Este comando remove a tinta de inicialização de nós de todos os nós do cluster.

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

Verifique se a mancha foi removida do nó

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

    kubectl describe node $NODE_NAME
    

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

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

Próximos passos