Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Domina el escalado horizontal: la guía para equipos modernos de CloudOps

By Josh PalmerJun 24, 202613 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

TL;DR: El escalado horizontal agrega instancias de servidor para distribuir los workloads en lugar de mejorar máquinas individuales. Es la base de una arquitectura en la nube confiable y eficiente en costos para tráfico impredecible, pero suma complejidad en la gestión del estado, el balanceo de carga y la configuración del autoescalado, algo que los equipos deben planificar antes de chocar con los límites de capacidad.

Toda aplicación tiene un techo. Por un tiempo, puedes elevarlo mejorando el hardware: más CPU, más RAM, almacenamiento más rápido. Pero llega un punto en que un solo servidor no da abasto y el costo de mejorarlo supera el valor que aporta. Ahí es cuando la decisión cambia de escalar hacia arriba a escalar hacia afuera.

Escalar hacia afuera, es decir, sumar más servidores para repartir la carga en lugar de agrandar uno solo, es la arquitectura que sostiene a la mayoría de las aplicaciones modernas en la nube. Es la forma en que las aplicaciones absorben picos de tráfico sin caerse, en que los equipos logran redundancia sin heroísmos de ingeniería y en que los costos de infraestructura se mantienen proporcionales a la demanda real y no a proyecciones del peor escenario.

Esta guía cubre cómo funciona el escalado horizontal, dónde encaja y dónde no, y cómo los equipos de CloudOps pueden implementarlo en AWS, Google Cloud y Kubernetes sin sacrificar confiabilidad a cambio de complejidad.

¿Qué es el escalado horizontal y cómo funciona?

El escalado horizontal consiste en agregar más instancias de un recurso para distribuir los workloads entre varios nodos, en lugar de aumentar la capacidad de un solo nodo. Mientras el escalado vertical mejora un servidor único (más núcleos de CPU, más memoria), el escalado horizontal multiplica la cantidad de servidores que atienden las solicitudes. Un balanceador de carga se ubica delante de la flota y reparte el tráfico entrante entre las instancias disponibles para que ningún nodo se vuelva un cuello de botella.

La mecánica varía un poco según la plataforma, pero el patrón se mantiene. En AWS, los Auto Scaling Groups monitorean métricas de CloudWatch y lanzan o terminan instancias EC2 automáticamente cuando la utilización cruza ciertos umbrales. En Kubernetes, el Horizontal Pod Autoscaler (HPA) observa la utilización de CPU y memoria (o métricas personalizadas) y ajusta en consecuencia el número de pods en ejecución. En Google Cloud, los Managed Instance Groups cumplen la misma función para workloads de Compute Engine. En todos los casos, una capa controladora se encarga de la decisión de escalado para que el equipo de Engineering no tenga que hacerlo.

¿Qué implicaciones tiene para el rendimiento y la capacidad?

El escalado horizontal cambia el modelo de capacidad: pasa de un techo fijo a un rango dinámico. Un sistema con escalado vertical choca con un límite duro cuando el tipo de instancia más grande disponible ya no puede con la carga. Un sistema con escalado horizontal, bien configurado, puede seguir sumando instancias hasta que la arquitectura o el presupuesto limiten el crecimiento.

El beneficio de rendimiento se potencia con la distribución geográfica. Ejecutar instancias en varias zonas de disponibilidad significa que la caída de una sola zona no tira abajo la aplicación: el tráfico se desvía esquivando la zona afectada mientras se levantan instancias de reemplazo. La contrapartida es la latencia entre nodos: las instancias distribuidas que necesitan comunicarse pagan un costo de ida y vuelta de red que una configuración de un solo servidor evita, algo que pesa en operaciones sensibles a la latencia.

¿Cómo afecta el escalado horizontal al costo y a la gestión de recursos?

El escalado horizontal alinea el costo de infraestructura con la demanda real mejor que el escalado vertical. Un servidor escalado verticalmente corre a su tamaño aprovisionado sin importar el tráfico. Una flota escalada horizontalmente puede reducirse en horas de baja demanda y expandirse en los picos, pagando precios on-demand por la capacidad transitoria y precios de reserva por la base predecible.

