Capítulo 9: Escalado y Actualizaciones
Rolling Updates
Kubernetes actualiza pods gradualmente por defecto: crea pods nuevos antes de matar los viejos. Zero downtime.
# Actualizar imagen
kubectl set image deployment/fastapi-app fastapi=fastapi-k8s:v2 -n dev
# Ver progreso
kubectl rollout status deployment/fastapi-app -n dev
# Ver el historial de versiones
kubectl rollout history deployment/fastapi-app -n dev
Estrategia de actualización
En el Deployment podés configurar cómo se hace el rolling update:
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # Máximo 1 pod extra durante update
maxUnavailable: 0 # Nunca tener menos pods de los deseados
Con maxUnavailable: 0 garantizás que siempre hay capacidad completa durante el deploy.
Rollback
Si algo salió mal con la nueva versión:
# Rollback al deployment anterior
kubectl rollout undo deployment/fastapi-app -n dev
# Rollback a una revisión específica
kubectl rollout history deployment/fastapi-app -n dev
kubectl rollout undo deployment/fastapi-app -n dev --to-revision=3
# Verificar que el rollback funcionó
kubectl get pods -n dev
kubectl logs -l app=fastapi-app -n dev --tail=5
Escalado manual
# Escalar réplicas
kubectl scale deployment fastapi-app --replicas=5 -n dev
# Ver pods creándose
kubectl get pods -n dev -w
# Reducir
kubectl scale deployment fastapi-app --replicas=2 -n dev
HorizontalPodAutoscaler (HPA)
Escalar automáticamente según uso de CPU:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: fastapi-hpa
namespace: dev
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: fastapi-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
kubectl apply -f k8s/hpa.yaml
# Ver estado del HPA
kubectl get hpa -n dev
# Ver métricas actuales
kubectl top pods -n dev
Requiere metrics-server instalado en el cluster.
Pausar y reanudar rollouts
Si necesitás hacer varios cambios antes de deployar:
# Pausar
kubectl rollout pause deployment/fastapi-app -n dev
# Hacer cambios (imagen, env vars, etc.)
kubectl set image deployment/fastapi-app fastapi=fastapi-k8s:v3 -n dev
kubectl set env deployment/fastapi-app LOG_LEVEL=WARNING -n dev
# Reanudar (aplica todos los cambios juntos)
kubectl rollout resume deployment/fastapi-app -n dev
Verificar el estado del deploy
# Estado detallado
kubectl describe deployment fastapi-app -n dev
# Condiciones
kubectl get deployment fastapi-app -n dev -o jsonpath='{.status.conditions[*].message}'
# Pods por ReplicaSet (ver old y new)
kubectl get replicasets -n dev
Canary deployment manual
Desplegar una versión nueva en un solo pod para probarla:
# Escalar el deployment actual a 3
kubectl scale deployment fastapi-app --replicas=3 -n dev
# Crear un pod canary con la nueva imagen
kubectl run fastapi-canary --image=fastapi-k8s:v2 -n dev --labels="app=fastapi-app"
# El Service balancea entre los 3 pods v1 y el canary v2
# Monitorear logs del canary
kubectl logs fastapi-canary -n dev -f
# Si todo OK, actualizar el deployment
kubectl set image deployment/fastapi-app fastapi=fastapi-k8s:v2 -n dev
# Eliminar canary
kubectl delete pod fastapi-canary -n dev
En el último capítulo: tips de productividad con kubectl.