Skip to main content
一個副本的每次編譯都只會使用一個節點的 CPU:在我們配備 2 個 vCPU 的測試節點上,六個同時進行的編譯所花的時間是單一編譯的三倍,而其他節點則處於閒置狀態。多個副本可以將使用者及其編譯分散到各個節點上。 這遵循 Overleaf 的水平擴展設計,並轉換為 Kubernetes 的做法:
請從一開始就規劃好 S3。已將檔案保存在其磁碟區上的執行個體,必須先進行 S3 遷移。此設定會取代步驟 5 中的 Deployment:請在套用 StatefulSet 之前將其刪除(kubectl delete -f 40-overleaf.yaml)。
1

S3 儲存空間

依照 S3 中的說明,使用您的 S3 服務或叢集內的 Garage 設定三個儲存貯體與兩個使用者,並將四個金鑰放入 Secret overleaf-s3。以下設定使用該頁中的 Garage 範例。
2

設定

此 ConfigMap 會取代 30-config.yaml。它新增了 S3 與 git-bridge,並將 OVERLEAF_SITE_URL 指向負載平衡器:
60-config.yaml
3

副本

70-overleaf.yaml
  • 使用 StatefulSet,而非 Deployment。每個副本都會取得一個穩定的名稱(overleaf-0、overleaf-1、…),供負載平衡器 Cookie 與 git-bridge 參照,而 OrderedReady 會先單獨啟動 overleaf-0,因此只有一個副本會執行資料庫遷移。
  • 每個節點一個副本。每個副本都透過其節點的 Docker 啟動編譯,並將編譯保存在其節點的 /srv/overleaf-ha 中。
  • 每個副本各自的 V1_HISTORY_URL。每個副本都以自己的名稱提供歷史記錄連結,讓 git-bridge 能夠連線。
4

git-bridge

75-git-bridge.yaml
關於 GIT_BRIDGE_HOST 為何是固定 IP 位址,請參閱 Git 整合。
5

負載平衡器

此 HAProxy 設定是 Overleaf 的範例加上五項變更:/project/<id>/mcp 與 /git/ 一樣路由至 overleaf-0(請參閱 MCP Server);在連接埠 8080 上使用一般 HTTP(映像檔以非 root 使用者執行,在 containerd 下無法繫結連接埠 80);透過叢集 DNS 找到伺服器(pod IP 在每次重新啟動時都會改變);使用 DaemonSet 讓每個節點都能回應;以及使用 balance leastconn 取代預設的 roundrobin(請參閱下方的問與答)。
80-haproxy.yaml
externalTrafficPolicy: Local 會在 X-Forwarded-For 中保留使用者的 IP 位址。
6

TLS

依照 TLS 代理中的說明在 HAProxy 終止 HTTPS,然後在 60-config.yaml 中將 OVERLEAF_SITE_URL 設為 https:// 位址,並設定 OVERLEAF_SECURE_COOKIE: "true"。

預期效果

我們在三個各配備 2 個 vCPU 與 4 GB 記憶體的節點上測試了三個副本,MongoDB、Redis、Garage、git-bridge 與 HAProxy 也位於相同的節點上:
  • 12 位使用者同時編譯一份 600 頁的文件:12 位使用者全部完成編譯並取得 PDF,每個副本 4 位使用者;每一輪耗時 8 到 18 秒。每個節點都保有至少 1.3 GB 的可用記憶體。
  • 每位使用者都固定在一個副本上(Cookie server-pro-ha),包括必須來自執行編譯之副本的 PDF 下載。透過 HTTPS 時也是如此,包括編輯器的 WebSocket。
  • 當某個副本停止時,其使用者會在約 15 到 20 秒內遇到錯誤,直到 HAProxy 將其標記為停止;之後他們會移至另一個副本並維持登入狀態,因為工作階段保存在 Redis 中。

問與答

回答:在我們的測試中,使用 Overleaf 的範例(roundrobin,每個節點一個 HAProxy)時,12 位新使用者在三個副本上的分布為 8、3 與 1,而最忙碌的副本讓最慢的使用者等待了 29 秒。使用 leastconn(優先選擇開啟連線最少的副本,每個編輯器都會保持一個開啟的 WebSocket)時,同樣的測試得到 4、4 與 4 的分布,耗時 18 秒。黏性不受影響:它來自 Cookie。
回答:可以,只要它能依 Cookie 路由至穩定的副本、支援 WebSocket、允許 10 分鐘的請求時間與 50 MB 的上傳、將其 keep-alive 逾時設定在 65 秒以下、傳送 X-Forwarded-For 與 X-Forwarded-Proto,並將 /git/ 與 /project/<id>/mcp 傳送至 overleaf-0。請路由至各副本自己的名稱(overleaf-N.overleaf-hl),而不是會平衡每個請求的 Service。
回答:新增一個安裝了 Docker 與 TeX Live 映像檔的節點,在 70-overleaf.yaml 中設定 replicas: 4,並在 HAProxy 設定中新增一行 server overleaf-3 ...(同時遞增 config-hash,讓 HAProxy 重新啟動)。
最後修改於 2026年11月2日