Esa alineación solo se sostiene, claro, si las políticas de autoescalado están bien afinadas. Umbrales de scale-out mal configurados que se disparan demasiado pronto, o políticas de scale-in que no retiran instancias con la rapidez suficiente, convierten la ventaja de costo en pérdida. La combinación de precios basados en commitments para la flota base (AWS Savings Plans, descuentos por uso comprometido de GCP) con capacidad on-demand para los picos le da a la mayoría de los equipos el mejor perfil de costo.

Para los workloads de Kubernetes en particular, el right-sizing de los requests y limits de los pods pesa tanto como la propia política de escalado. Los pods con requests de recursos inflados bloquean la eficiencia del bin-packing, lo que obliga al clúster a usar más nodos de los que el workload realmente necesita. DoiT PerfectScale for Kubernetes detecta esas oportunidades de right-sizing de forma automática, identificando dónde los requests de los pods no reflejan los patrones de uso reales.

¿Qué complejidad operativa introduce el escalado horizontal?

Más instancias significan más superficie que gestionar. La deriva de configuración, el parcheo en toda una flota, la agregación de logs y el tracing distribuido se vuelven más difíciles a escala que en un solo servidor. Los equipos que no se prepararon para esto lo descubren rápido cuando aparece un bug en un tipo de instancia pero no en otro, o cuando hay que correlacionar logs de 40 pods para rastrear una sola solicitud.

Las herramientas de infrastructure-as-code (Terraform, Pulumi, CloudFormation) son la mitigación de base. Los patrones de infraestructura inmutable, donde las instancias se reemplazan a partir de una imagen conocida en buen estado en lugar de modificarse in situ, eliminan la deriva de configuración. El logging centralizado y el tracing distribuido hacen manejable la depuración entre múltiples instancias.

¿Cómo se compara el escalado horizontal con el vertical para los equipos de CloudOps?

El escalado vertical (scaling up) y el horizontal (scaling out) no son excluyentes. La mayoría de las arquitecturas en producción usan ambos: instancias del tamaño adecuado para el workload, corriendo dentro de una flota escalada horizontalmente. La decisión está en qué palanca accionar primero cuando la capacidad se vuelve una restricción.

El escalado vertical es más rápido de implementar y no requiere cambios en la aplicación. Le agregas más CPU y memoria a una instancia existente, reinicias si hace falta, y listo. Funciona bien para workloads difíciles de distribuir: procesos de un solo hilo, aplicaciones con dependencias de estado estrechas o sistemas legados que no fueron pensados para operar en múltiples instancias. El techo es el tipo de instancia más grande disponible, y el costo no escala de manera proporcional a la demanda.

El escalado horizontal exige que la aplicación esté preparada. Los servicios stateless, en los que cada solicitud lleva todo el contexto que el servidor necesita y no se conserva estado local entre solicitudes, se distribuyen bien entre cualquier número de instancias. Los servicios stateful, en los que la aplicación guarda datos de sesión o estado en proceso de manera local, requieren arquitectura adicional para funcionar correctamente en una flota.

¿Por qué las aplicaciones stateless son ideales para el escalado horizontal?

Las aplicaciones stateless encajan naturalmente con el escalado horizontal porque cualquier instancia puede atender cualquier solicitud. Un balanceador de carga puede repartir tráfico en round-robin por toda la flota sin más lógica de enrutamiento que las verificaciones de disponibilidad. Cuando el tráfico se dispara, se levantan nuevas instancias y toman carga de inmediato. Cuando el tráfico baja, las instancias se terminan sin afectar ningún estado en curso.

La mayoría de las capas modernas de aplicaciones web, las capas de API y los microservicios son stateless por diseño. Una API REST que lee de una base de datos compartida no se ocupa de qué servidor procesa la solicitud. Un microservicio en contenedores que lee de una cola y escribe resultados en object storage escala horizontalmente sin coordinación adicional, y el autoescalado mantiene la capacidad proporcional a la demanda sin intervención manual.

¿Dónde generan retos las bases de datos y los workloads stateful?

