Capítulo 7: Desarrollo Iterativo con Port-Forward

Por: Artiko
kubernetesport-forwarddesarrollokubectlfastapi

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.