Estratégias de Deploy: Blue-Green, Canary e Rolling Updates na Prática
Um deploy que derruba 100% dos usuários por 30 segundos custa diferente de um que derruba 1% por 5 minutos. A diferença entre essas duas situações não é sorte: é estratégia de deploy.
Blue-Green, Canary e Rolling Updates resolvem o mesmo problema (colocar código novo em produção sem destruir a experiência do usuário), mas cada uma faz trade-offs diferentes entre complexidade de infra, velocidade de rollback e custo de recursos. Escolher errado não significa que o deploy vai falhar. Significa que você vai gastar infra demais, ou descobrir bugs tarde demais, ou levar minutos para reverter o que poderia levar segundos.
Como cada estratégia funciona por baixo
Antes de comparar, a mecânica precisa estar clara.
Blue-Green mantém dois ambientes idênticos (blue e green). Apenas um recebe tráfego de produção. O deploy acontece no ambiente ocioso. Quando os health checks passam, o roteador (load balancer, DNS, ingress) troca o ponteiro de tráfego de blue para green. Rollback é trocar o ponteiro de volta.
Canary direciona uma fração pequena do tráfego (1%, 5%, 10%) para a versão nova. Métricas de erro, latência e saturação são observadas. Se estiverem saudáveis, o percentual sobe progressivamente até 100%. Se degradarem, o tráfego volta para a versão anterior.
Rolling Update substitui instâncias da versão antiga pela nova em lotes. Se você tem 10 pods, atualiza 2 por vez. Durante o processo, versões antiga e nova coexistem. O Kubernetes usa essa estratégia como padrão.
Blue-Green:
[LB] ──► [Blue v1] ✓ tráfego ativo
[Green v2] ocioso, recebendo deploy
(troca)
[LB] ──► [Green v2] ✓ tráfego ativo
[Blue v1] ocioso, pronto para rollback
Canary:
[LB] ──► 95% [v1]
──► 5% [v2] ← observando métricas
(progressão)
[LB] ──► 50% [v1]
──► 50% [v2]
(fim)
[LB] ──► 100% [v2]
Rolling Update:
[pod1-v1] [pod2-v1] [pod3-v1] [pod4-v1]
[pod1-v2] [pod2-v2] [pod3-v1] [pod4-v1] ← 2 atualizados
[pod1-v2] [pod2-v2] [pod3-v2] [pod4-v2] ← todos atualizados
Tabela comparativa: critérios que importam na decisão
| Critério | Blue-Green | Canary | Rolling Update |
|---|---|---|---|
| Velocidade de rollback | Segundos (troca de ponteiro) | Segundos (redireciona tráfego) | Minutos (precisa recriar pods antigos) |
| Custo de infra | Alto (ambiente duplicado 100%) | Médio (poucos pods extras) | Baixo (reutiliza os mesmos recursos) |
| Risco de exposição a bugs | Tudo ou nada: 0% ou 100% | Gradual: 1% → 5% → 25% → 100% | Parcial: depende do tamanho do lote |
| Complexidade de configuração | Média (dois ambientes + roteamento) | Alta (observabilidade + regras de peso) | Baixa (padrão do Kubernetes) |
| Coexistência de versões | Não (uma versão recebe tráfego) | Sim (duas versões simultâneas) | Sim (duas versões simultâneas) |
| Compatibilidade de banco | Precisa de migrations compatíveis com ambas | Precisa de migrations compatíveis com ambas | Precisa de migrations compatíveis com ambas |
| Melhor para | Aplicações com rollback crítico (fintech, saúde) | Validação gradual com métricas (SaaS, e-commerce) | Workloads stateless com baixo risco (APIs internas) |
Rolling Update com Kubernetes: a configuração padrão que você já usa
O Kubernetes aplica Rolling Update por padrão. Mas o padrão sem ajuste é perigoso: maxUnavailable: 25% e maxSurge: 25% significam que, em um deployment com 4 réplicas, 1 pod fica indisponível e 1 pod extra é criado simultaneamente. Em serviços com poucos pods, isso pode derrubar 25% da capacidade durante o deploy.
# deployment-rolling.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-pedidos
namespace: production
spec:
replicas: 6
strategy:
type: RollingUpdate
rollingUpdate:
# maxUnavailable 0 garante que nenhum pod sai antes do novo estar Ready
maxUnavailable: 0
# maxSurge 2 cria no máximo 2 pods extras durante o rollout
maxSurge: 2
selector:
matchLabels:
app: api-ped
---
Leia o artigo completo em [https://www.vivodecodigo.com.br/infra/estrategias-deploy-blue-green-canary-rolling-updates](https://www.vivodecodigo.com.br/infra/estrategias-deploy-blue-green-canary-rolling-updates)