Las bases de datos y los servicios stateful no escalan horizontalmente por defecto. Una base de datos relacional que corre sobre una sola instancia primaria no puede replicarse en cinco nodos y, sin más, manejar cinco veces el throughput de escritura. Las lecturas pueden escalar horizontalmente con réplicas de lectura, pero las escrituras siguen pasando por la primaria, lo que convierte a los workloads con muchas escrituras en un cuello de botella sin importar cuántas réplicas existan.

Los equipos lo resuelven moviendo el estado a una capa compartida: una base de datos administrada, una caché distribuida como Redis o un object store al que acceden todas las instancias. Los datos de sesión se mueven a Redis o DynamoDB. Las cargas de archivos van a S3 o Cloud Storage. Esa arquitectura de estado compartido hace que la capa de aplicación sea genuinamente stateless y, al mismo tiempo, preserva los datos que necesita.

Para Kubernetes en particular, los workloads stateful que necesitan almacenamiento persistente usan StatefulSets en lugar de Deployments. Los StatefulSets le dan a cada pod una identidad de red estable y un persistent volume claim, algo clave para bases de datos, colas y otros servicios ordenados y stateful.

¿Cuándo funciona el escalado horizontal y cuándo no?

El escalado horizontal entrega sus beneficios en condiciones específicas: patrones de tráfico impredecibles o con picos, capas de aplicación stateless, microservicios distribuidos y workloads cuyos requisitos de disponibilidad exigen redundancia. Aporta menos valor, y a veces crea problemas nuevos, en otras condiciones.

Los workloads en contenedores y los microservicios son el mejor encaje. Cada servicio escala de manera independiente según su propia demanda, así que un pico en una parte del sistema no sobreaprovisiona el resto. Un clúster de Kubernetes con 20 microservicios puede autoescalar cada servicio por separado, manteniendo alta la utilización de recursos en todo el sistema en lugar de dimensionar todo para la carga máxima. El Kubernetes Horizontal Pod Autoscaler le da a los equipos un control granular sobre esas políticas de escalado, incluidas métricas personalizadas más allá de CPU y memoria.

Las arquitecturas orientadas a eventos escalan particularmente bien en horizontal. Una flota de workers que consume de una cola puede crecer y reducirse según la profundidad de la cola, procesando ráfagas sin demora y liberando instancias cuando la cola se vacía. Herramientas como KEDA (Kubernetes Event-Driven Autoscaling) llevan este patrón de forma nativa a Kubernetes, escalando pods según fuentes de eventos externas como el largo de una cola SQS o el lag de un consumidor de Kafka.

¿Qué decisiones de balanceo de carga y distribución de tráfico pesan más?

El balanceador de carga es el punto de entrada de todo el tráfico hacia una flota escalada horizontalmente, lo que hace que su configuración sea un factor directo en el comportamiento de la aplicación. La distribución round-robin funciona para servicios stateless donde todas las instancias son equivalentes. El enrutamiento por menor número de conexiones funciona mejor cuando el tiempo de procesamiento varía mucho, dirigiendo las nuevas conexiones a la instancia con más capacidad disponible.

Los health checks son el eje operativo. Un balanceador que envía tráfico a una instancia en mal estado anula el sentido de tener una flota. Los health checks deberían probar la disponibilidad real de la aplicación (un endpoint HTTP real que verifique que las dependencias están disponibles) y no solo si la instancia responde a una conexión TCP. Health checks mal configurados, que pasan con demasiada facilidad o son demasiado estrictos, provocan flapping y eventos de escalado innecesarios.

¿Cómo afectan al escalado horizontal la gestión de sesiones y la consistencia de datos?

La gestión de sesiones es donde se quiebran muchas implementaciones de escalado horizontal. Una aplicación que guarda los datos de sesión en memoria local funciona bien en un solo servidor. Repartida en una flota, la segunda solicitud del mismo usuario podría caer en una instancia distinta sin conocimiento de la sesión de la primera, causando fallas de autenticación o pérdida del estado del carrito.

