Capítulo 1: Introducción y Preparación del Entorno

Por: Artiko
kubectlkubernetesfastapiminikubek3s

¿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:

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.