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:
-
Verificar los eventos:
kubectl describe deployment my-app
kubectl get events --sort-by='.lastTimestamp' -
Verificar los ReplicaSets:
kubectl get replicasets
kubectl describe replicaset <rs-name> -
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:
-
Verificar los eventos:
kubectl describe deployment my-app -
Verificar los recursos disponibles:
kubectl top nodes
kubectl describe nodes -
Verificar los health checks:
- Las probes (liveness/readiness) pueden impedir el despliegue
- Verifique los logs de los pods
-
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:
-
Verificar los logs:
kubectl logs <pod-name>
kubectl logs <pod-name> --previous -
Verificar la configuración:
kubectl describe pod <pod-name> -
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:
-
Verificar los quotas:
kubectl describe quota -
Verificar los recursos de los nodes:
kubectl describe nodes -
Verificar las restricciones:
kubectl get deployment my-app -o yaml
# Verificar nodeSelectors, affinity, etc.
Navegación
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