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 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.
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 nodepool
o . 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
- Use rótulos em um cluster do AKS habilitado para Azure Arc.