La solución es externalizar el estado de sesión. Redis y Memcached son las opciones estándar para almacenamiento de sesiones distribuido. La capa de aplicación se vuelve realmente stateless: lee y escribe los datos de sesión en la caché compartida en lugar de en memoria local. Todas las instancias ven el mismo estado de sesión, sin importar cuál procese la solicitud. Esto agrega una ida y vuelta de red por cada lectura de sesión, una concesión razonable a cambio de escalabilidad horizontal en la mayoría de las aplicaciones.

La consistencia de datos entre instancias distribuidas requiere atención explícita en el diseño para workloads con muchas escrituras. Los patrones de locking distribuido, control de concurrencia optimista o event sourcing abordan el problema de coordinación según los requisitos de consistencia.

¿Qué decisiones de monitoreo y configuración de autoescalado definen el éxito?

Las políticas de autoescalado valen lo que valen las métricas que las impulsan. La utilización de CPU es la métrica por defecto en la mayoría de los servicios de autoescalado administrados, pero es un indicador rezagado para muchos workloads. Una aplicación bajo presión de memoria o con cola acumulada puede mostrar utilización normal de CPU justo hasta que se cae. Las métricas personalizadas (profundidad de la cola de solicitudes, percentiles de latencia de respuesta, conteo de conexiones activas) le dan a las políticas de autoescalado señales más tempranas y precisas.

Las políticas de scale-out deberían ser agresivas; es preferible sobreaprovisionar brevemente que dejar que un pico de tráfico degrade la experiencia del usuario. Las políticas de scale-in deberían ser conservadoras, con períodos de cooldown e incrementos escalonados para no terminar instancias demasiado rápido después de un pico. Una flota que reduce su tamaño con demasiada rapidez ante un patrón de tráfico que oscila entre alto y normal va a estar en constante movimiento, levantando y bajando instancias con su costo asociado.

La guía de optimización de costos de Kubernetes cubre con más detalle cómo alinear la configuración de autoescalado con la eficiencia de costos, incluyendo cuotas de recursos a nivel de namespace y patrones de integración con VPA.

¿Cómo se implementan patrones de escalado horizontal y se evitan los errores comunes?

La implementación sigue una secuencia consistente sin importar la plataforma: validar que la aplicación sea stateless, configurar el grupo de escalado, definir políticas y probar antes de que el tráfico productivo dependa de ello.

En AWS, el stack se arma con Auto Scaling Groups e instancias EC2 (o tareas ECS para workloads en contenedores), un Application Load Balancer y alarmas de CloudWatch que disparan las políticas de escalado. Las decisiones de configuración críticas son el mínimo y el máximo de instancias, la métrica de utilización objetivo y los períodos de cooldown para scale-in y scale-out. Para una referencia detallada de configuración de EC2, la guía de costos, beneficios y mejores prácticas de AWS EC2 profundiza en la selección de instancias y la optimización de costos.

En Google Cloud, los Managed Instance Groups con políticas de autoescalado y un Global External Application Load Balancer entregan el stack equivalente. Los clústeres de GKE suman autoescalado nativo de Kubernetes por encima, con el Cluster Autoscaler gestionando el número de nodos y el HPA gestionando el número de pods de forma independiente.

En Kubernetes, sobre cualquier nube, la arquitectura agrega una capa de abstracción. Los Deployments definen el estado deseado de los pods, el HPA ajusta el número de réplicas según métricas, y el Cluster Autoscaler o Karpenter ajusta la cantidad de nodos según la presión de scheduling de los pods. Para los equipos que arman arquitectura de Kubernetes desde cero, Kubernetes architecture explained es una buena referencia de base.

Los errores más comunes no vienen de la configuración de escalado en sí, sino de supuestos de la aplicación que se rompen al distribuirla: nombres de host hardcodeados, escrituras en el filesystem local, cachés en proceso que divergen entre instancias y llamadas síncronas a servicios que no escalan al mismo ritmo. Detectar esos supuestos antes de que la aplicación pase a producción ahorra la sesión de debugging que, de lo contrario, llega en medio de un pico de tráfico.

