Capítulo 7: Desarrollo Iterativo con Port-Forward
El problema
El ciclo build → push → deploy es lento. Para desarrollo necesitás iterar rápido: cambiar código, probar, repetir.
Estrategia 1: Desarrollo local + port-forward a dependencias
Tu FastAPI corre local, pero las dependencias (base de datos, cache, otros servicios) están en el cluster:
# Forward de PostgreSQL del cluster a tu máquina
kubectl port-forward service/postgres 5432:5432 -n dev &
# Forward de Redis
kubectl port-forward service/redis 6379:6379 -n dev &
# Tu app corre local apuntando a localhost
DATABASE_URL=postgresql://user:pass@localhost:5432/mydb uvicorn main:app --reload
Esta es la estrategia más rápida: hot-reload instantáneo.
Estrategia 2: Build rápido al cluster
Cuando necesitás probar en el cluster (networking, permisos, etc.):
# Script de deploy rápido
#!/bin/bash
TAG="v$(date +%s)"
docker build -t fastapi-k8s:$TAG .
# Si usás k3s
docker save fastapi-k8s:$TAG | sudo k3s ctr images import -
# Si usás minikube
eval $(minikube docker-env) && docker build -t fastapi-k8s:$TAG .
# Actualizar deployment
kubectl set image deployment/fastapi-app fastapi=fastapi-k8s:$TAG -n dev
# Ver el rollout
kubectl rollout status deployment/fastapi-app -n dev
# Port-forward para probar
kubectl port-forward service/fastapi-service 8000:80 -n dev
Script de desarrollo
Crear dev-deploy.sh:
#!/bin/bash
set -e
TAG="dev-$(date +%s)"
IMAGE="fastapi-k8s:$TAG"
echo "→ Building $IMAGE"
docker build -t $IMAGE .
echo "→ Importing to cluster"
docker save $IMAGE | sudo k3s ctr images import -
echo "→ Updating deployment"
kubectl set image deployment/fastapi-app fastapi=$IMAGE -n dev
kubectl rollout status deployment/fastapi-app -n dev --timeout=60s
echo "→ Tailing logs"
kubectl logs -l app=fastapi-app -n dev -f --tail=10
chmod +x dev-deploy.sh
./dev-deploy.sh
Port-forward persistente
port-forward se desconecta con facilidad. Soluciones:
# Reconectar automáticamente con un while loop
while true; do
kubectl port-forward service/fastapi-service 8000:80 -n dev
echo "Reconectando..."
sleep 2
done
Múltiples port-forwards
Para varios servicios, usá un script:
#!/bin/bash
# dev-forward.sh
trap 'kill $(jobs -p) 2>/dev/null' EXIT
kubectl port-forward svc/fastapi-service 8000:80 -n dev &
kubectl port-forward svc/postgres 5432:5432 -n dev &
kubectl port-forward svc/redis 6379:6379 -n dev &
echo "Port-forwards activos:"
echo " FastAPI: http://localhost:8000"
echo " PostgreSQL: localhost:5432"
echo " Redis: localhost:6379"
echo "Ctrl+C para detener"
wait
Watch: monitorear cambios
# Ver pods actualizándose en tiempo real
kubectl get pods -n dev -w
# En otra terminal, ver logs
kubectl logs -l app=fastapi-app -n dev -f
# En otra terminal, hacer requests
watch -n 2 'curl -s http://localhost:8000/health | python -m json.tool'
Reiniciar sin cambiar imagen
Si cambiaste un ConfigMap o Secret:
# Rollout restart: recrea los pods con la misma imagen
kubectl rollout restart deployment fastapi-app -n dev
# Ver progreso
kubectl rollout status deployment/fastapi-app -n dev
Verificar qué imagen corre cada pod
kubectl get pods -n dev -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
En el siguiente capítulo: health checks y probes para que Kubernetes sepa si tu app está sana.