Pular para o conteúdo principal

Capítulo 3.6 - Deployments

Objetivos de Aprendizagem​

Ao final deste capítulo, você será capaz de:

  • Compreender o papel dos Deployments
  • Criar e gerenciar Deployments
  • Realizar rolling updates
  • Gerenciar rollbacks
  • Escalar Deployments

O que é um Deployment?​

Um Deployment gerencia os ReplicaSets e oferece funcionalidades de atualização declarativa, rollback e scaling.

Vantagens:

  • Gerenciamento de versões
  • Rolling updates
  • Rollbacks automáticos
  • Escalabilidade fácil

Declaração YAML​

apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0

Rolling Updates​

Processo​

Estratégias​

RollingUpdate (padrão):

  • Substitui os Pods gradualmente
  • Sem interrupção de serviço
  • Configurável (maxSurge, maxUnavailable)

Recreate:

  • Remove todos os Pods antigos
  • Cria os novos Pods
  • Interrupção de serviço

Atualizando um Deployment​

Método 1: Modificar a Imagem​

# Atualizar a imagem
kubectl set image deployment/web-deployment nginx=nginx:1.21

# Ver o status da atualização
kubectl rollout status deployment/web-deployment

Método 2: Editar o YAML​

# Editar o Deployment
kubectl edit deployment web-deployment

# Ou modificar o arquivo e aplicar
kubectl apply -f deployment.yaml

Método 3: Patch​

# Modificar uma parte específica
kubectl patch deployment web-deployment -p '{"spec":{"replicas":5}}'

Rollback​

Ver o Histórico​

# Ver o histórico dos rollouts
kubectl rollout history deployment/web-deployment

# Detalhes de uma revisão
kubectl rollout history deployment/web-deployment --revision=2

Realizar um Rollback​

# Rollback para a versão anterior
kubectl rollout undo deployment/web-deployment

# Rollback para uma revisão específica
kubectl rollout undo deployment/web-deployment --to-revision=2

Scaling​

Scaling Manual​

# Aumentar o número de réplicas
kubectl scale deployment web-deployment --replicas=5

# Ou editar
kubectl edit deployment web-deployment

Scaling Automático (HPA)​

# Criar um Horizontal Pod Autoscaler
kubectl autoscale deployment web-deployment --min=2 --max=10 --cpu-percent=80

Comandos Úteis​

# Ver os Deployments
kubectl get deployments

# Detalhes de um Deployment
kubectl describe deployment web-deployment

# Ver os ReplicaSets criados
kubectl get replicasets

# Pausar/Retomar um rollout
kubectl rollout pause deployment/web-deployment
kubectl rollout resume deployment/web-deployment

Resumo​

Neste capítulo, você aprendeu:

Deployment: Gerencia ReplicaSets com funcionalidades avançadas
Rolling Updates: Atualizações sem interrupção
Rollback: Retorno para uma versão anterior
Scaling: Manual ou automático (HPA)
Gerenciamento: kubectl set image, rollout, scale


Próximos Passos​

Agora que você domina os Deployments:

Capítulo 3.7: Estratégias de Deploy
Capítulo 3.8: Health Checks


Troubleshooting​

Problemas Comuns com Deployments​

Problema 1: Deployment não cria Pods​

Sintomas:

kubectl get deployment
# NAME READY UP-TO-DATE AVAILABLE
# my-app 0/3 0 0

Soluções:

  1. Verificar os eventos:

    kubectl describe deployment my-app
    kubectl get events --sort-by='.lastTimestamp'
  2. Verificar os ReplicaSets:

    kubectl get replicasets
    kubectl describe replicaset <rs-name>
  3. Verificar quotas de recursos:

    kubectl describe quota

Problema 2: Rolling Update travado​

Sintomas:

  • O deployment permanece em "Updating"
  • Os novos pods não iniciam

Soluções:

  1. Verificar os eventos:

    kubectl describe deployment my-app
  2. Verificar recursos disponíveis:

    kubectl top nodes
    kubectl describe nodes
  3. Verificar os health checks:

    • As probes (liveness/readiness) podem impedir o deploy
    • Verifique os logs dos pods
  4. Forçar rollback se necessário:

    kubectl rollout undo deployment/my-app

Problema 3: Pods em CrashLoopBackOff​

Sintomas:

kubectl get pods
# NAME READY STATUS RESTARTS
# my-app-xxx-123 0/1 CrashLoopBackOff 5

Soluções:

  1. Verificar os logs:

    kubectl logs <pod-name>
    kubectl logs <pod-name> --previous
  2. Verificar a configuração:

    kubectl describe pod <pod-name>
  3. Verificar recursos:

    • Limites de CPU/Memory muito baixos
    • Volumes ausentes
    • Secrets/ConfigMaps incorretos

Problema 4: Scaling não funciona​

Sintomas:

kubectl scale deployment my-app --replicas=5
# Mas ainda 3 pods

Soluções:

  1. Verificar quotas:

    kubectl describe quota
  2. Verificar recursos dos nodes:

    kubectl describe nodes
  3. Verificar restrições:

    kubectl get deployment my-app -o yaml
    # Verificar nodeSelectors, affinity, etc.

Capítulo anterior: Capítulo 3.5 - ReplicaSets
Próximo capítulo: Capítulo 3.7 - Estratégias de Deploy
Voltar ao módulo: Módulo 3 - Pods e Deployments


Capítulo criado em: Dezembro 2024