Manutenção de nós

KubernetesBeginner
Pratique Agora

Introdução

Em um ambiente Kubernetes de produção, os nós frequentemente precisam passar por manutenção. O desafio é fazer isso sem causar interrupções desnecessárias nas cargas de trabalho.

Imagine que o nó seja um quarto de hotel e que os pods sejam os hóspedes. Se você precisar reformar o quarto, ou seja, realizar uma manutenção, não poderá simplesmente entrar enquanto os hóspedes estiverem dormindo. É necessário seguir um processo seguro e cuidadoso.

Neste laboratório, você aprenderá o fluxo de trabalho padrão para a manutenção de um nó:

  • Cordon (Não perturbe): coloque na porta uma placa dizendo “Não aceitar novos hóspedes”. O hotel, representado pelo scheduler, deixa de enviar novas pessoas para esse quarto.
  • Drain (Retirar): peça educadamente aos hóspedes atuais que saiam e transfira-os para outro quarto disponível.
  • Manutenção: realize o trabalho necessário, como uma reforma.
  • Uncordon (Reabrir): remova a placa e permita o agendamento novamente.

Você trabalhará com um cluster local do Minikube para simular esse processo.

Aplicar cordon ao nó

Antes de realizar qualquer manutenção, precisamos garantir que o scheduler do Kubernetes não coloque novos pods no nó em que vamos trabalhar. Esse processo é chamado de “cordoning”. É como colocar na porta do quarto uma placa de “Não perturbe” ou “Fora de serviço”.

Essa é uma decisão de agendamento, não um desligamento. Um nó marcado com cordon pode continuar saudável e executando os pods existentes. O Kubernetes apenas o marca como indisponível para novos posicionamentos, permitindo que você inicie a manutenção de forma controlada.

Primeiro, identifique o nome do nó. Execute o comando a seguir:

kubectl get nodes

Você deverá ver um nó listado, por exemplo, minikube, com o status Ready.

Para marcar o nó como não programável, use o comando cordon. Usaremos uma substituição de comando $() para obter automaticamente o nome do nó:

kubectl cordon $(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')

Agora, verifique novamente o status do nó:

kubectl get nodes

O status deverá mudar para Ready,SchedulingDisabled. Isso confirma que o nó foi marcado com cordon. Nenhum novo pod será agendado nele, mas os pods existentes continuarão em execução.

Drenar o nó

O cordon impede apenas a entrada de novos pods. Ainda temos aplicações em execução, ou seja, os “hóspedes” no quarto. Para removê-las com segurança, usamos o comando drain.

Esse comando remove os pods por eviction. Em seguida, o Kubernetes percebe que o número desejado de réplicas, que é 2, não foi atingido e tenta criar substitutos em outros nós disponíveis.

A palavra evict é importante aqui. O drain não deve interromper os pods de forma abrupta. Ele solicita que as cargas de trabalho saiam de maneira compatível com o Kubernetes, para que os controladores possam substituí-las e as regras de término sejam respeitadas. Por isso, drain é mais seguro do que excluir manualmente processos aleatórios no nó.

Execute o comando de drain. Precisamos adicionar algumas opções para forçar a remoção neste ambiente:

  • --ignore-daemonsets: alguns pods do sistema, gerenciados por DaemonSets, estão vinculados ao nó e não podem ser movidos. Vamos ignorá-los.
  • --delete-emptydir-data: se um pod usar armazenamento temporário local, o drain excluirá esses dados. Estamos confirmando que isso é aceitável.
  • --force: necessário para excluir pods que não são gerenciados por um ReplicationController, ReplicaSet, Job, DaemonSet ou StatefulSet, como o storage-provisioner no Minikube.
kubectl drain $(kubectl get nodes -o jsonpath='{.items[0].metadata.name}') --ignore-daemonsets --delete-emptydir-data --force

Você verá uma saída indicando que os pods estão sendo removidos.

Observação: neste laboratório do Minikube com um único nó, quando drenarmos o único nó, os pods serão removidos, mas ficarão no estado Pending. Isso acontece porque “não há outros quartos no hotel” para onde transferi-los. Em um cluster real com vários nós, eles seriam movidos imediatamente para um nó saudável.

Verificar o status

Depois de drenar o nó, é importante verificar o que aconteceu com as aplicações.

Esta etapa ensina um hábito importante de administração de clusters: não pare depois de executar um comando de manutenção. Sempre examine o resultado do agendamento do ponto de vista da carga de trabalho. Uma ação de manutenção só é bem-sucedida se as aplicações forem executadas no local esperado.

Verifique o status dos pods:

kubectl get pods

Como mencionado, provavelmente você verá os pods no estado Pending.

Para entender por que eles estão pendentes, peça mais informações ao Kubernetes. Descreva um dos pods:

kubectl describe pod $(kubectl get pods -o jsonpath='{.items[0].metadata.name}')

Procure a seção Events na parte inferior. Você deverá ver uma mensagem semelhante a “0/1 nodes are available: 1 node(s) are unschedulable.”

Isso confirma que o drain foi bem-sucedido. O scheduler quer executar o pod, mas respeita a placa de “Não perturbe” que colocamos no único nó disponível.

Remover o cordon do nó

Imagine que você terminou a “reforma”, como uma atualização do sistema operacional ou outra manutenção. É hora de reabrir o quarto e colocar o nó novamente em operação.

O uncordon simplesmente remove o bloqueio de agendamento. Ele não força os pods a serem colocados imediatamente no nó. Em vez disso, informa ao scheduler que o nó voltou a estar elegível para futuros posicionamentos; depois, a reconciliação normal assume o controle.

Para fazer isso, usamos o comando uncordon. Ele remove a placa de “Não perturbe”.

kubectl uncordon $(kubectl get nodes -o jsonpath='{.items[0].metadata.name}')

Agora, verifique o status do nó:

kubectl get nodes

O status deverá voltar para Ready; a indicação SchedulingDisabled terá desaparecido.

Por fim, verifique novamente os pods. Como o nó está disponível, o scheduler do Kubernetes deverá colocar os pods que estão em Pending novamente nesse nó.

kubectl get pods

Você deverá vê-los passar de Pending para ContainerCreating e, finalmente, para Running.

Resumo

Neste laboratório, você praticou o ciclo seguro de manutenção de um nó do Kubernetes. Você aprendeu a:

  1. Aplicar cordon a um nó para marcá-lo como não programável (Não perturbe).
  2. Drenar um nó para remover com segurança as cargas de trabalho em execução.
  3. Remover o cordon de um nó para colocá-lo novamente em operação.

Esses comandos são essenciais para administradores de sistemas garantirem alta disponibilidade. Eles permitem reparar a infraestrutura sem causar indisponibilidade nas aplicações — em um cluster com vários nós, é claro!