Capítulo 1: Introducción y Preparación del Entorno
¿Por qué kubectl + FastAPI?
FastAPI es el framework Python más popular para APIs modernas. Kubernetes es el estándar para desplegar contenedores en producción. Como desarrollador, necesitás dominar kubectl para:
- Desplegar tu API al cluster
- Ver logs cuando algo falla
- Depurar problemas de conectividad
- Hacer port-forward para probar cambios
Instalar kubectl
# Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/
# macOS
brew install kubectl
# Verificar
kubectl version --client
Cluster local con k3s
Para desarrollo, k3s es la opción más liviana:
# Instalar k3s (Linux)
curl -sfL https://get.k3s.io | sh -
# Copiar kubeconfig
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
# Verificar conexión
kubectl cluster-info
kubectl get nodes
Alternativa con minikube:
# Instalar minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Iniciar cluster
minikube start
# Verificar
kubectl get nodes
Crear proyecto FastAPI base
mkdir fastapi-k8s && cd fastapi-k8s
python -m venv .venv && source .venv/bin/activate
pip install fastapi uvicorn
Crear main.py:
from fastapi import FastAPI
import os
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = FastAPI(title="FastAPI K8s Demo")
@app.get("/")
def root():
logger.info("Request a /")
return {"status": "ok", "pod": os.getenv("HOSTNAME", "local")}
@app.get("/health")
def health():
return {"healthy": True}
@app.get("/items/{item_id}")
def get_item(item_id: int):
logger.info(f"Buscando item {item_id}")
return {"item_id": item_id, "name": f"Item {item_id}"}
Probar localmente:
uvicorn main:app --reload --port 8000
curl http://localhost:8000/
# {"status":"ok","pod":"local"}
Estructura del proyecto
fastapi-k8s/
├── main.py
├── requirements.txt
├── Dockerfile
└── k8s/
├── deployment.yaml
├── service.yaml
├── configmap.yaml
└── secret.yaml
Crear requirements.txt:
fastapi==0.115.0
uvicorn==0.32.0
Contextos de kubectl
Si trabajás con múltiples clusters (dev, staging, prod):
# Ver contextos disponibles
kubectl config get-contexts
# Cambiar de contexto
kubectl config use-context mi-cluster-dev
# Ver contexto actual
kubectl config current-context
Namespaces
Organizá tus recursos por namespace:
# Crear namespace para desarrollo
kubectl create namespace dev
# Listar namespaces
kubectl get namespaces
# Setear namespace por defecto
kubectl config set-context --current --namespace=dev
En el próximo capítulo, dockerizamos la app para prepararla para Kubernetes.