Los Forward Deployed Engineers de DoiT trabajan codo a codo con los equipos de CloudOps en estos patrones de implementación, validando supuestos de arquitectura y configurando políticas de escalado que se ajustan al comportamiento real del tráfico.

¿Cómo respalda el escalado horizontal una operación en la nube resiliente?

El escalado horizontal es la infraestructura para la realidad de tráfico que enfrenta la mayoría de las aplicaciones en la nube: demanda difícil de predecir, picos que llegan sin aviso y requisitos de disponibilidad que no admiten puntos únicos de falla. Una flota que puede crecer cuando llega el tráfico y reducirse cuando pasa maneja esa realidad sin que un ingeniero tenga que responder a cada evento de escalado.

La madurez operativa que hace funcionar el escalado horizontal no es un solo cambio de configuración. Es un conjunto de prácticas: diseño stateless de la aplicación, gestión externa del estado, autoescalado guiado por métricas, infrastructure-as-code y herramientas de observabilidad que vuelven depurable a una flota distribuida. Los equipos que adoptan esas prácticas a tiempo escalan sin dramas. Los que las saltean escalan directo hacia los incidentes.

DoiT acompaña a los equipos de CloudOps en cada etapa de ese camino, desde la arquitectura inicial del clúster de Kubernetes hasta el right-sizing y la optimización del autoescalado para flotas establecidas. DoiT PerfectScale for Kubernetes analiza continuamente los workloads del clúster y propone recomendaciones de right-sizing y escalado para que los equipos dediquen menos tiempo al ajuste manual y más al trabajo que mueve la aguja del negocio. Habla con un ingeniero de DoiT para ver cómo este enfoque se aplica a tu arquitectura.

Preguntas frecuentes sobre el escalado horizontal

¿Cuál es la diferencia entre escalado horizontal y vertical?

El escalado horizontal agrega más instancias de un recurso (más servidores, más pods, más nodos) para distribuir los workloads. El escalado vertical aumenta la capacidad de una instancia existente (más CPU, más RAM). El escalado horizontal maneja demanda impredecible y aporta redundancia. El escalado vertical es más simple de implementar, pero tiene un techo duro en el tamaño de instancia más grande disponible.

¿Cuándo debe un equipo de CloudOps elegir escalado horizontal en lugar de vertical?

El escalado horizontal funciona mejor para capas de aplicación stateless, microservicios y workloads con tráfico variable o impredecible. El escalado vertical encaja mejor en procesos de un solo hilo, aplicaciones legadas que no pueden distribuir su estado o workloads que necesitan un aumento rápido de capacidad sin cambios en la aplicación. La mayoría de las arquitecturas en producción usan instancias del tamaño adecuado (vertical) corriendo dentro de una flota escalada horizontalmente.

¿El escalado horizontal reduce costos automáticamente?

No automáticamente. El escalado horizontal alinea el costo con la demanda mejor que un servidor grande fijo, pero solo si las políticas de autoescalado están bien afinadas y la flota base usa precios basados en commitments. Políticas de scale-in mal configuradas que dejan instancias corriendo después de que baja el tráfico, o umbrales de scale-out demasiado conservadores que exigen intervención manual durante los picos, erosionan el beneficio de costo.

¿Cómo maneja Kubernetes el escalado horizontal?

Kubernetes usa el Horizontal Pod Autoscaler (HPA) para ajustar el número de réplicas de pods en ejecución según la utilización de CPU, memoria o métricas personalizadas. El Cluster Autoscaler (o Karpenter en AWS) ajusta el número de nodos según la demanda de scheduling de los pods. Estos dos controladores trabajan en conjunto: el HPA escala la capa de aplicación, y el autoescalador de nodos escala la infraestructura subyacente para acomodarla.

¿Cuál es el mayor error de implementación que cometen los equipos de CloudOps con el escalado horizontal?

Asumir que la aplicación es stateless cuando no lo es. Las escrituras en el filesystem local, el almacenamiento de sesiones en memoria y los cachés en proceso crean estado oculto que se rompe cuando las solicitudes del mismo usuario caen en distintas instancias. Auditar la aplicación en busca de estos supuestos antes de escalar la flota evita que el modo de falla aparezca en producción.