Domine a unidade atômica do Kubernetes (Pods com init containers e sidecars nativos), isole ambientes com Namespaces, gerencie atualizações sem downtime via Deployments e exponha tudo com Services estáveis.
Um Service mantém um IP virtual e nome DNS fixos enquanto o Deployment substitui Pods antigos por novos em lotes controlados.
OFICINA 01 · CAPÍTULO 4
Anatomia de um Pod: Multi-Contêiner, Init & Sidecars
No Kubernetes, você não agenda contêineres avulsos: a menor unidade agendável é o Pod. Um Pod cria um ambiente compartilhado (mesmo IP, rede localhost, volumes e memória) para um ou mais contêineres que precisam viver e morrer juntos.
metadata.name como hostname: o nome do Pod no YAML vira automaticamente o hostname compartilhado pelos contêineres dentro dele.
initContainers comuns: rodam em sequência antes dos contêineres principais e precisam terminar com sucesso (ex.: aguardar uma API externa responder ou clonar um repositório).
Sidecars nativos (restartPolicy: Always): definidos dentro de initContainers com restartPolicy: Always; iniciam antes do app principal e permanecem vivos em paralelo durante toda a vida do Pod (ideal para proxies de service mesh ou coletores de logs).
Terminal · Inspecionar, ver logs e abrir shell em um Pod
kubectl get pods -o wide
kubectl describe pod hello-pod
kubectl logs hello-pod
kubectl exec -it hello-pod -- sh
OFICINA 02 · CAPÍTULO 4
Probes de Saúde, Requests & Limits
Para que o Scheduler posicione seus Pods sem sufocar nós e o kubelet saiba se a aplicação realmente está saudável, você configura resources e probes diretamente no spec do contêiner.
Recursos e Probes no ciclo de vida do Pod
Configuração
Quem Lê / Aplica
Comportamento Real
resources.requests
Scheduler + kubelet
Valores mínimos garantidos (ex.: cpu: 0.5, memory: 256Mi). Se nenhum nó tiver esse saldo, o Pod fica em Pending.
resources.limits
kubelet + Runtime
Teto máximo permitido (ex.: cpu: 1.0, memory: 512Mi). Estouro de CPU sofre throttling; estouro de RAM pode gerar OOMKilled.
startupProbe
kubelet
Segura as outras probes enquanto uma app pesada termina de iniciar.
readinessProbe
kubelet → EndpointSlice
Define se o Pod está pronto para receber tráfego do Service (remove sem reiniciar se falhar).
livenessProbe
kubelet
Detecta travamentos (deadlocks) e reinicia o contêiner automaticamente.
Regra de ouro: sempre defina requests e readinessProbe em produção. Sem readinessProbe, um Service pode enviar requisições HTTP para um Pod que ainda está carregando dependências.
OFICINA 03 · CAPÍTULO 5
Clusters Virtuais com Namespaces
Namespaces dividem um cluster físico em múltiplos clusters virtuais lógicos (soft isolation), evitando colisões de nomes entre times ou ambientes (dev, staging). Já clusters separados oferecem hard isolation ao custo de maior sobrecarga operacional.
Os 4 Namespaces pré-criados em todo cluster Kubernetes
Namespace
Finalidade
default
Destino padrão quando nenhum Namespace é informado no YAML ou comando.
kube-system
Abriga componentes internos do sistema (DNS do cluster, metrics server, CNI).
kube-public
Recursos legíveis por todos os usuários (mesmo sem autenticação).
kube-node-lease
Armazena objetos Lease usados para heartbeats dos nós do cluster.
Terminal · Listar Namespaces, recursos namespaced e fixar Namespace no contexto
Na prática, você raramente cria um Pod avulso. Você cria um Deployment, que cria e gerencia um ReplicaSet, que por sua vez mantém o número desejado de Pods idênticos usando seletores de Labels.
Como Pods são objetos imutáveis, você nunca "edita" um Pod em execução para atualizar uma imagem: ao alterar o template do Deployment, o controller sobe um novo ReplicaSet com os Pods novos e desliga os antigos de forma controlada:
spec.minReadySeconds: tempo de espera (ex.: 10 segundos) após cada Pod ficar pronto antes de avançar, ajudando a detectar falhas cedo.
maxUnavailable: quantos Pods podem ficar abaixo do desejado durante a troca.
maxSurge: quantos Pods extras podem subir acima do desejado durante a troca.
VPA vs. HPA: o Deployment escala horizontalmente (número de réplicas); o Vertical Pod Autoscaler (VPA) ajusta CPU/RAM e não vem instalado por padrão.
Terminal · Escalar, acompanhar rollout e fazer rollback
Pods são efêmeros e trocam de IP toda vez que são recriados. Por isso, nunca conecte clientes diretamente ao IP de um Pod. O Service (escrito com S maiúsculo por ser um recurso da API) oferece um nome DNS e um IP virtual (ClusterIP) permanentes.
Para saber quais Pods recebem tráfego, o Service usa um selector de Labels (ex.: app: web). Apenas Pods saudáveis que possuam todas as Labels do seletor entram no objeto EndpointSlice associado ao Service.
Tipos de Service e políticas de tráfego
Tipo / Campo
Alcance / Função
Quando Usar
ClusterIP (padrão)
IP e DNS acessíveis apenas dentro do cluster
Comunicação interna entre microsserviços (ex.: API → Banco/Cache).
NodePort
Abre uma porta alta (30000–32767) em todos os nós
Testes rápidos ou integração com balanceadores externos manuais.
LoadBalancer
Provisiona um Load Balancer na nuvem com IP externo
Exposição direta na internet em clusters gerenciados (AWS, GCP, LKE).
sessionAffinity
None (padrão) ou ClientIP
ClientIP força stickiness, mas é considerado anti-padrão em apps stateless.
externalTrafficPolicy
Cluster (padrão) ou Local
Local evita saltos extras entre nós e preserva o IP de origem do cliente.
OFICINA 06 · CAPÍTULOS 6 E 7
Laboratório Guiado: Subindo Deployment + Service
Aplique o manifesto declarativo abaixo em um arquivo app-stack.yml para subir um Deployment com rolling update controlado e um Service vinculado por Labels.
Manifesto YAML · app-stack.yml (Deployment + Service ClusterIP)