tldr
勉強がてらにEnvoyのドキュメントを邦訳してみました。ベースはGoogle Translateで、ところどころ不自然な箇所を直しています。
原文としたのEnvoyのドキュメントはこちらのディレクトリ以下にあります(ライセンス:Apache License 2.0, NOTICE)。
WebSocket と HTTP のアップグレード
Envoy Upgrade のサポートは主に WebSocket を対象としていますが、WebSocket 以外のアップグレードにも使用できます。アップグレードは、HTTP ヘッダーとアップグレードペイロードの両方を HTTP フィルタチェーンを介して渡します。カスタムフィルタチェーンの有無にかかわらず upgrade_configs を設定できます。 upgrade_type のみが指定されている場合、アップグレードヘッダー、要求と応答の本文、および WebSocket ペイロードの両方がデフォルトの HTTP フィルタチェーンを通過します。アップグレードペイロードに HTTP 専用フィルタを使用しないようにするには、特定のアップグレードタイプ用にカスタムフィルタを設定します。これには、ルータフィルタのみを使用して WebSocket データをアップストリームに送信することが含まれます。
アップグレードはルートごとに有効または無効にできます。以下に示すように、ルートごとの有効化/無効化は自動的に HttpConnectionManager の設定を上書きしますが、カスタムフィルタチェーンは HttpConnectionManager ごとにのみ設定できます。
HCMアップグレード有効化 | ルートアップグレード有効化 | アップグレード有効化 |
---|---|---|
T(デフォルト) | T(デフォルト)T | |
T(デフォルト) | F | F |
F | T(デフォルト) | T |
F | F | F |
アップグレードの統計はすべてまとめられているため、WebSocket の統計は downstream_cx_upgrades_total や downstream_cx_upgrades_active などの統計によって追跡されます。
H2ホップの取り扱い
Envoyは、一様な H2 メッシュを好む展開のために H2 ストリームを介した WebSocket のトンネリングをサポートします。これにより、たとえば、次の形式の配置が可能になります。
[Client] - HTTP / 1.1 - Front Envoy - HTTP / 2 - サイドカーEnvoy - H1 - App
この場合、クライアントがたとえば WebSocket を使用している場合、Websocket が機能的には上流のサーバーに到達するようにします。つまり、HTTP/2 ホップを通過する必要があります。
これは、拡張 CONNECT サポートを介して行われます。 WebSocket 要求は、元のアップグレードを示すプロトコルヘッダーを使用して HTTP/2 CONNECT ストリームに変換され、HTTP/2 ホップを通過し、HTTP/1 WebSocket アップグレードにダウングレードされます。これと同じ Upgrade-CONNECT-Upgrade 変換は、HTTP/1.1 メソッドが常に GET であると想定されているという文書化された欠陥とともに、すべての HTTP/2 ホップで実行されます。 WebSocket 以外のアップグレードでは有効な HTTP メソッド( POST )を使用でき、現在のアップグレード/ダウングレードメカニズムでは元のメソッドが削除され、最後の Envoy-Upstream ホップで Upgrade 要求が GET メソッドに変換されます。
H2 アップグレードパスは HTTP/1.1 に非常に厳密に準拠しているため、WebSocket のアップグレード要求または本文を含む応答を代理することはありません。