Saltar al contenido principal

Capítulo 3.6 - Deployments

Objetivos de Aprendizaje​

Al finalizar este capítulo, usted será capaz de:

  • Comprender el rol de los Deployments
  • Crear y gestionar Deployments
  • Realizar rolling updates
  • Gestionar rollbacks
  • Escalar Deployments

¿Qué es un Deployment?​

Un Deployment gestiona los ReplicaSets y ofrece funcionalidades de actualización declarativa, rollback y escalado.

Ventajas:

  • Gestión de versiones
  • Rolling updates
  • Rollbacks automáticos
  • Escalado sencillo

Declaración 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​

Proceso​

Estrategias​

RollingUpdate (por defecto):

  • Reemplaza los Pods progresivamente
  • Sin interrupción del servicio
  • Configurable (maxSurge, maxUnavailable)

Recreate:

  • Elimina todos los Pods antiguos
  • Crea los nuevos Pods
  • Interrupción del servicio

Actualización de un Deployment​

Método 1: Modificar la Imagen​

# Actualizar la imagen
kubectl set image deployment/web-deployment nginx=nginx:1.21

# Ver el estado de la actualización
kubectl rollout status deployment/web-deployment

Método 2: Editar el YAML​

# Editar el Deployment
kubectl edit deployment web-deployment

# O modificar el archivo y aplicar
kubectl apply -f deployment.yaml

Método 3: Patch​

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

Rollback​

Ver el Historial​

# Ver el historial de rollouts
kubectl rollout history deployment/web-deployment

# Detalles de una revisión
kubectl rollout history deployment/web-deployment --revision=2

Realizar un Rollback​

# Rollback a la versión anterior
kubectl rollout undo deployment/web-deployment

# Rollback a una revisión específica
kubectl rollout undo deployment/web-deployment --to-revision=2

Scaling​

Escalado Manual​

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

# O editar
kubectl edit deployment web-deployment

Escalado Automático (HPA)​

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

Comandos Útiles​

# Ver los Deployments
kubectl get deployments

# Detalles de un Deployment
kubectl describe deployment web-deployment

# Ver los ReplicaSets creados
kubectl get replicasets

# Pausar/Reanudar un rollout
kubectl rollout pause deployment/web-deployment
kubectl rollout resume deployment/web-deployment

Resumen​

En este capítulo, usted ha aprendido:

Deployment: Gestiona los ReplicaSets con funcionalidades avanzadas
Rolling Updates: Actualizaciones sin interrupción
Rollback: Volver a una versión anterior
Scaling: Manual o automático (HPA)
Gestión: kubectl set image, rollout, scale


Próximos Pasos​

Ahora que domina los Deployments:

Capítulo 3.7: Estrategias de Despliegue
Capítulo 3.8: Health Checks


Troubleshooting​

Problemas Comunes con los Deployments​

Problema 1: El Deployment no crea Pods​

Síntomas:

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

Soluciones:

  1. Verificar los eventos:

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

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

    kubectl describe quota

Problema 2: Rolling Update bloqueado​

Síntomas:

  • El deployment permanece en "Updating"
  • Los nuevos pods no inician

Soluciones:

  1. Verificar los eventos:

    kubectl describe deployment my-app
  2. Verificar los recursos disponibles:

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

    • Las probes (liveness/readiness) pueden impedir el despliegue
    • Verifique los logs de los pods
  4. Forzar el rollback si es necesario:

    kubectl rollout undo deployment/my-app

Problema 3: Pods en CrashLoopBackOff​

Síntomas:

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

Soluciones:

  1. Verificar los logs:

    kubectl logs <pod-name>
    kubectl logs <pod-name> --previous
  2. Verificar la configuración:

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

    • Límites de CPU/Memoria demasiado bajos
    • Volúmenes faltantes
    • Secrets/ConfigMaps incorrectos

Problema 4: El escalado no funciona​

Síntomas:

kubectl scale deployment my-app --replicas=5
# Pero siguen siendo 3 pods

Soluciones:

  1. Verificar los quotas:

    kubectl describe quota
  2. Verificar los recursos de los nodes:

    kubectl describe nodes
  3. Verificar las restricciones:

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

Capítulo anterior: Capítulo 3.5 - ReplicaSets
Capítulo siguiente: Capítulo 3.7 - Estrategias de Despliegue
Volver al módulo: Módulo 3 - Pods y Deployments


Capítulo creado el: Diciembre 2024