Série k8s: Deployments — como versionar e escalar aplicações

Este post faz parte da série de fundamentos de Kubernetes. Aqui vamos falar de Deployments, o recurso que mantém aplicações rodando com réplicas, atualizações seguras e possibilidade de rollback.

Se você já entendeu Pods, agora o Deployment é o próximo passo natural para rodar aplicações de forma confiável.

O que você vai ver aqui

  • O que é um Deployment e quando usar
  • Um exemplo YAML pronto para aplicar
  • Estratégias de rollout e comandos de operação

O que é um Deployment

Um Deployment é o recurso mais usado para rodar aplicações stateless no Kubernetes. Ele gerencia o ciclo de vida de Pods por meio de ReplicaSets e garante que a aplicação esteja sempre no estado desejado.

Na prática, um Deployment permite:

  • criar e manter réplicas;
  • fazer rollout (atualização gradual);
  • fazer rollback (voltar para uma versão anterior);
  • pausar e retomar mudanças com controle.

Se um Pod falha, o Deployment cria outro automaticamente. Se você altera a imagem, ele troca os Pods aos poucos, mantendo a aplicação disponível.

Quando usar

Deployments são a escolha padrão para workloads stateless (APIs, front-ends, workers). Para workloads stateful, o recurso mais adequado geralmente é o StatefulSet.

Se você precisa atualizar versões sem downtime e manter réplicas estáveis, o Deployment é o caminho mais seguro.

Exemplo de Deployment (YAML)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80

Aplicar e verificar

  • Aplicar o Deployment definido em deployment.yaml:
kubectl apply -f deployment.yaml
  • Verificar se o Deployment foi criado e está saudável:
kubectl get deployments -l app=nginx
  • Listar os Pods criados pelo Deployment:
kubectl get pods -l app=nginx
  • Detalhar o Deployment (status, eventos e estratégia):
kubectl describe deployment nginx-deployment
  • Listar os ReplicaSets gerados pelo Deployment:
kubectl get replicasets -l app=nginx

Estratégias de rollout

O Kubernetes possui duas estratégias principais para atualizar um Deployment:

  • RollingUpdate (padrão): substitui Pods aos poucos, mantendo parte das réplicas antigas ativas para evitar indisponibilidade. Ideal para produção.
  • Recreate: encerra todas as réplicas antigas e depois cria as novas, causando indisponibilidade temporária. Útil quando você não pode ter versões diferentes rodando juntas.

Você também pode configurar parâmetros do rolling update, como maxUnavailable e maxSurge, para definir o ritmo da atualização.

Exemplo: permitir no máximo 1 indisponível e criar 1 extra durante o rollout.

Rollout (atualizações)

  • Acompanhar o status do rollout (geral):
kubectl rollout status
  • Acompanhar o status do rollout de um Deployment específico:
kubectl rollout status deployment nginx-deployment
  • Ver o histórico de revisões do Deployment (geral):
kubectl rollout history
  • Ver o histórico detalhado de uma revisão:
kubectl rollout history deployment nginx-deployment --revision=1
  • Voltar para a versão anterior do Deployment (geral):
kubectl rollout undo
  • Voltar para a versão anterior de um Deployment específico:
kubectl rollout undo deployment nginx-deployment
  • Pausar temporariamente o rollout do Deployment:
kubectl rollout pause
  • Retomar o rollout do Deployment após a pausa:
kubectl rollout resume
  • Reiniciar o rollout do Deployment (força nova atualização sem alterar a imagem):
kubectl rollout restart
  • Reiniciar o rollout de um Deployment específico:
kubectl rollout restart deployment nginx-deployment

Remover o Deployment

  • Remover o Deployment pelo nome:
kubectl delete deployment nginx-deployment
  • Remover o Deployment definido em um arquivo:
kubectl delete -f deployment.yaml

No próximo post da série, vamos detalhar ReplicaSet, DaemonSet e StatefulSet .