🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Contenedores sin Servidor (Serverless Containers) en Kubernetes

Actualizado el 26 de enero de 2026

El mundo de la orquestación de contenedores ha evolucionado a pasos agigantados. Si bien Kubernetes se ha consolidado como el estándar de facto para la gestión de cargas de trabajo en contenedores, su complejidad y consumo de recursos pueden ser abrumadores para equipos que buscan agilidad y eficiencia. Aquí es donde irrumpe el paradigma de los serverless containers. Esta aproximación promete la flexibilidad de Kubernetes con la simplicidad y el modelo de pago por uso del serverless.

En este artículo, exploraremos a fondo cómo implementar contenedores sin servidor en Kubernetes, analizando las herramientas clave como Knative y KEDA, y desglosando las estrategias de escalado automático que hacen posible este modelo. Olvídate de gestionar nodos inactivos; prepárate para un clúster que respira, que se duerme cuando no se le necesita y que despierta al instante ante una petición.

¿Qué son los Serverless Containers y por qué en Kubernetes?

Para entender los serverless containers, primero debemos desmitificar el término "serverless". No significa que no haya servidores, sino que el desarrollador o el operador no tiene que gestionarlos. En un modelo serverless puro (como AWS Lambda), te olvidas del escalado, la capacidad y la infraestructura subyacente. Sin embargo, esto viene con limitaciones: tiempo de ejecución máximo, restricciones de memoria, frío inicio (cold start) y dependencia del proveedor.

Los serverless containers en Kubernetes ofrecen lo mejor de ambos mundos:

  • Portabilidad: Ejecutas tus contenedores estándar (Docker) sin modificaciones drásticas.
  • Escalado a Cero: El recurso más valioso es la capacidad de escalar un despliegue a cero réplicas cuando no hay tráfico. Esto elimina el coste de mantener pods inactivos.
  • Escalado Automático Basado en Eventos: No solo en CPU o memoria. El escalado puede dispararse por la longitud de una cola de mensajes (Kafka, RabbitMQ), el número de peticiones HTTP concurrentes o una métrica personalizada.
  • Facturación Granular: Aunque no es un proveedor cloud, el concepto se traslada: pagas por los recursos que realmente usas cuando el contenedor está activo.

El ecosistema de Kubernetes ofrece dos gigantes para lograr esto: Knative (el estándar de facto) y KEDA (el experto en escalado basado en eventos).

La Base: Knative Serving y su modelo de escalado

Knative es una plataforma open source construida sobre Kubernetes que proporciona componentes para desplegar, ejecutar y gestionar aplicaciones serverless. Su componente principal, Knative Serving, es el corazón de la operación.

Cómo funciona Knative Serving

Knative introduce el concepto de Revisiones (revisions) y Routes (rutas). Cuando despliegas una aplicación, Knative crea una revisión inmutable. El tráfico se enruta dinámicamente entre revisiones, permitiendo despliegues azul/verde o canary sin esfuerzo.

El flujo de escalado automático es fascinante:

  1. Escalado a Cero: Cuando no hay peticiones, Knative escala el Deployment a 0 réplicas. El pod se elimina.
  2. Activador (Activator): Knative despliega un componente llamado activator. Cuando una petición llega y no hay pods, el activator la intercepta, la mantiene en un buffer y arranca un nuevo pod.
  3. Cold Start: El tiempo que tarda en arrancar el pod y la aplicación. Knative minimiza esto usando imágenes ligeras y caché de capas, pero sigue siendo un factor a considerar.
  4. Escalado Rápido: Una vez que el pod está listo, el activator reenvía la petición. A partir de ahí, el Knative Pod Autoscaler (KPA) se encarga de escalar basándose en concurrencia (número de peticiones simultáneas por pod).

Configuración básica de un Service en Knative

Para desplegar un contenedor serverless, defines un recurso Service de Knative (no confundir con el Service de Kubernetes). Aquí un ejemplo en YAML:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: mi-app-serverless
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-samples/helloworld-go
          ports:
            - containerPort: 8080
      # Configuración de escalado
      autoscaling:
        # Escalar a cero cuando no hay tráfico
        class: "kpa.autoscaling.knative.dev"
        # Número máximo de peticiones concurrentes por pod
        metric: "concurrency"
        target: 10

[TIP]
Knative es la opción ideal si buscas un sustituto completo de plataformas como Google Cloud Run o AWS Fargate, pero corriendo en tu propio clúster. Su integración con Istio o Kourier para el enrutamiento de red es nativa.

KEDA: El especialista en escalado basado en eventos

Mientras que Knative se centra en peticiones HTTP, KEDA (Kubernetes Event-Driven Autoscaling) es un operador que permite escalar cualquier Deployment de Kubernetes basándose en eventos de fuentes externas. No reemplaza a Knative, sino que lo complementa o puede usarse de forma independiente.

¿Qué hace KEDA diferente?

El Horizontal Pod Autoscaler (HPA) nativo de Kubernetes escala basado en métricas de CPU/memoria. KEDA extiende esto permitiendo escalar basado en:

  • Colas de mensajes: Longitud de una cola en RabbitMQ, Kafka, Azure Service Bus, AWS SQS, etc.
  • Bases de datos: Número de conexiones activas en PostgreSQL, o consultas pendientes.
  • Métricas personalizadas: Prometheus, Datadog, StatsD.
  • Almacenamiento: Tamaño de un bucket S3 o de un volumen persistente.

