Skip to main content
Ein Replikat nutzt für jede Kompilierung die CPU eines einzigen Knotens: Auf unseren Testknoten mit 2 vCPUs dauerten sechs gleichzeitige Kompilierungen dreimal so lange wie eine, während die anderen Knoten untätig blieben. Mehrere Replikate verteilen die Benutzer und ihre Kompilierungen auf die Knoten. Dies folgt Overleafs Konzept zur horizontalen Skalierung, übertragen auf Kubernetes:
Planen Sie S3 von Anfang an ein. Eine Instanz, die bereits Dateien auf ihrem Volume speichert, benötigt zuerst die S3-Migration. Dieses Setup ersetzt das Deployment aus Schritt 5: Löschen Sie es (kubectl delete -f 40-overleaf.yaml), bevor Sie das StatefulSet anwenden.
1

S3-Speicher

Richten Sie die drei Buckets und zwei Benutzer wie unter S3 beschrieben ein, mit Ihrem S3-Dienst oder mit Garage im Cluster, und tragen Sie die vier Schlüssel in das Secret overleaf-s3 ein. Die folgende Konfiguration verwendet das Garage-Beispiel von dieser Seite.
2

Konfiguration

Diese ConfigMap ersetzt 30-config.yaml. Sie fügt S3 und git-bridge hinzu und richtet OVERLEAF_SITE_URL auf den Load Balancer:
60-config.yaml
3

Replikate

70-overleaf.yaml
  • StatefulSet, nicht Deployment. Jedes Replikat erhält einen stabilen Namen (overleaf-0, overleaf-1, …), auf den sich das Load-Balancer-Cookie und git-bridge beziehen, und OrderedReady startet zuerst overleaf-0 allein, sodass nur ein Replikat die Datenbankmigrationen ausführt.
  • Ein Replikat pro Knoten. Jedes Replikat startet seine Kompilierungen über das Docker seines Knotens und speichert sie in /srv/overleaf-ha seines Knotens.
  • V1_HISTORY_URL pro Replikat. Jedes Replikat gibt Verlaufslinks mit seinem eigenen Namen aus, damit git-bridge sie erreichen kann.
4

git-bridge

75-git-bridge.yaml
Unter Git-Integration erfahren Sie, warum GIT_BRIDGE_HOST eine feste IP-Adresse ist.
5

Load Balancer

Die HAProxy-Konfiguration ist Overleafs Beispiel mit fünf Änderungen: /project/<id>/mcp wird wie /git/ an overleaf-0 geleitet (siehe MCP-Server), einfaches HTTP auf Port 8080 (das Image läuft als Nicht-Root-Benutzer, der unter containerd Port 80 nicht binden kann), Server werden über das Cluster-DNS gefunden (Pod-IPs ändern sich bei jedem Neustart), ein DaemonSet, damit jeder Knoten antwortet, und balance leastconn statt des Standards roundrobin (siehe Q&A unten).
80-haproxy.yaml
externalTrafficPolicy: Local behält die IP-Adressen der Benutzer in X-Forwarded-For bei.
6

TLS

Terminieren Sie HTTPS in HAProxy wie unter TLS-Proxy beschrieben und setzen Sie dann in 60-config.yaml OVERLEAF_SITE_URL auf die https://-Adresse sowie OVERLEAF_SECURE_COOKIE: "true".

Was Sie erwarten können

Wir haben drei Replikate auf drei Knoten mit jeweils 2 vCPUs und 4 GB getestet, mit MongoDB, Redis, Garage, git-bridge und HAProxy auf denselben Knoten:
  • 12 Benutzer, die gleichzeitig ein 600-seitiges Dokument kompilieren: Alle 12 kompilierten und luden ihr PDF ab, 4 Benutzer pro Replikat; eine Runde dauerte 8 bis 18 Sekunden. Auf jedem Knoten blieben mindestens 1,3 GB Arbeitsspeicher verfügbar.
  • Jeder Benutzer bleibt auf einem Replikat (Cookie server-pro-ha), einschließlich des PDF-Downloads, der von dem Replikat kommen muss, das kompiliert hat. Dasselbe gilt über HTTPS, einschließlich des WebSockets des Editors.
  • Wenn ein Replikat stoppt, erhalten seine Benutzer etwa 15 bis 20 Sekunden lang Fehler, bis HAProxy es als ausgefallen markiert; dann wechseln sie zu einem anderen Replikat und bleiben angemeldet, da die Sitzungen in Redis liegen.

Q&A

Antwort: Mit Overleafs Beispiel (roundrobin, ein HAProxy pro Knoten) verteilten sich in unserem Test 12 neue Benutzer mit 8, 3 und 1 auf die drei Replikate, und das am stärksten ausgelastete Replikat ließ die langsamsten Benutzer 29 Sekunden warten. Mit leastconn, das das Replikat mit den wenigsten offenen Verbindungen bevorzugt (jeder Editor hält einen WebSocket offen), ergab derselbe Test 4, 4 und 4 sowie 18 Sekunden. Die Sticky Sessions bleiben unverändert: Sie beruhen auf dem Cookie.
Antwort: Ja, sofern er per Cookie an ein stabiles Replikat routet, WebSockets unterstützt, Anfragezeiten von 10 Minuten und Uploads von 50 MB erlaubt, sein Keep-Alive-Timeout unter 65 Sekunden hält, X-Forwarded-For und X-Forwarded-Proto sendet und /git/ sowie /project/<id>/mcp an overleaf-0 leitet. Routen Sie zu den eigenen Namen der Replikate (overleaf-N.overleaf-hl), nicht zu einem Service, der jede Anfrage verteilt.
Antwort: Fügen Sie einen Knoten mit Docker und den TeX-Live-Images hinzu, setzen Sie replicas: 4 in 70-overleaf.yaml und fügen Sie der HAProxy-Konfiguration eine Zeile server overleaf-3 ... hinzu (und erhöhen Sie config-hash, damit HAProxy neu startet).
Zuletzt geändert am 2. November 2026