プロトコル選択
Istioは、あらゆるTCPトラフィックのプロキシをサポートしています。これには、HTTP、HTTPS、gRPC、および生のTCPプロトコルが含まれます。ルーティングや豊富なメトリクスなどの追加機能を提供するために、プロトコルを決定する必要があります。これは自動的に行うか、明示的に指定することができます。
UDPなどの非TCPベースのプロトコルはプロキシされません。これらのプロトコルは、Istioプロキシによる傍受なしに、通常どおりに機能しますが、イングレスやエグレスゲートウェイなどのプロキシ専用コンポーネントでは使用できません。
自動プロトコル選択
Istioは、HTTPおよびHTTP/2トラフィックを自動的に検出できます。プロトコルを自動的に特定できない場合、トラフィックはプレーンTCPトラフィックとして扱われます。
明示的なプロトコル選択
プロトコルは、Service定義で手動で指定できます。
これは2つの方法で設定できます。
- ポート名による指定:
name: <プロトコル>[-<サフィックス>]
。 - Kubernetes 1.18以降では、
appProtocol
フィールドによる指定:appProtocol: <プロトコル>
。
両方が定義されている場合、appProtocol
がポート名よりも優先されます。
ゲートウェイでの動作は、ゲートウェイがTLSを終端し、プロトコルがネゴシエートされる可能性があるため、一部のケースで異なることに注意してください。
以下のプロトコルがサポートされています。
プロトコル | サイドカーの目的 | ゲートウェイの目的 |
---|---|---|
http | プレーンテキストのHTTP/1.1トラフィック | プレーンテキストのHTTP(1.1または2)トラフィック |
http2 | プレーンテキストのHTTP/2トラフィック | プレーンテキストのHTTP(1.1または2)トラフィック |
https | TLSで暗号化されたデータ。サイドカーはTLSトラフィックを復号化しないため、これはtls と同じです | TLSで暗号化されたHTTP(1.1または2)トラフィック |
tcp | 不透明なTCPデータストリーム | 不透明なTCPデータストリーム |
tls | TLSで暗号化されたデータ | TLSで暗号化されたデータ |
grpc 、grpc-web | http2 と同じ | http2 と同じ |
mongo 、mysql 、redis | 実験的なアプリケーションプロトコルサポート。これらを有効にするには、対応する環境変数を設定してください。有効にしない場合、不透明なTCPデータストリームとして扱われます | 実験的なアプリケーションプロトコルサポート。これらを有効にするには、対応する環境変数を設定してください。有効にしない場合、不透明なTCPデータストリームとして扱われます |
以下は、appProtocol
でhttps
ポートを定義し、名前でhttp
ポートを定義するServiceの例です。
kind: Service
metadata:
name: myservice
spec:
ports:
- port: 3306
name: database
appProtocol: https
- port: 80
name: http-web
HTTPゲートウェイプロトコル選択
サイドカーとは異なり、ゲートウェイはデフォルトでは、バックエンドサービスにリクエストを転送する際に使用する特定のHTTPプロトコルを自動的に検出できません。したがって、HTTP/1.1(http
)またはHTTP/2(http2
またはgrpc
)を指定するために明示的なプロトコル選択を使用しない限り、ゲートウェイはすべての受信HTTPリクエストをHTTP/1.1を使用して転送します。
明示的なプロトコル選択を使用する代わりに、ServiceのuseClientProtocol
オプションを設定することで、受信リクエストと同じプロトコルを使用してリクエストを転送するようにゲートウェイに指示できます。ただし、HTTP/2をサポートしていないサービスでこのオプションを使用すると、HTTPSゲートウェイは常にHTTP/1.1とHTTP/2のサポートをアドバタイズするため、リスクを伴う可能性があることに注意してください。そのため、バックエンドサービスがHTTP/2をサポートしていない場合でも、最新のクライアントはそれをサポートしていると思い込み、多くの場合、それを使用することを選択します。