Capítulo 3: Deployments y Pods
¿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:
replicas: 2— dos instancias de tu APIimagePullPolicy: IfNotPresent— usar imagen local si existeresources— limitar CPU y memoria por Pod
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.