Capítulo 9: Escalado y Actualizaciones

Por: Artiko
kubernetesrolling-updaterollbackescaladokubectl

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.