Kubernetes (K8s) es el orquestador de contenedores dominante en la industria. Si sabes Docker pero no Kubernetes, te estás perdiendo la mitad del ecosistema. Esta guía te explica los conceptos clave sin que te quieras rendir en el intento.
¿Por qué existe Kubernetes?
Docker te permite correr contenedores en un servidor. Pero ¿qué pasa cuando necesitas correr 100 contenedores en 10 servidores, asegurar que siempre haya 3 réplicas corriendo, actualizar sin downtime, escalar automáticamente bajo carga y recuperarse de fallos sin intervención manual? Eso es Kubernetes.
Arquitectura básica
Un cluster de Kubernetes tiene dos tipos de nodos:
- Control Plane (antes Master): gestiona el cluster — API Server, Scheduler, etcd, Controller Manager
- Worker Nodes: donde corren los contenedores — tienen el kubelet, kube-proxy y el container runtime (Docker, containerd)
Los objetos fundamentales
| Objeto | Qué es |
|---|---|
| Pod | La unidad mínima de K8s. Uno o más contenedores que comparten red y almacenamiento. Efímero — si muere, K8s lo recrea. |
| Deployment | Gestiona réplicas de Pods. Define cuántas instancias correr y cómo actualizarlas (rolling update). |
| Service | Expone Pods con una IP estable y load balancing. Los Pods cambian de IP — el Service no. |
| ConfigMap | Variables de configuración no sensibles inyectadas en los Pods. |
| Secret | Como ConfigMap pero para datos sensibles (contraseñas, tokens). Base64-encoded. |
| Ingress | Enruta tráfico HTTP/HTTPS desde el exterior hacia los Services correctos según la URL. |
Tu primer Deployment
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mi-app
spec:
replicas: 3 # 3 instancias siempre corriendo
selector:
matchLabels:
app: mi-app
template:
metadata:
labels:
app: mi-app
spec:
containers:
- name: mi-app
image: nginx:alpine
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
# Aplicar el manifiesto
kubectl apply -f deployment.yaml
# Ver el estado
kubectl get deployments
kubectl get pods
# Escalar a 5 réplicas
kubectl scale deployment mi-app --replicas=5
# Ver logs de un pod
kubectl logs <nombre-del-pod>
# Entrar a un pod (como docker exec)
kubectl exec -it <nombre-del-pod> -- /bin/sh
Exponer con un Service
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: mi-app-svc
spec:
selector:
app: mi-app # conecta con todos los Pods con este label
ports:
- port: 80
targetPort: 80
type: ClusterIP # solo interno; usa LoadBalancer para exponer al exterior
Práctica local con minikube o kind
# Instalar minikube (cluster de un nodo local)
# https://minikube.sigs.k8s.io/docs/start/
minikube start
# Verificar que kubectl apunta al cluster local
kubectl cluster-info
# Abrir el dashboard web
minikube dashboard
# Detener el cluster
minikube stop
💡 K3s para producción ligera: Si necesitas Kubernetes en un VPS pequeño o Raspberry Pi, K3s de Rancher es una distribución oficial certificada con solo 40 MB de binario. Instala en 30 segundos y consume ~512 MB de RAM.
"Kubernetes tiene una curva de aprendizaje empinada. Pero una vez que lo entiendes, nunca querrás gestionar contenedores de otra forma."