Trabalhando com Tolerâncias
Agora que entendemos como os taints funcionam, vamos explorar as tolerâncias - o mecanismo que permite que os pods sejam agendados em nós com taints correspondentes.
Entendendo as Tolerâncias
As tolerâncias são especificadas nas especificações do pod e permitem que os pods sejam agendados em nós com taints correspondentes. Uma tolerância consiste em:
key: Corresponde à chave do taint
operator: Equal (corresponde à chave e ao valor) ou Exists (corresponde apenas à chave)
value: O valor a ser correspondido (ao usar o operador Equal)
effect: O efeito a ser correspondido, ou vazio para corresponder a todos os efeitos
tolerationSeconds: Duração opcional durante a qual o pod pode permanecer em um nó com um taint NoExecute correspondente
Criando um Pod com Tolerâncias
Vamos criar um pod que tolera nosso taint do plano de controle. Primeiro, vamos criar um arquivo YAML para nosso pod:
nano ~/project/toleration-pod.yaml
Agora, adicione o seguinte conteúdo ao arquivo:
apiVersion: v1
kind: Pod
metadata:
name: toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
Esta especificação de pod inclui uma tolerância que corresponde ao taint do plano de controle em nosso nó. Salve e saia do arquivo (no nano, pressione Ctrl+O, Enter e depois Ctrl+X).
Agora, vamos criar o pod:
kubectl apply -f ~/project/toleration-pod.yaml
Você deve ver uma saída como:
pod/toleration-pod created
Vamos verificar se o pod foi agendado em nosso nó:
kubectl get pods -o wide
Exemplo de saída:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
toleration-pod 1/1 Running 0 12s 10.244.0.5 minikube <none> <none>
O pod está em execução em nosso nó minikube porque ele tem uma tolerância correspondente ao taint do plano de controle.
Testando com um Pod sem Tolerâncias
Para comparação, vamos criar um pod sem tolerâncias:
nano ~/project/no-toleration-pod.yaml
Adicione o seguinte conteúdo:
apiVersion: v1
kind: Pod
metadata:
name: no-toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
Salve e saia do arquivo e, em seguida, crie o pod:
kubectl apply -f ~/project/no-toleration-pod.yaml
Agora, vamos verificar o status do pod:
kubectl get pods -o wide
Você pode notar que o pod permanece em um estado Pendente:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
no-toleration-pod 0/1 Pending 0 12s <none> <none> <none> <none>
toleration-pod 1/1 Running 0 2m 10.244.0.5 minikube <none> <none>
Vamos verificar por que o pod está pendente:
kubectl describe pod no-toleration-pod
Na seção de eventos, você deve ver algo como:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 45s default-scheduler 0/1 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
Isso confirma que o pod não pôde ser agendado porque não tolera o taint do plano de controle.
Limpeza
Vamos limpar os pods que criamos:
kubectl delete pod toleration-pod no-toleration-pod
Você deve ver:
pod "toleration-pod" deleted
pod "no-toleration-pod" deleted
Parabéns! Agora você entende como os taints e as tolerâncias trabalham juntos para controlar o agendamento de pods no Kubernetes.