Execute kubectl run nginx --image=nginx:1.27 e o Kubernetes cria exatamente um Pod chamado nginx. Apague-o com kubectl delete pod nginx e ele some de vez — ninguém percebe, ninguém o substitui. Um Pod é a menor unidade implantável no Kubernetes: um ou mais containers que compartilham um namespace de rede e um conjunto de volumes, agendados juntos em um único Node.
Esse Pod isolado é um beco sem saída em produção. Se o container dentro dele travar, o kubelet o reinicia no mesmo lugar. Se o Node reiniciar, ou alguém apagar o Pod, nada o recria. Nada guarda a memória de que ele deveria existir.
O que um Deployment adiciona a um Pod
Um Deployment é um objeto do Kubernetes que define quantas cópias de um Pod devem existir e como implantar mudanças nelas. Você para de gerenciar Pods diretamente e passa a descrever o estado desejado; um loop de controle se encarrega de tornar esse estado real. É o mesmo modelo de reconciliação por trás de tudo o mais no Kubernetes.
| |
| |
| |
Três Pods, não um, e nenhum se chama web-app. Esse padrão de nomenclatura (web-app-7d9f8c7b86-4kxqz) é o primeiro sinal de que algo mais está gerenciando esses Pods.
replicas: 3 é a mesma instrução que você dá com docker compose up --scale web=3 no Docker Compose. A diferença é que aqui um controller continua garantindo esse número muito depois de o comando terminar.
Como um Deployment realmente cria os Pods: o ReplicaSet no meio
Um Deployment não cria Pods diretamente. Ele cria um ReplicaSet, e é o ReplicaSet que cria os Pods. Você pode ver a cadeia inteira:
| |
| |
O nome do ReplicaSet é o nome do Deployment mais um hash do template do Pod (7d9f8c7b86); o nome de cada Pod é o nome do ReplicaSet mais um sufixo aleatório. kubectl describe pod web-app-7d9f8c7b86-4kxqz mostra a relação diretamente, no campo Controlled By: ReplicaSet/web-app-7d9f8c7b86.
Apague um desses Pods e a contagem cai para 2. Em segundos aparece um substituto. É o ReplicaSet notando a falta e criando um novo Pod a partir do mesmo template, não o Deployment agindo diretamente. O ReplicaSet é quem vigia. O Deployment existe para a única coisa que um ReplicaSet não consegue fazer sozinho: substituir um template de Pod de forma gradual em vez de tudo de uma vez.
O que um rollout faz aos ReplicaSets
Troque a imagem e aplique:
| |
| |
Por trás dessa linha de status, o Deployment criou um segundo ReplicaSet para o novo template de Pod e o escalou para cima enquanto reduzia o antigo. Com a estratégia padrão RollingUpdate em 3 réplicas, isso resulta em um Pod de cada vez:
| |
| |
O ReplicaSet antigo não é apagado. Ele fica em zero réplicas, mantendo o template de Pod anterior como registro. É isso que torna o rollback rápido:
| |
O Kubernetes escala o ReplicaSet antigo de volta para cima e reduz o novo — sem reconstrução, sem novo pull de uma imagem antiga se ela ainda estiver em cache no Node. kubectl rollout history deployment/web-app --revision=1 ainda mostra exatamente qual imagem essa revisão executava.
Quando um Pod nu é a escolha certa
Um Pod nu não é um erro em todo contexto, só na maioria deles:
- Um container de diagnóstico descartável que você vai apagar em cinco minutos:
kubectl run debug --image=busybox -it --rm -- sh. - Um Job ou CronJob, que cria Pods através do seu próprio controller porque o trabalho precisa chegar ao fim em vez de continuar rodando.
- Inspecionar ou estudar a spec do Pod em si, antes de envolvê-la em algo que a gerencie.
Tudo que precisa continuar rodando após um crash, uma falha de Node ou uma atualização passa por um Deployment. Ou por um StatefulSet, para Pods que precisam de identidade estável e armazenamento próprio — um problema diferente, e um objeto diferente. Escreva o manifesto do Deployment por padrão e só desça para um Pod nu nos três casos acima.
Pod, ReplicaSet e Deployment lado a lado
| Pod | ReplicaSet | Deployment | |
|---|---|---|---|
| O que gerencia | Containers | Pods | ReplicaSets |
| Substitui uma instância apagada | Não | Sim | Sim, via seu ReplicaSet |
| Escala para N réplicas | Não | Sim | Sim |
| Rolling updates | Não | Não | Sim |
| Rollback para uma versão anterior | Não | Não | Sim |
| Você cria diretamente | Raramente | Quase nunca | Normalmente |
Verifique se os seus próprios Pods têm um Deployment por trás
Execute isso contra o que já existe no seu cluster:
| |
Se só voltarem linhas de Pod, esses são Pods nus. É a lacuna a fechar antes que o próximo drain de Node derrube o app junto com eles.