Capítulo 3: Deployments y Pods

Por: Artiko
kubernetesdeploymentpodskubectlfastapi

¿Qué es un Pod?

Un Pod es la unidad mínima en Kubernetes. Contiene uno o más containers que comparten red y almacenamiento. Tu app FastAPI corre dentro de un Pod.

¿Qué es un Deployment?

Un Deployment gestiona Pods: cuántas réplicas correr, cómo actualizarlas, y cómo recuperarse si un Pod muere.

Crear el Deployment

Crear k8s/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fastapi-app
  namespace: dev
  labels:
    app: fastapi-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: fastapi-app
  template:
    metadata:
      labels:
        app: fastapi-app
    spec:
      containers:
        - name: fastapi
          image: fastapi-k8s:v1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8000
          resources:
            requests:
              memory: "128Mi"
              cpu: "100m"
            limits:
              memory: "256Mi"
              cpu: "500m"

Campos importantes:

Aplicar el Deployment

# Crear namespace si no existe
kubectl create namespace dev --dry-run=client -o yaml | kubectl apply -f -

# Aplicar deployment
kubectl apply -f k8s/deployment.yaml

# Ver estado
kubectl get deployments -n dev
# NAME          READY   UP-TO-DATE   AVAILABLE   AGE
# fastapi-app   2/2     2            2           30s

Inspeccionar Pods

# Listar pods
kubectl get pods -n dev
# NAME                           READY   STATUS    RESTARTS   AGE
# fastapi-app-7d4b8c6f5-abc12   1/1     Running   0          1m
# fastapi-app-7d4b8c6f5-def34   1/1     Running   0          1m

# Ver detalles de un pod
kubectl describe pod fastapi-app-7d4b8c6f5-abc12 -n dev

# Ver logs de un pod
kubectl logs fastapi-app-7d4b8c6f5-abc12 -n dev

Pods que no arrancan

Si un Pod queda en CrashLoopBackOff o ImagePullBackOff:

# Ver eventos del pod
kubectl describe pod <nombre-pod> -n dev

# Errores comunes:
# - ImagePullBackOff: imagen no existe o no hay acceso al registry
# - CrashLoopBackOff: el container arranca y muere (error en el código)
# - Pending: no hay recursos suficientes en el cluster

Ejecutar comandos dentro del Pod

# Shell interactivo
kubectl exec -it <nombre-pod> -n dev -- /bin/bash

# Ejecutar un comando directo
kubectl exec <nombre-pod> -n dev -- python -c "print('hola desde el pod')"

# Probar la API desde dentro del pod
kubectl exec <nombre-pod> -n dev -- curl -s localhost:8000/health

Escalar réplicas

# Escalar a 3 réplicas
kubectl scale deployment fastapi-app --replicas=3 -n dev

# Verificar
kubectl get pods -n dev

# Escalar a 1 (dev)
kubectl scale deployment fastapi-app --replicas=1 -n dev

Labels y selectores

Los labels conectan Deployments con Pods y Services:

# Ver pods con un label específico
kubectl get pods -l app=fastapi-app -n dev

# Ver todos los labels de un pod
kubectl get pods --show-labels -n dev

Eliminar recursos

# Eliminar deployment (y sus pods)
kubectl delete deployment fastapi-app -n dev

# Eliminar desde el archivo
kubectl delete -f k8s/deployment.yaml

# Eliminar todos los pods de un namespace (peligroso)
kubectl delete pods --all -n dev

En el siguiente capítulo, exponemos la API con Services para que sea accesible.