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 setolerationSeconds
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ó
Crie um pool de nós com um taint usando o comando
az aks nodepool add
e use o parâmetro--node-taints
para especificarsku=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
Atualizar um pool de nós para adicionar um taint de nó
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 especificarsku=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
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. Executeaz --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
ouaz 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
Registre o sinalizador de recurso
NodeInitializationTaintsPreview
usando o comandoaz feature register
.az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
Demora alguns minutos para o status exibir Registrado.
Verifique o status do registro usando o comando
az feature show
.az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
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ó
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 especificarsku=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" \ --generate-ssh-keys
Atualizar um cluster para adicionar um taint de inicialização de nó
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 especificarsku=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"
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 onodeTaints
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 onodeInitializationTaints
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 oTaints
:[ ... 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 \ --resource-group $RESOURCE_GROUP_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 \ --resource-group $RESOURCE_GROUP_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
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.
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 ""
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 emTaints
:[ ... Name: <node-pool-name> ... Taints: ... ], ... ... ]
Próximas etapas
- Saiba mais sobre casos de uso de exemplo para taints e tolerâncias.
- Saiba mais sobre práticas recomendadas para recursos avançados do agendador do AKS.
- Saiba mais sobre os rótulos do Kubernetes na Documentação de rótulos do Kubernetes.
Azure Kubernetes Service