Una aplicación cloud-native no es simplemente una aplicación que se ejecuta en la nube: es una aplicación diseñada para aprovechar la nube, es decir, pensada desde el principio para escalar horizontalmente, tolerar fallos, desplegarse de forma frecuente y automatizada, y ejecutarse en entornos dinámicos (contenedores, orquestadores, plataformas gestionadas). Para lograrlo, la comunidad ha consolidado una serie de patrones y principios probados que evitan reinventar la rueda y los errores típicos. Esta lección recoge los más importantes: la metodología de los 12 factores, los patrones de contenedores sidecar y ambassador, el patrón de migración strangler fig, el auto-escalado y la configuración externalizada. Dominarlos te permite diseñar sistemas resilientes, portables y operables, que son justo las cualidades que la nube premia.

Contenido

  1. La metodología de los 12 factores (resumen).
  2. Patrón Sidecar.
  3. Patrón Ambassador.
  4. Patrón Strangler Fig (estrangulador).
  5. Auto-escalado (horizontal y vertical).
  6. Configuración externalizada.
  7. Errores comunes y consejos.
  8. Ejercicios y soluciones.

  1. La metodología de los 12 factores

The Twelve-Factor App es un conjunto de buenas prácticas para construir aplicaciones SaaS portables y escalables. Aquí un resumen agrupado:

# Factor En una frase
1 Código base Un único repositorio versionado por aplicación
2 Dependencias Declaradas y aisladas explícitamente
3 Configuración En el entorno, nunca en el código
4 Servicios de respaldo Bases de datos, colas, etc. como recursos adjuntos intercambiables
5 Construir, liberar, ejecutar Etapas separadas y estrictas
6 Procesos La app se ejecuta como procesos sin estado
7 Asignación de puertos El servicio se expone a través de un puerto
8 Concurrencia Escala mediante el modelo de procesos (horizontal)
9 Desechabilidad Arranque rápido y apagado elegante
10 Paridad entre entornos Desarrollo, pruebas y producción lo más iguales posible
11 Registros (logs) Tratados como flujos de eventos a la salida estándar
12 Procesos de administración Tareas puntuales como procesos efímeros

Los tres que más impacto tienen en arquitectura cloud-native: (3) configuración en el entorno (lo veremos en detalle), (6) procesos sin estado (permite escalar y reemplazar instancias libremente) y (9) desechabilidad (las instancias deben poder morir y nacer sin drama, base de la resiliencia y el auto-escalado).

  1. Patrón Sidecar

El patrón sidecar (literalmente, el "sidecar" de una motocicleta) consiste en desplegar un contenedor auxiliar junto al contenedor principal de la aplicación, en el mismo Pod, compartiendo ciclo de vida, red y volúmenes. El sidecar añade funcionalidad transversal (logging, proxy, seguridad, sincronización) sin modificar la aplicación principal.

apiVersion: v1
kind: Pod
metadata:
  name: app-con-sidecar
spec:
  containers:
    - name: aplicacion          # contenedor principal
      image: miapp:1.0
      volumeMounts:
        - name: logs
          mountPath: /var/log/app
    - name: log-shipper         # sidecar: envia logs a un sistema central
      image: fluentbit:latest
      volumeMounts:
        - name: logs
          mountPath: /var/log/app   # comparte el mismo volumen
  volumes:
    - name: logs
      emptyDir: {}              # volumen compartido entre ambos

Explicación: el Pod tiene dos contenedores. aplicacion escribe sus logs en /var/log/app. El sidecar log-shipper (Fluent Bit) lee de ese mismo volumen compartido (emptyDir) y los envía a un sistema central. La aplicación no sabe nada de cómo se exportan sus logs: esa responsabilidad transversal vive en el sidecar. Es la base de las service meshes como Istio, donde un sidecar proxy gestiona toda la comunicación de red.

  1. Patrón Ambassador

El patrón ambassador (embajador) es un tipo especial de sidecar que actúa como proxy de salida: la aplicación habla con el embajador como si fuera el servicio remoto, y el embajador se encarga de los detalles de la conexión externa (reintentos, circuit breaker, cifrado TLS, sharding, monitorización). Así, la aplicación se simplifica y la lógica de red se centraliza.

