Skip to main content
Una réplica usa la CPU de un solo nodo para todas las compilaciones: en nuestros nodos de prueba con 2 vCPU, seis compilaciones simultáneas tardaron tres veces más que una, mientras los demás nodos permanecían inactivos. Varias réplicas reparten a los usuarios, y sus compilaciones, entre los nodos. Esto sigue el diseño de Escalado horizontal de Overleaf, trasladado a Kubernetes:
Planifica S3 desde el principio. Una instancia que ya guarda archivos en su volumen necesita primero la migración a S3. Esta configuración sustituye al Deployment del paso 5: elimínalo (kubectl delete -f 40-overleaf.yaml) antes de aplicar el StatefulSet.
1

Almacenamiento S3

Configura los tres buckets y los dos usuarios como se describe en S3, con tu servicio S3 o con Garage en el clúster, y pon las cuatro claves en el Secret overleaf-s3. La configuración siguiente usa el ejemplo de Garage de esa página.
2

Configuración

Este ConfigMap sustituye a 30-config.yaml. Añade S3 y git-bridge y hace que OVERLEAF_SITE_URL apunte al balanceador de carga:
60-config.yaml
3

Réplicas

70-overleaf.yaml
  • StatefulSet, no Deployment. Cada réplica recibe un nombre estable (overleaf-0, overleaf-1, …) al que hacen referencia la cookie del balanceador de carga y git-bridge, y OrderedReady arranca primero overleaf-0 por sí sola, de modo que solo una réplica ejecuta las migraciones de la base de datos.
  • Una réplica por nodo. Cada réplica inicia sus compilaciones mediante el Docker de su nodo y las guarda en el /srv/overleaf-ha de su nodo.
  • V1_HISTORY_URL por réplica. Cada réplica entrega los enlaces del historial con su propio nombre, para que git-bridge pueda llegar a ellos.
4

git-bridge

75-git-bridge.yaml
Consulta Integración con Git para saber por qué GIT_BRIDGE_HOST es una dirección IP fija.
5

Balanceador de carga

La configuración de HAProxy es el ejemplo de Overleaf con cinco cambios: /project/<id>/mcp enrutado a overleaf-0 igual que /git/ (consulta Servidor MCP), HTTP sin cifrar en el puerto 8080 (la imagen se ejecuta como usuario no root, que no puede usar el puerto 80 con containerd), servidores localizados mediante el DNS del clúster (las IP de los pods cambian en cada reinicio), un DaemonSet para que todos los nodos respondan, y balance leastconn en lugar del roundrobin por defecto (consulta las preguntas y respuestas más abajo).
80-haproxy.yaml
externalTrafficPolicy: Local conserva las direcciones IP de los usuarios en X-Forwarded-For.
6

TLS

Termina HTTPS en HAProxy como se describe en Proxy TLS y, después, establece OVERLEAF_SITE_URL en la dirección https:// y OVERLEAF_SECURE_COOKIE: "true" en 60-config.yaml.

Qué esperar

Probamos tres réplicas en tres nodos con 2 vCPU y 4 GB cada uno, con MongoDB, Redis, Garage, git-bridge y HAProxy en los mismos nodos:
  • 12 usuarios compilando a la vez un documento de 600 páginas: los 12 compilaron y obtuvieron su PDF, 4 usuarios por réplica; una ronda tardó entre 8 y 18 segundos. Cada nodo mantuvo al menos 1,3 GB de memoria disponible.
  • Cada usuario permanece en una réplica (cookie server-pro-ha), incluida la descarga del PDF, que debe proceder de la réplica que lo compiló. Lo mismo ocurre con HTTPS, incluido el WebSocket del editor.
  • Cuando una réplica se detiene, sus usuarios reciben errores durante unos 15 a 20 segundos, hasta que HAProxy la marca como caída; después pasan a otra réplica y siguen con la sesión iniciada, porque las sesiones residen en Redis.

Preguntas y respuestas

Respuesta: Con el ejemplo de Overleaf (roundrobin, un HAProxy por nodo), 12 usuarios nuevos acabaron repartidos en 8, 3 y 1 entre las tres réplicas en nuestra prueba, y la réplica más cargada hizo esperar 29 segundos a los usuarios más lentos. Con leastconn, que prefiere la réplica con menos conexiones abiertas (cada editor mantiene un WebSocket abierto), la misma prueba dio 4, 4 y 4, y 18 segundos. La persistencia no cambia: procede de la cookie.
Respuesta: Sí, siempre que enrute mediante una cookie a una réplica estable, admita WebSockets, permita tiempos de petición de 10 minutos y subidas de 50 MB, mantenga su tiempo de espera keep-alive por debajo de 65 segundos, envíe X-Forwarded-For y X-Forwarded-Proto, y envíe /git/ y /project/<id>/mcp a overleaf-0. Enruta a los nombres propios de las réplicas (overleaf-N.overleaf-hl), no a un Service que reparta cada petición.
Respuesta: Añade un nodo con Docker y las imágenes de TeX Live, establece replicas: 4 en 70-overleaf.yaml y añade una línea server overleaf-3 ... a la configuración de HAProxy (e incrementa config-hash para que HAProxy se reinicie).
Última modificación el 2 de noviembre de 2026