Deployment: la declaración de tu aplicación

Un Deployment es el recurso de Kubernetes que gestiona el ciclo de vida de tus aplicaciones stateless. Define la imagen del contenedor, el número de réplicas, la estrategia de actualización (rolling update o recreate) y los health checks.

A diferencia de crear Pods directamente, un Deployment garantiza que el número deseado de réplicas se mantenga incluso si un nodo cae. Además, facilita el escalado horizontal y los rollbacks.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mi-app
  labels:
    app: mi-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mi-app
  template:
    metadata:
      labels:
        app: mi-app
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80

Guardamos este YAML como deployment.yaml y lo aplicamos con kubectl apply -f deployment.yaml. Kubernetes leerá el manifiesto y creará los 3 Pods con la imagen de NGINX.

Service: exponer tu aplicación

Los Pods en Kubernetes tienen IPs efímeras que cambian al reiniciarse. Un Service provee una IP y nombre DNS estables, además de balancear el tráfico entre los Pods que coinciden con su selector.

apiVersion: v1
kind: Service
metadata:
  name: mi-app-svc
spec:
  type: NodePort
  selector:
    app: mi-app
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080

Los tipos de Service más comunes son:

  • ClusterIP (default): solo accesible dentro del clúster.
  • NodePort: expone el servicio en un puerto estático (>30000) de cada nodo.
  • LoadBalancer: crea un balanceador en cloud providers (AWS, GCP, Azure).
  • ExternalName: mapea a un DNS externo.
# Aplicar Deployment + Service
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# Verificar
kubectl get pods
kubectl get svc
kubectl get deployment

# Escalar a 5 réplicas
kubectl scale deployment mi-app --replicas=5

# Actualizar imagen
kubectl set image deployment/mi-app nginx=nginx:1.26

# Ver historial de rollouts
kubectl rollout history deployment/mi-app

# Deshacer el último rollout
kubectl rollout undo deployment/mi-app

El comando rollout undo es tu salvavidas en producción. Si la nueva imagen falla (por ejemplo, no responde health checks), Kubernetes automáticamente detiene el rollout y puedes revertir con un solo comando. Siempre revisa el historial antes de hacer undo para saber a qué revisión quieres volver.

Infografía Kubernetes: Desplegando tu primera aplicación con Deployments y Services
Infografía: Kubernetes: Desplegando tu primera aplicación con Deployments y Services