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, yOrderedReadyarranca primerooverleaf-0por 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-hade su nodo. V1_HISTORY_URLpor 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
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
¿Por qué balance leastconn?
¿Por qué balance leastconn?
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.¿Puedo usar mi controlador de ingress en lugar de HAProxy?
¿Puedo usar mi controlador de ingress en lugar de HAProxy?
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.¿Cómo añado una cuarta réplica?
¿Cómo añado una cuarta réplica?
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).