KEDA introduce dos componentes clave:

  1. ScaledObject: El recurso personalizado (CRD) que define la fuente de evento y la métrica para escalar.
  2. Scaler: El adaptador que se conecta a la fuente externa (Kafka, Prometheus, etc.) y obtiene la métrica.

Ejemplo: Escalar un worker de Kafka con KEDA

Imagina que tienes un worker que procesa mensajes de un topic de Kafka. No quieres que esté siempre activo. Con KEDA, configuras un ScaledObject para que solo se active cuando haya mensajes pendientes.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-worker-scaler
  namespace: default
spec:
  scaleTargetRef:
    name: mi-worker-deployment  # Nombre del Deployment a escalar
  triggers:
    - type: kafka
      metadata:
        bootstrapServers: my-cluster-kafka-bootstrap.kafka:9092
        topic: ordenes-pendientes
        consumerGroup: grupo-worker
        # Escalar cuando haya al menos 5 mensajes sin procesar
        lagThreshold: "5"
  # Configuración de escalado a cero
  minReplicaCount: 0  # ¡Escala a cero!
  maxReplicaCount: 10

[INFO]
KEDA es perfecto para cargas de trabajo batch o orientadas a eventos. Piensa en procesamiento de imágenes, ETLs, notificaciones push o tareas de mantenimiento. Al escalar a cero, ahorras costes de CPU/RAM en tu clúster cuando no hay trabajo.

Estrategias de Escalado Automático: De la teoría a la práctica

Tanto Knative como KEDA ofrecen potentes mecanismos de escalado automático, pero la clave está en configurarlos correctamente para evitar problemas.

Parámetros críticos a ajustar

  • minReplicaCount y maxReplicaCount: Define un mínimo (puede ser 0) y un máximo para evitar que el escalado se desboque y consuma todo el clúster.
  • target (Knative): El número de peticiones concurrentes por pod. Un valor bajo (ej: 1) da más control pero más pods. Un valor alto (ej: 100) maximiza la eficiencia pero puede saturar un pod.
  • cooldownPeriod (KEDA): Tiempo que KEDA espera después de que la métrica baje del umbral antes de empezar a escalar hacia abajo. Esto evita el "flapping" (escalar arriba y abajo constantemente).
  • pollingInterval (KEDA): Cada cuánto tiempo KEDA consulta la fuente de evento para obtener la métrica.

El dilema del Cold Start

El mayor enemigo del serverless es el cold start. Cuando un pod arranca desde cero, debe descargar la imagen, inicializar el runtime y ejecutar la aplicación. Esto puede añadir latencia de segundos (o incluso minutos si la imagen es pesada).

Cómo mitigarlo:

  1. Imágenes ligeras: Usa imágenes base como distroless o alpine. Cada capa innecesaria suma tiempo.
  2. Tamaño de imagen pequeño: Optimiza tu Dockerfile. Menos capas, menos descarga.
  3. Pre-calentamiento (Warm requests): Knative permite configurar un activator que mantenga un pod "tibio" (con la imagen en caché) aunque no procese tráfico. No es escalado a cero puro, pero reduce drásticamente la latencia.
  4. Uso de PVCs y StatefulSets: Si tu aplicación necesita estado, el cold start puede ser más costoso. Considera usar bases de datos externas o cachés como Redis.

Casos de Uso Reales y Consideraciones de Arquitectura

¿Cuándo usar Serverless Containers?

  • APIs con tráfico variable: Una API que recibe picos por la mañana y nada por la noche. Con Knative, escalas a cero de noche y a 50 pods por la mañana.
  • Procesamiento batch: Un worker que procesa facturas cada hora. Con KEDA, solo se activa cuando hay facturas en la cola.
  • Webhooks y eventos: Sistemas que responden a eventos de GitHub, Stripe, etc.

¿Cuándo NO usarlos?

  • Aplicaciones con latencia ultrabaja: Si necesitas respuestas en milisegundos y no puedes tolerar un cold start, mejor mantener pods siempre activos.
  • Servicios con estado intensivo: Bases de datos o cachés locales. El escalado a cero implicaría perder datos o tiempos de sincronización enormes.
  • Cargas de trabajo predecibles y constantes: Si tu aplicación tiene tráfico estable 24/7, el serverless no aporta ahorro significativo y añade complejidad.

Conclusión: El futuro de Kubernetes es elástico

Los serverless containers en Kubernetes no son una moda, sino una evolución lógica. Herramientas como Knative y KEDA permiten a los equipos de infraestructura y desarrollo centrarse en el código, mientras la plataforma se encarga del escalado, la resiliencia y la eficiencia.

La combinación de escalado automático basado en eventos y la capacidad de escalar a cero transforma un clúster de Kubernetes en una máquina increíblemente eficiente. Ya no pagas por capacidad ociosa; pagas solo por el tiempo de cómputo real.

[WARNING]
No subestimes la complejidad de la red y el enrutamiento. Knative requiere un Ingress Controller (como Istio, Kourier o Contour) que entienda el protocolo de activación. Asegúrate de que tu clúster tenga los recursos suficientes para el activator y el autoscaler. Una mala configuración puede llevar a timeouts o a un escalado lento.

Implementa serverless containers en tu clúster y verás cómo la elasticidad se convierte en tu mejor aliado. El futuro es serverless, y corre sobre Kubernetes.

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel