Skip to main content
Una sola replica usa la CPU di un solo nodo per ogni compilazione: sui nostri nodi di test con 2 vCPU, sei compilazioni simultanee hanno impiegato il triplo del tempo di una sola, mentre gli altri nodi restavano inattivi. Più repliche distribuiscono gli utenti, e le loro compilazioni, tra i nodi. Questo segue il modello di Scalabilità orizzontale di Overleaf, adattato a Kubernetes:
Pianifica S3 fin dall’inizio. Un’istanza che conserva già i file sul proprio volume richiede prima la migrazione a S3. Questa configurazione sostituisce il Deployment del passaggio 5: eliminalo (kubectl delete -f 40-overleaf.yaml) prima di applicare lo StatefulSet.
1

Storage S3

Configura i tre bucket e i due utenti come descritto in S3, con il tuo servizio S3 o con Garage nel cluster, e inserisci le quattro chiavi nel Secret overleaf-s3. La configurazione seguente usa l’esempio di Garage di quella pagina.
2

Configurazione

Questa ConfigMap sostituisce 30-config.yaml. Aggiunge S3 e git-bridge e fa puntare OVERLEAF_SITE_URL al load balancer:
60-config.yaml
3

Repliche

70-overleaf.yaml
  • StatefulSet, non Deployment. Ogni replica riceve un nome stabile (overleaf-0, overleaf-1, …) a cui fanno riferimento il cookie del load balancer e git-bridge, e OrderedReady avvia prima overleaf-0 da solo, così solo una replica esegue le migrazioni del database.
  • Una replica per nodo. Ogni replica avvia le proprie compilazioni tramite il Docker del proprio nodo e le conserva nella /srv/overleaf-ha del proprio nodo.
  • V1_HISTORY_URL per replica. Ogni replica distribuisce i link della cronologia con il proprio nome, in modo che git-bridge possa raggiungerli.
4

git-bridge

75-git-bridge.yaml
Vedi Integrazione Git per sapere perché GIT_BRIDGE_HOST è un indirizzo IP fisso.
5

Load balancer

La configurazione di HAProxy è l’esempio di Overleaf con cinque modifiche: /project/<id>/mcp instradato a overleaf-0 come /git/ (vedi Server MCP), HTTP semplice sulla porta 8080 (l’immagine viene eseguita come utente non root, che non può collegarsi alla porta 80 con containerd), server individuati tramite il DNS del cluster (gli IP dei pod cambiano a ogni riavvio), un DaemonSet affinché ogni nodo risponda, e balance leastconn al posto del roundrobin predefinito (vedi le domande e risposte più sotto).
80-haproxy.yaml
externalTrafficPolicy: Local mantiene gli indirizzi IP degli utenti in X-Forwarded-For.
6

TLS

Termina HTTPS in HAProxy come descritto in Proxy TLS, quindi imposta OVERLEAF_SITE_URL sull’indirizzo https:// e OVERLEAF_SECURE_COOKIE: "true" in 60-config.yaml.

Cosa aspettarsi

Abbiamo testato tre repliche su tre nodi con 2 vCPU e 4 GB ciascuno, con MongoDB, Redis, Garage, git-bridge e HAProxy sugli stessi nodi:
  • 12 utenti che compilano contemporaneamente un documento di 600 pagine: tutti e 12 hanno compilato e scaricato il proprio PDF, 4 utenti per replica; un ciclo ha richiesto da 8 a 18 secondi. Ogni nodo ha mantenuto almeno 1,3 GB di memoria disponibile.
  • Ogni utente resta su una replica (cookie server-pro-ha), incluso il download del PDF, che deve provenire dalla replica che lo ha compilato. Lo stesso vale su HTTPS, incluso il WebSocket dell’editor.
  • Quando una replica si arresta, i suoi utenti ricevono errori per circa 15-20 secondi, finché HAProxy non la contrassegna come non disponibile; poi passano a un’altra replica e restano connessi, perché le sessioni risiedono in Redis.

Domande e risposte

Risposta: Con l’esempio di Overleaf (roundrobin, un HAProxy per nodo), nel nostro test 12 nuovi utenti sono finiti distribuiti 8, 3 e 1 sulle tre repliche, e la replica più carica ha fatto attendere gli utenti più lenti 29 secondi. Con leastconn, che preferisce la replica con meno connessioni aperte (ogni editor mantiene aperto un WebSocket), lo stesso test ha dato 4, 4 e 4 e 18 secondi. La stickiness resta invariata: deriva dal cookie.
Risposta: Sì, se instrada tramite un cookie verso una replica stabile, supporta i WebSocket, consente tempi di richiesta di 10 minuti e caricamenti di 50 MB, mantiene il proprio timeout di keep-alive sotto i 65 secondi, invia X-Forwarded-For e X-Forwarded-Proto e invia /git/ e /project/<id>/mcp a overleaf-0. Instrada verso i nomi propri delle repliche (overleaf-N.overleaf-hl), non verso un Service che bilancia ogni richiesta.
Risposta: Aggiungi un nodo con Docker e le immagini TeX Live, imposta replicas: 4 in 70-overleaf.yaml e aggiungi una riga server overleaf-3 ... alla configurazione di HAProxy (e incrementa config-hash in modo che HAProxy si riavvii).
Ultima modifica il 2 novembre 2026