Geo SSH応答コードエラーのトラブルシューティング
- プラン: Premium、Ultimate
- 提供形態: GitLab Self-Managed
NGINX Ingressを使用するCloud NativeデプロイでSSHプルおよびプッシュが際限なくハングする
この問題は、バンドルされたNGINX Ingressを使用するCloud Native GitLabデプロイにのみ影響します。IngressコントローラーとしてEnvoyを使用するデプロイはこの問題の影響を受けません。
Helmチャートを使用してデプロイされたセカンダリサイトからのSSHプッシュとプルは、以下の機能フラグが有効な場合に際限なくハングすることがあります:
geo_proxy_fetch_ssh_to_primarygeo_proxy_push_ssh_to_primary
これらのフラグは、Geoセカンダリに対して開始されたGit操作のSSHプロキシパスを変更します。これらはGitLabバージョン19.4.0以降でデフォルトで有効になっています。
この問題は、webservice IngressにおけるNGINXリクエストのバッファリングが原因です。GitLab Shellはストリーミングリクエストボディを送信しますが、Gitクライアントはrefアドバタイズメントを待ちます。NGINXはリクエストボディを待ち、Gitクライアントは応答を待つため、リクエストはWorkhorseに到達しません。
これを修正するには、デプロイに合ったオプションを選択してください:
- GitLab 18.11以前の場合: 両方の機能フラグを無効にします:
geo_proxy_fetch_ssh_to_primarygeo_proxy_push_ssh_to_primary
- GitLab 19.0以降の場合:
- IngressコントローラーとしてEnvoy Gatewayを使用するようにアップグレードします。
バンドルされたNGINX Ingressを使用している間は、両方の機能フラグを有効にしたままにしないでください。そうしないと、ユーザーはGeoセカンダリ経由でのSSHフェッチやプッシュを完了できない場合があります。
技術的な詳細については、Geo proxied git fetch error: fatal: the remote end hung up unexpectedlyを参照してください。
エラー: GeoセカンダリでSSH経由でプッシュする際にNet::ReadTimeout
GeoセカンダリサイトでSSH経由で大きなリポジトリをプッシュする際に、タイムアウトが発生する場合があります。これは、Railsがプッシュをプライマリにプロキシし、60秒のデフォルトタイムアウトがあるためです。このGeoイシューで説明されています。この問題は、geo_proxy_push_ssh_to_primary機能フラグが無効になっている場合にのみ発生します。
現在の回避策は次のとおりです:
- 代わりにHTTP経由でプッシュします。Workhorseがリクエストをプライマリにプロキシします(またはGeoプロキシが有効になっていない場合はプライマリにリダイレクトします)。
- プライマリに直接プッシュします。
ログの例(gitlab-shell.log):
Failed to contact primary https://primary.domain.com/namespace/push_test.git\\nError: Net::ReadTimeout\",\"result\":null}" code=500 method=POST pid=5483 url="http://127.0.0.1:3000/api/v4/geo/proxy_git_push_ssh/push"