graph LR
    APP[Aplicacion] -->|localhost:6379| AMB[Embajador / Proxy]
    AMB -->|reintentos, TLS, routing| EXT[(Servicio remoto: BD / Cache)]

Explicación del diagrama: la aplicación se conecta siempre a localhost (al embajador), ignorando dónde está realmente el servicio remoto. El embajador resuelve la conexión real, añade reintentos, cifrado y enrutamiento. Diferencia clave con el sidecar genérico: el sidecar suele añadir funciones que acompañan a la app (logging, métricas); el ambassador se especializa en gestionar las conexiones salientes hacia servicios externos.

  1. Patrón Strangler Fig (estrangulador)

El patrón strangler fig (higuera estranguladora, por la planta que envuelve y reemplaza al árbol que la sostiene) es la estrategia recomendada para migrar un sistema monolítico legado a microservicios de forma incremental, sin reescribirlo todo de golpe (lo que sería arriesgadísimo). La idea: colocas un proxy/enrutador delante del monolito y vas redirigiendo funcionalidades, una a una, hacia nuevos servicios, hasta que el monolito queda vacío y se retira.

graph TB
    USER[Usuario] --> ROUTER[Router / Fachada]
    ROUTER -->|/pagos nuevo| MS[Microservicio Pagos]
    ROUTER -->|resto, legado| MONO[Monolito legado]

Explicación: el router recibe todo el tráfico. La funcionalidad de "pagos" ya se ha extraído a un microservicio nuevo, así que el router envía /pagos al microservicio y todo lo demás sigue yendo al monolito. Con el tiempo, más rutas migran al lado nuevo hasta vaciar el monolito. Ventaja: migras con riesgo controlado, pudiendo revertir cada paso, y entregas valor de forma continua en lugar de en una arriesgada migración "big bang".

  1. Auto-escalado (autoscaling)

El auto-escalado ajusta automáticamente la capacidad según la demanda. Hay dos dimensiones:

Tipo Qué hace Cuándo usarlo
Horizontal (scale out/in) Añade o quita instancias/réplicas Lo preferido en cloud-native; requiere apps sin estado
Vertical (scale up/down) Da más/menos CPU y RAM a una instancia Cuando no se puede escalar horizontalmente

En Kubernetes, el Horizontal Pod Autoscaler (HPA) ajusta el número de Pods según métricas:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: miapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: miapp-deployment      # a que Deployment escala
  minReplicas: 2                # nunca menos de 2
  maxReplicas: 10               # nunca mas de 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70   # objetivo: 70% de uso de CPU

Explicación: el HPA vigila el Deployment miapp-deployment. Mantiene entre 2 y 10 réplicas y su objetivo es que el uso medio de CPU ronde el 70%. Si la CPU sube por encima, crea más Pods; si baja, los reduce (sin bajar de 2). Para que esto funcione, la aplicación debe ser sin estado (factor 6 y 9 de los 12 factores): cualquier réplica debe poder atender cualquier petición.

  1. Configuración externalizada

El factor 3 de los 12 factores dice: la configuración no va en el código. Las credenciales, URLs y parámetros que cambian entre entornos (desarrollo, pruebas, producción) deben inyectarse desde fuera, normalmente como variables de entorno o ficheros montados. Así, la misma imagen inmutable se promociona entre entornos cambiando solo la configuración, y no hay secretos hardcodeados en el repositorio.

En Kubernetes esto se hace con ConfigMap (configuración no sensible) y Secret (datos sensibles):

apiVersion: v1
kind: ConfigMap
metadata:
  name: miapp-config
data:
  LOG_LEVEL: "info"
  FEATURE_NUEVO_DASHBOARD: "true"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: miapp-deployment
spec:
  template:
    spec:
      containers:
        - name: miapp
          image: miapp:1.0
          envFrom:
            - configMapRef:
                name: miapp-config     # inyecta todas las claves como env vars
          env:
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:           # secreto, no en texto plano en el manifiesto
                  name: miapp-secret
                  key: db-password

Explicación: el ConfigMap guarda parámetros no sensibles (LOG_LEVEL, feature flags). En el Deployment, envFrom.configMapRef inyecta todas sus claves como variables de entorno del contenedor. La contraseña de base de datos se obtiene de un Secret mediante secretKeyRef, de modo que no aparece en texto plano en el manifiesto de despliegue. La imagen miapp:1.0 no cambia entre entornos; solo cambian el ConfigMap y el Secret. Recuerda que los Secret de Kubernetes están solo codificados en base64 por defecto: para datos verdaderamente sensibles, conviene un gestor de secretos dedicado y validar el enfoque con el equipo de seguridad.

