1
S3 ストレージ
S3 の説明に従い、お使いの S3 サービスまたはクラスター内の Garage で 3 つのバケットと 2 つのユーザーを設定し、4 つのキーを Secret
overleaf-s3 に格納します。以下の設定では、そのページの Garage の例を使用しています。2
設定
この ConfigMap は
30-config.yaml を置き換えます。S3 と git-bridge を追加し、OVERLEAF_SITE_URL をロードバランサーに向けます。60-config.yaml
3
レプリカ
70-overleaf.yaml
- Deployment ではなく StatefulSet。各レプリカは、ロードバランサーの Cookie と git-bridge が参照する固定の名前(
overleaf-0、overleaf-1、…)を持ちます。またOrderedReadyにより最初にoverleaf-0だけが起動するため、データベースのマイグレーションを実行するのは 1 つのレプリカだけになります。 - ノードごとに 1 つのレプリカ。各レプリカは自身のノードの Docker を通じてコンパイルを開始し、それを自身のノードの
/srv/overleaf-haに保持します。 - レプリカごとの
V1_HISTORY_URL。各レプリカは自身の名前を使って履歴リンクを発行するため、git-bridge がそれらに到達できます。
4
git-bridge
75-git-bridge.yaml
GIT_BRIDGE_HOST が固定 IP アドレスである理由については、Git 連携 を参照してください。5
ロードバランサー
HAProxy の設定は、Overleaf のサンプルに 5 つの変更を加えたものです。
/git/ と同様に /project/<id>/mcp を overleaf-0 にルーティングすること(MCP サーバー を参照)、ポート 8080 での通常の HTTP(イメージは非 root ユーザーで実行されるため、containerd 上ではポート 80 にバインドできません)、クラスター DNS によるサーバーの検出(Pod の IP は再起動のたびに変わります)、すべてのノードが応答するための DaemonSet、そしてデフォルトの roundrobin の代わりに balance leastconn を使用すること(下記の Q&A を参照)です。80-haproxy.yaml
externalTrafficPolicy: Local により、ユーザーの IP アドレスが X-Forwarded-For に保持されます。6
TLS
TLS プロキシ の説明に従って HAProxy で HTTPS を終端し、
60-config.yaml で OVERLEAF_SITE_URL を https:// のアドレスに、OVERLEAF_SECURE_COOKIE: "true" を設定します。期待される結果
それぞれ 2 vCPU と 4 GB のノード 3 台に 3 つのレプリカを配置し、MongoDB、Redis、Garage、git-bridge、HAProxy も同じノード上で動かしてテストしました。- 12 人のユーザーが 600 ページの文書を同時にコンパイル:12 人全員がコンパイルして PDF を取得でき、レプリカあたり 4 人でした。1 ラウンドに 8 ~ 18 秒かかりました。各ノードでは少なくとも 1.3 GB のメモリが利用可能なまま保たれました。
- すべてのユーザーは 1 つのレプリカに留まります(Cookie
server-pro-ha)。コンパイルしたレプリカから取得する必要がある PDF のダウンロードも同様です。エディターの WebSocket を含め、HTTPS でも同じです。 - レプリカが停止すると、HAProxy がそれをダウンと判定するまでの約 15 ~ 20 秒間、そのユーザーにはエラーが発生します。その後、ユーザーは別のレプリカに移動し、セッションが Redis にあるためログインしたままになります。
Q&A
なぜ balance leastconn を使うのですか?
なぜ balance leastconn を使うのですか?
回答:Overleaf のサンプル(
roundrobin、ノードごとに 1 つの HAProxy)では、テストで 12 人の新規ユーザーが 3 つのレプリカに 8、3、1 人と偏り、最も混雑したレプリカでは最も遅いユーザーが 29 秒待たされました。開いている接続が最も少ないレプリカを優先する leastconn(各エディターは WebSocket を開いたままにします)では、同じテストで 4、4、4 人、18 秒となりました。スティッキー性は変わりません。それは Cookie によって実現されています。HAProxy の代わりに Ingress コントローラーを使用できますか?
HAProxy の代わりに Ingress コントローラーを使用できますか?
回答:はい。Cookie によって固定のレプリカにルーティングでき、WebSocket をサポートし、10 分のリクエスト時間と 50 MB のアップロードを許可し、keep-alive タイムアウトを 65 秒未満に保ち、
X-Forwarded-For と X-Forwarded-Proto を送信し、/git/ と /project/<id>/mcp を overleaf-0 に送る場合は使用できます。すべてのリクエストを分散する Service ではなく、レプリカ自身の名前(overleaf-N.overleaf-hl)にルーティングしてください。4 つ目のレプリカを追加するには?
4 つ目のレプリカを追加するには?
回答:Docker と TeX Live イメージを備えたノードを追加し、
70-overleaf.yaml で replicas: 4 を設定し、HAProxy の設定に server overleaf-3 ... の行を追加します(HAProxy が再起動するように config-hash も更新してください)。
