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 中。
問與答
為什麼使用 balance leastconn?
為什麼使用 balance leastconn?
回答:在我們的測試中,使用 Overleaf 的範例(
roundrobin,每個節點一個 HAProxy)時,12 位新使用者在三個副本上的分布為 8、3 與 1,而最忙碌的副本讓最慢的使用者等待了 29 秒。使用 leastconn(優先選擇開啟連線最少的副本,每個編輯器都會保持一個開啟的 WebSocket)時,同樣的測試得到 4、4 與 4 的分布,耗時 18 秒。黏性不受影響:它來自 Cookie。可以使用我的 ingress 控制器來取代 HAProxy 嗎?
可以使用我的 ingress 控制器來取代 HAProxy 嗎?
回答:可以,只要它能依 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 重新啟動)。