Errores Comunes y Consejos

  • Guardar estado en la instancia. Sesiones o ficheros en memoria local rompen el escalado horizontal: usa almacenamiento externo (BD, caché, almacenamiento de objetos). Es el factor 6.
  • Configuración hardcodeada o secretos en el repositorio. Externaliza siempre la configuración. Un secreto subido a Git es un incidente de seguridad.
  • Migración big bang. Reescribir un monolito de cero suele acabar mal. Usa el patrón strangler para migrar de forma incremental y reversible.
  • Auto-escalar una app con estado. Si la app no es stateless, añadir réplicas no resuelve la carga y puede corromper datos.
  • Abusar de sidecars. Cada sidecar consume recursos en el Pod; añádelos cuando aporten valor transversal claro, no por moda.
  • No diseñar para la desechabilidad. Implementa apagado elegante (atender el SIGTERM, cerrar conexiones) para que el escalado y los despliegues no corten peticiones a medias.

Ejercicios

  1. ¿Por qué el principio "procesos sin estado" (factor 6) es un requisito previo para que el auto-escalado horizontal funcione bien?
  2. Tu equipo debe modernizar un gran monolito de seguros sin poder parar el servicio. Describe cómo aplicarías el patrón strangler fig en los primeros pasos.
  3. Diferencia con un ejemplo el patrón sidecar del patrón ambassador.

Soluciones

  1. Porque al escalar horizontalmente el tráfico se reparte entre muchas réplicas intercambiables, y cualquier petición puede caer en cualquier réplica. Si una réplica guardara estado local (la sesión del usuario, datos en memoria), las siguientes peticiones del mismo usuario podrían ir a otra réplica que no tiene ese estado, provocando errores. Con procesos sin estado, todas las réplicas son equivalentes y se pueden añadir, quitar o reemplazar libremente.
  2. Pasos iniciales: (1) colocar un router/fachada delante del monolito que reciba todo el tráfico sin cambiar el comportamiento; (2) elegir una funcionalidad acotada y de bajo riesgo (por ejemplo, consulta de un catálogo) y extraerla a un nuevo servicio; (3) configurar el router para que esa ruta vaya al servicio nuevo y el resto siga en el monolito; (4) verificar, medir y, si todo va bien, repetir con la siguiente funcionalidad. Cada paso es reversible.
  3. Sidecar: contenedor auxiliar que acompaña a la app aportando una función transversal; ejemplo, un log-shipper que recoge y envía los logs de la aplicación. Ambassador: sidecar especializado que actúa de proxy de salida hacia servicios externos; ejemplo, un proxy al que la app se conecta por localhost y que gestiona reintentos y TLS contra una base de datos remota.

Conclusión

Has recorrido los patrones que definen una arquitectura cloud-native: la disciplina de los 12 factores (sin estado, configuración externa, desechabilidad), los sidecars y ambassadors para añadir capacidades sin tocar la app, el strangler fig para migrar monolitos con seguridad, el auto-escalado para adaptarse a la demanda y la configuración externalizada con ConfigMaps y Secrets. Todos comparten un objetivo: aplicaciones resilientes, portables y operables. En la última lección del módulo veremos cómo crear y gestionar toda esta infraestructura de forma reproducible y versionada con la Infraestructura como Código (IaC).

Curso de Arquitectura de Aplicaciones

Módulo 1: Fundamentos de la Arquitectura de Aplicaciones

Módulo 2: Principios y Tácticas de Diseño

Módulo 3: Estilos y Patrones Arquitectónicos

Módulo 4: Arquitecturas Distribuidas y Microservicios

Módulo 5: Arquitecturas Dirigidas por Eventos y Mensajería

Módulo 6: Diseño Dirigido por el Dominio (DDD)

Módulo 7: Datos y Persistencia

Módulo 8: Arquitectura en la Nube y Despliegue

Módulo 9: Calidad, Seguridad y Observabilidad

Módulo 10: Evolución, Gobernanza y Casos Prácticos

© Copyright 2026. Todos los derechos reservados