Kubernetes
Orquestación de contenedores con Kubernetes — pods, services, deployments, escalado automático y health checks.
¿Qué es Kubernetes?
Kubernetes (K8s) es una plataforma de orquestación de contenedores que automatiza el despliegue, escalado y gestión de aplicaciones contenedorizadas. Fue creado por Google y es hoy el estándar de facto para ejecutar workloads en producción.
Kubernetes resuelve problemas que Docker solo no puede manejar a escala:
- ¿Cómo distribuyo mis contenedores en múltiples máquinas?
- ¿Cómo escalo automáticamente cuando hay más tráfico?
- ¿Qué pasa si un contenedor falla — quién lo reinicia?
- ¿Cómo hago rolling updates sin downtime?
Conceptos fundamentales
Pod
Un Pod es la unidad mínima de despliegue en Kubernetes. Contiene uno o más contenedores que comparten red y almacenamiento. En la práctica, la mayoría de los pods tienen un solo contenedor.
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:1.0.0
ports:
- containerPort: 3000
Service
Un Service expone un conjunto de pods como un servicio de red estable. Los pods son efímeros (pueden morir y recrearse), pero el Service mantiene una IP y DNS fijos.
Tipos de Service:
- ClusterIP (default): accesible solo dentro del cluster
- NodePort: expone el servicio en un puerto de cada nodo
- LoadBalancer: crea un balanceador de carga externo (en cloud providers)
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 3000
type: ClusterIP
Deployment
Un Deployment gestiona el ciclo de vida de los pods: cuántas réplicas ejecutar, cómo actualizarlos y cómo hacer rollback si algo falla.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:1.0.0
ports:
- containerPort: 3000
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
Health checks
Kubernetes usa probes para verificar el estado de los contenedores:
Liveness probe
Verifica si el contenedor está vivo. Si falla, Kubernetes reinicia el contenedor.
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 10
periodSeconds: 15
failureThreshold: 3
Readiness probe
Verifica si el contenedor está listo para recibir tráfico. Si falla, Kubernetes deja de enviarle requests (pero no lo reinicia).
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
Startup probe
Para aplicaciones que tardan en arrancar. Mientras el startup probe no pase, los otros probes no se ejecutan.
startupProbe:
httpGet:
path: /health
port: 3000
failureThreshold: 30
periodSeconds: 5
Escalado
Escalado manual
kubectl scale deployment my-app --replicas=5
Horizontal Pod Autoscaler (HPA)
Escala automáticamente el número de pods basándose en métricas como CPU o memoria:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
ConfigMaps y Secrets
ConfigMap
Para configuración no sensible:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-app-config
data:
LOG_LEVEL: "info"
API_TIMEOUT: "30s"
Secret
Para datos sensibles (codificados en base64):
apiVersion: v1
kind: Secret
metadata:
name: my-app-secrets
type: Opaque
data:
DATABASE_PASSWORD: cGFzc3dvcmQxMjM=
Namespaces
Los namespaces permiten dividir un cluster en entornos lógicos aislados:
kubectl create namespace staging
kubectl create namespace production
Cada namespace puede tener sus propios recursos, límites y políticas de acceso.
Resumen
Kubernetes es la plataforma estándar para orquestar contenedores en producción. Sus abstracciones clave — Pods, Services, Deployments — junto con health checks, auto-scaling y gestión de configuración, proporcionan todo lo necesario para ejecutar aplicaciones distribuidas de forma confiable y escalable.