Compartilhar via


Usar taints de nó em um AKS habilitado pelo cluster do Azure Arc

Aplica-se a: Azure Local, versão 23H2

Este artigo descreve como usar taints de nó em um cluster do AKS.

Visão geral

O mecanismo de agendamento do AKS é responsável por colocar pods em nós e é baseado no agendador upstream do Kubernetes, kube-scheduler. Você pode restringir um pod para ser executado em nós específicos instruindo o nó a rejeitar um conjunto de pods usando taints de nó, 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.

Antes de começar

  • Este artigo pressupõe que você tenha um cluster do AKS. Se você precisar de um cluster do AKS, poderá criar um usando a CLI do Azure, o Azure PowerShell ou o portal do Azure.
  • Ao criar um pool de nós, você pode adicionar taints a ele. Quando você adiciona um taint, todos os nós dentro desse pool de nós também obtêm esse taint.

Importante

Você deve adicionar taints ou rótulos aos nós de todo o pool de nós usando az aksarc nodepoolo . Não recomendamos o uso kubectl para aplicar taints ou rótulos a nós individuais em um pool de nós.

Definir os taints do pool de nós

Criar um pool de nós com uma mancha utilizando o comando az aksarc nodepool add. Especifique o nome taintnp e use o --node-taints parâmetro para especificar sku=gpu:NoSchedule o taint:

az aksarc nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name taintnp \
    --node-count 1 \
    --node-taints sku=gpu:NoSchedule \
    --no-wait

Verifique o status do pool de nós usando o az aksarc nodepool list comando:

az aksarc nodepool list -g myResourceGroup --cluster-name myAKSCluster

A saída de exemplo a seguir mostra que o taintnp pool de nós cria nós com o especificado nodeTaints:

[
  {
    ...
    "count": 1,
    ...
    "name": "taintnp",
    ...
    "provisioningState": "Succeeded",
    ...
    "nodeTaints":  [
      "sku=gpu:NoSchedule"
    ],
    ...
  },
 ...
]

As informações do taint ficam visíveis no Kubernetes para identificar as regras de agendamento para nós. O agendador do Kubernetes pode usar taints e tolerâncias para restringir quais cargas de trabalho podem ser executadas em nós.

  • Um taint é aplicado a um nó que indica que apenas os pods específicos podem ser agendados neles.
  • Uma tolerância é então aplicada a um pod que permite que eles "tolerem" a mácula de um nó.

Definir as tolerâncias do pool de nós

Na etapa anterior, você aplicou o sku=gpu:NoSchedule taint ao criar o pool de nós. O manifesto YAML de exemplo a seguir usa uma tolerância para permitir que o agendador do Kubernetes execute um pod NGINX em um nó nesse pool de nós:

Crie um arquivo chamado nginx-toleration.yaml e copie/cole o seguinte YAML de exemplo:

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"

Agende o Pod usando o comando kubectl apply:

kubectl apply -f nginx-toleration.yaml

Leva alguns segundos para agendar o pod e efetuar pull da imagem NGINX.

Verifique o status usando o kubectl describe pod comando:

kubectl describe pod mypod

A saída de exemplo condensada a seguir mostra que a sku=gpu:NoSchedule tolerância é aplicada. Na seção Eventos, o agendador atribuiu o pod ao moc-lbeof1gn6x3 nó:

[...]
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
                 sku=gpu:NoSchedule
Events:
  Type    Reason     Age    From                Message
  ----    ------     ----   ----                -------
  Normal  Scheduled  54s  default-scheduler   Successfully assigned default/mypod to moc-lbeof1gn6x3
  Normal  Pulling    53s  kubelet             Pulling image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine"
  Normal  Pulled     48s  kubelet             Successfully pulled image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine" in 3.025148695s (3.025157609s including waiting)
  Normal  Created    48s  kubelet             Created container
  Normal  Started    48s  kubelet             Started container

Somente os pods que têm essa tolerância aplicada podem ser agendados em nós no taintnp. Quaisquer outros pods são agendados no pool de nós nodepool1. Se você criar pools de nós adicionais, pode usar outros taints e tolerâncias para limitar quais pods podem ser agendados nesses recursos de nó.

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

Atualize um cluster para adicionar um taint de nó usando o az aksarc update comando e o --node-taints parâmetro a ser especificado sku=gpu:NoSchedule para o taint. Todos os taints existentes são substituídos pelos novos valores. As taints antigas são excluídas:

az aksarc update -g myResourceGroup --cluster-name myAKSCluster --name taintnp --node-taints "sku=gpu:NoSchedule"   

Próximas etapas