Service Mesh (ASM) データプレーンは、Envoy に基づいてレイヤー 7 プロキシ(ゲートウェイ、Sidecar、Waypoint プロキシを含む)を実装し、高度な機能を実現するために使用できる複数の拡張メソッドを提供します。このトピックでは、ASM によって現在提供されているさまざまな拡張メソッドとそれぞれのユースケースの包括的な概要について説明します。
拡張メソッド
現在、ASM は主に次の拡張メソッドを提供しています。
これらのうち、外部処理、Lua、Wasm は HTTP プロトコルを介した外部サービスの呼び出しをサポートしています。
EnvoyFilter
フィルタは、Envoy の重要な概念です。異なるフィルタは特定の順序でフィルタチェーンを形成し、Envoy への受信リクエストを順次処理し、最終的にリクエストをアップストリームサービスに転送します。これらのフィルタは C++ で開発され、高性能を確保するために Envoy のコアコードとコンパイルされてバイナリファイルになります。
ASM シナリオでは、EnvoyFilter は ASM によって提供される Kubernetes リソースであり、データプレーンプロキシで既存のフィルターを変更したり、フィルターを追加したりできます。
EnvoyFilter は非常に柔軟性がありますが、Envoy 構成を直接記述する必要があるため、構成エラーによってアプリケーションが使用できなくなったり、異なるバージョン間で互換性がなくなったりする可能性があります。したがって、EnvoyFilter を使用するには、データプレーンの実装についてある程度理解している必要があります。
異なるバージョンに対して異なる構成の問題に対処するために、ASM は EnvoyFilter テンプレートを提供します。詳細については、「Envoy フィルタテンプレートを使用して Envoy フィルタを作成する」をご参照ください。
Lua、Wasm、およびカスタム認証サービスも Envoy のフィルタです。通常のフィルタとは異なり、これらのフィルタはカスタムロジックを実装できます。このセクションでは、特定の機能の通常の EnvoyFilter についてのみ説明します。
制限事項
Envoy によって公式に提供されているフィルターのみを使用できます。カスタムロジックはサポートされていません。
推奨されるシナリオ
Envoy がニーズを満たすフィルタを提供している場合は、EnvoyFilter リソースを使用することをお勧めします。たとえば、エラーページをカスタマイズしたり、413 応答が返されたときのキャッシュサイズを設定したりします。
Lua
Lua は軽量で効率的なスクリプト言語であり、主に組み込み開発やゲームプログラミングで使用されます。シンプルさと柔軟性で知られる Lua は、さまざまな分野で広く使用されています。
Envoy には特別な Lua フィルタがあり、フィルタ構成に Lua コードを直接記述できます。Envoy はリクエスト処理中にコードを呼び出して、カスタムロジックを実装します。関連する例については、「ASMイングレスゲートウェイでのクライアント IP ベースのルーティング」をご参照ください。
現在、Lua スクリプトは HTTP リクエストの処理時にのみ有効です。 TCP バイトストリームを直接操作するために使用することはできません。
制限事項
Lua コードに過度に複雑なロジックを記述しないでください。 EnvoyFilter 構成で直接記述すると、外部ツールライブラリを参照できないため、構成の保守が難しくなります。
Lua コードでリクエストまたはレスポンス本文を処理しないでください。処理すると、Envoy は本文全体をキャッシュします。本文のサイズが大きい場合、Envoy のメモリ使用量が高くなり、リクエストが 413(ペイロードが大きすぎる)を返す可能性があります。
推奨されるシナリオ
Lua スクリプト構成はシンプルで効率的です。要件が比較的シンプルで、少量のコードでカスタムロジックを実行できる場合は、Lua が適しています。
Wasm
WebAssembly(Wasm)は、移植可能なバイナリ実行可能形式であり、コードを効率的なバイナリファイルにコンパイルして、サンドボックス環境でネイティブに近い速度で実行できます。 Wasm はリソースの使用を厳密に制御し、明確に定義された API を介してホストと対話することで、セキュリティを強化します。
Lua とは異なり、Wasm バイナリファイルを Envoy に直接提供できるため、実行コードを個別に管理し、外部コードライブラリを使用してニーズを満たすことができます。 Wasm コードは、Rust、C++、Go などのさまざまなプログラミング言語で記述できます。例:
さらに、Wasm は、主に次の側面で、リクエストまたはレスポンスを処理するための強力な機能を備えています。
Wasm は TCP バイトストリームの操作をサポートしています。
Wasm はリクエストまたはレスポンス本文のストリーミング処理をサポートしています。 Wasm では、本文全体をキャッシュするか、チャンクで処理するかを選択できるため、本文処理効率が大幅に向上し、メモリ使用量が削減されます。
Wasm はサードパーティライブラリの使用をサポートしています。
制限事項
Wasm ランタイムには、ガベージコレクション(GC)言語(Java、C#、Go、Python などを含む)のサポートに関する問題があります。たとえば、Go を使用して Envoy で実行するための Wasm プラグインを記述すると、メモリ使用量が大幅に増加する可能性があります。コミュニティでは、Rust や C++ などの非 GC 言語を使用することをお勧めします。これらの言語は、メモリ使用量が少なく、実行効率が高くなります。ただし、これらの言語は通常、記述またはコンパイルの障壁が高くなります。ニーズに基づいて選択できます。
推奨されるシナリオ
関連する開発言語に精通しており、Envoy の内部処理ロジックを理解しており、複雑な要件がある場合は、高性能言語を使用することをお勧めします。パフォーマンスとリソース使用量に敏感でないシナリオでは、Go はシンプルで簡単な選択肢です。高パフォーマンスと低リソース使用量には、Rust または C++ をお勧めします。
外部処理
外部処理は、Envoy 1.23 で導入されたネイティブ C++ HTTP フィルタであり、ASM はバージョン 1.15 以降で採用しています。ユーザー構成に従って、HTTP リクエスト処理のさまざまな段階で指定された外部サービスを呼び出して、次のことができます。
HTTP リクエストまたはレスポンスヘッダーを取得および変更する。
HTTP リクエストまたはレスポンス本文を取得および変更する。
動的ストリームメタデータを取得および変更する(メトリックおよびアクセスログにカスタム情報を出力するため)。
カスタムレスポンスを直接返す。
関連する例については、「Envoy 外部処理サービスを使用してリクエストをカスタム処理する」をご参照ください。
外部処理に対する ASM のサポートは継続的に改善されています。
ASM 1.22 は、さまざまな Envoy メタデータと 属性 の受け渡しをサポートしています。
ASM 1.24 は、Envoy の非同期呼び出しモードをサポートしています。
HTTP リクエスト処理では、外部処理は Wasm に似ています。
比較 | Wasm | 外部処理 |
レイテンシ | 外部リクエストなし、低レイテンシ | リモート呼び出しが必要、高レイテンシ |
ランタイム | Wasm バイナリは Envoy のサンドボックスで実行され、Linux システムコールはありません | Envoy から完全に分離されており、カスタマイズ性が高い |
制限
リクエストとレスポンスの複数のステージを処理する必要がある場合、Envoy は外部処理サービスに複数の外部リクエストを行う必要があり、レイテンシが高くなる可能性があります。
HTTP プロトコルのみがサポートされています。 TCP バイトストリームは処理できません。
推奨シナリオ
レイテンシに敏感ではなく、複雑なビジネスロジックの場合は、Envoy で必要な gRPC インターフェースを実装していれば、任意の言語を使用できます。
カスタム認証サービス
カスタム認証サービスの原則は、Envoy が外部認証フィルタの構成をサポートしていることです。リクエストがこのフィルタによって処理されると、外部の標準 HTTP または gRPC サービスを呼び出して、リクエストを許可するか拒否するかを決定し、指定されたリクエストヘッダーを変更または追加できます。
ただし、カスタム認証サービスはリクエストを操作する機能が制限されており、Lua や Wasm ほど柔軟ではありません。主な利点は Envoy からの分離であり、特定のプログラミング言語やフレームワークに依存しない安定した API を備えています。 Envoy で必要な HTTP または gRPC API を実装するだけです。具体的な操作と構成例は次のとおりです。
制限事項
カスタム認証サービスはリクエストにのみ適用でき、レスポンスには適用できません。
リクエストメタデータの操作は、Lua や Wasm よりも柔軟性が低くなります。リクエスト本文は読み取ることしかできず、操作することはできません。
カスタム認証サービスは、どのリクエストヘッダーを操作できるかを個別に決定することはできず、追加の明示的な構成が必要です。
カスタム認証サービスは個別にデプロイする必要があるため、リクエスト処理のレイテンシが増加する可能性があります。
推奨されるシナリオ
Lua ではニーズを満たすことができず、Wasm 開発が複雑すぎる場合、上記の制限を受け入れることができる場合は、カスタム認証サービスを使用することをお勧めします。
プラグインセンターについて
ASM プラグインセンターは、Envoy のネイティブフィルタ、または Lua と Wasm に基づいて実装されているさまざまな組み込みプラグインを提供します。カスタマイズのニーズがある場合は、まずプラグインマーケットプレイスで適切な組み込みプラグインを確認してください。ない場合は、独自の構成または開発を検討してください。詳細については、「プラグインを有効にして ASM 機能を拡張する」をご参照ください。