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, eOrderedReadyavvia primaoverleaf-0da 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-hadel proprio nodo. V1_HISTORY_URLper 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
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
Perché balance leastconn?
Perché balance leastconn?
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.Posso usare il mio ingress controller al posto di HAProxy?
Posso usare il mio ingress controller al posto di HAProxy?
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.Come aggiungo una quarta replica?
Come aggiungo una quarta replica?
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).
