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.