Fase 3-cache: Pod crash durante a desconexão - image cache

Ponto BÁSICO e crítico: um pod que crasha durante a desconexão REINICIA? SIM - o kubelet gerencia restartPolicy localmente, sem API server, DESDE QUE a imagem esteja no cache local do containerd.

O restart é SUB-SEGUNDO (imagem em cache), então um curl no VIP não pega o blip - com 2 réplicas nem cai. A forma de visualizar na tela é pelo restart count do container (coluna ATTEMPT do crictl), em dois terminais no node.

Pré-requisito: crictl instalado no node (uma vez). Logue no node:

ssh -i ~/.ssh/id_ecdsa lopbruno@192.168.3.51

Já no node, instale o crictl:

sudo curl -sL "https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.31.1/crictl-v1.31.1-linux-amd64.tar.gz" | sudo tar -C /usr/local/bin -xz
echo "runtime-endpoint: unix:///run/containerd/containerd.sock" | sudo tee /etc/crictl.yaml

Terminal A (no node) - painel ao vivo do restart count. Logue no node:

ssh -i ~/.ssh/id_ecdsa lopbruno@192.168.3.51

E abra o watch do restart count:

sudo watch -n1 'crictl ps -a --name podinfo'

Terminal B (no node) - UM kill único (não repita, senão entra em CrashLoopBackOff). Logue no node (segundo terminal):

ssh -i ~/.ssh/id_ecdsa lopbruno@192.168.3.51

E dê um único kill no container:

sudo crictl stop $(sudo crictl ps --name podinfo -q | head -1)
No Terminal A o container vai para Exited e, em ~2-5s, sobe um novo container Running com ATTEMPT +1 - o kubelet reiniciou da imagem em cache, sem falar com a AWS. Se o kill se repetir várias vezes, o backoff exponencial (10s->20s->40s) atrasa o retorno: o Kubernetes aplica crash-loop backoff localmente, mesmo offline. Faça 1 kill apenas.

O kubelet é autônomo para reiniciar containers - restartPolicy funciona sem control plane. O requisito é a IMAGEM estar no cache local do containerd.

Por isso duas configurações são obrigatórias em produção: pre-pull das imagens críticas em todos os nodes, e GC do containerd configurado para não descartar imagens (discard_unpacked_layers=false).

Sem isso, um crash durante desconexão vira indisponibilidade - o node não consegue puxar do ECR.

Configuração do containerd via nodeadm (prep - já aplicável no nodeConfig):

spec:
  containerd:
    config: |
      [plugins."io.containerd.grpc.v1.cri".containerd]
      discard_unpacked_layers = false