Skip to main content
レプリカが 1 つの場合、すべてのコンパイルに 1 つのノードの CPU を使用します。2 vCPU のテストノードでは、6 つの同時コンパイルに 1 つの場合の 3 倍の時間がかかり、その間ほかのノードはアイドル状態のままでした。複数のレプリカを使うと、ユーザーとそのコンパイルがノード間に分散されます。 これは Overleaf の 水平スケーリング の設計を Kubernetes に置き換えたものです。
S3 は最初から計画してください。すでにボリューム上にファイルを保存しているインスタンスでは、先に S3 への移行 が必要です。この構成はステップ 5 の Deployment を置き換えます。StatefulSet を適用する前に、Deployment を削除してください(kubectl delete -f 40-overleaf.yaml)。
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

回答:Overleaf のサンプル(roundrobin、ノードごとに 1 つの HAProxy)では、テストで 12 人の新規ユーザーが 3 つのレプリカに 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 に送る場合は使用できます。すべてのリクエストを分散する Service ではなく、レプリカ自身の名前(overleaf-N.overleaf-hl)にルーティングしてください。
回答:Docker と TeX Live イメージを備えたノードを追加し、70-overleaf.yaml で replicas: 4 を設定し、HAProxy の設定に server overleaf-3 ... の行を追加します(HAProxy が再起動するように config-hash も更新してください)。
最終更新日 2026年11月2日