Service Mesh(ASM)のレイヤー 4 ルーティング機能を使用して、ルーティングルールに基づいて TCP トラフィックをルーティングできます。このトピックでは、ASM でサポートされているすべての TCP マッチングルールとルーティング機能について説明します。
前提条件
サンプルアプリケーションのデプロイ
サンプルアプリケーションをデプロイし、サンプルコードで提供されている仮想サービスを使用して、レイヤー 4 の負荷分散をテストできます。レイヤー 4 の負荷分散をテストするには、以下の手順を実行して、データプレーンのクラスターに echo-server アプリケーションと telnet-client アプリケーションをデプロイします。
foo 名前空間を作成します。詳細については、「グローバル名前空間の管理」をご参照ください。
グローバル名前空間ASM コンソール の [グローバル名前空間] ページで、デフォルトの名前空間と foo 名前空間の両方でサイドカープロキシインジェクションまたは Ambient Mesh モードが有効になっていることを確認します。
kubectl を使用して、kubeconfig ファイルの情報に基づいてデータプレーンのクラスターに接続し、echo-server アプリケーションと telnet-client アプリケーションをデプロイします。
以下のサンプルコードに示されている対応するコンテンツを使用して、echoserver.yaml ファイルと telnet.yaml ファイルを作成します。
以下のコマンドを実行して、echo-server アプリケーションと telnet-client アプリケーションをデプロイします。
kubectl apply -f echoserver.yaml kubectl apply -f telnet.yaml
マッチングルール
destinationSubnets
tcp.match[n].destinationSubnets 属性を設定して、トラフィックの宛先 CIDR ブロックを照合できます。宛先 CIDR ブロックが属性で指定された値と一致する場合、トラフィックは tcp.match[n].destinationSubnets 属性に対応するルーティングルールを使用してルーティングされます。
サポートされているかどうか
Ambient Mesh モード:サポートされていません
サイドカーモード:サポートされています
サンプルリソースのデプロイ
次の YAML ファイルでは、宛先 CIDR ブロックは 192.168.0.0/16 です。この CIDR ブロック宛ての TCP トラフィックは、echo-server-2.default.svc.cluster.local サービスに転送されます。サンプルリソースは、CLI を使用するか、ASM コンソールでデプロイできます。次の例では、CLI を使用します。ASM コンソールでリソースをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。
以下のコンテンツを含む destinationSubnets.yaml ファイルを作成します。
サンプルコードでは、
echo-server.default.svc.cluster.localサービスのエンドポイントは192.168.0.0/16CIDR ブロックにあります。ビジネス要件に基づいてエンドポイントを変更します。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: echo namespace: default spec: hosts: - echo-server.default.svc.cluster.local tcp: - match: - destinationSubnets: - "192.168.0.0/16" route: - destination: host: echo-server-2.default.svc.cluster.localkubectl を使用して、kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。
kubectl apply -f destinationSubnets.yaml以下のコマンドを実行して、
echo-server.default.svc.cluster.local 19000への接続を確立し、testというコンテンツを送信して、telnet-client アプリケーションを使用してテストを開始します。kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 testhello2 testというメッセージが echo-server-2 から返されます。これは、トラフィックが仮想サービスで宣言されているポート 19000 の一致ルールにヒットしたことを示しています。ルーティングは想定どおりに実行されます。
port
tcp.match[n].port 属性を設定して、トラフィックの宛先ポートを照合できます。リクエストの宛先ポートがこの属性で指定された値と一致する場合、リクエストは tcp.match[n].port 属性に対応するルーティングルールを使用してルーティングされます。
サポートされているかどうか
Ambient Mesh モード:サポートされていません
サイドカーモード:サポートされています
サンプルリソースのデプロイ
次の YAML ファイルでは、宛先ポートは 19000 です。このポート宛ての TCP トラフィックは echo-server-2.default.svc.cluster.local サービスに転送されます。サンプルリソースは、CLI を使用するか、ASM コンソールでデプロイできます。次の例では、CLI を使用します。ASM コンソールでサンプルリソースをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。
以下のコンテンツを含む port.yaml ファイルを作成します。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: echo namespace: default spec: hosts: - echo-server.default.svc.cluster.local tcp: - match: - port: 19000 route: - destination: host: echo-server-2.default.svc.cluster.localkubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。
kubectl apply -f port.yaml以下のコマンドを実行して
echo-server.default.svc.cluster.local 19000への接続を確立し、testというコンテンツを送信して telnet-client アプリケーションを使用してテストを開始します。kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 testhello2 testというメッセージが echo-server-2 から返されます。これは、トラフィックが仮想サービスで宣言されているポート 19000 の一致ルールにヒットしたことを示しています。ルーティングは想定どおりに実行されます。
sourceLabels
tcp.match[n].sourceLabels 属性を設定して、特定のワークロードから送信されたリクエストを照合できます。
サポートされているかどうか
Ambient Mesh モード:サポートされていません
サイドカーモード:サポートされています
サンプルリソースのデプロイ
次の YAML ファイルは、app: telnet-client ラベルを持つワークロードから送信されたリクエストと一致します。 telnet-client アプリケーションは app: telnet-client ラベルを持ち、telnet-client-2 アプリケーションは app: telnet-client-2 ラベルを持ちます。したがって、telnet-client-2 アプリケーションから送信された TCP トラフィックではなく、telnet-client アプリケーションから送信された TCP トラフィックが、次の仮想サービスで定義されているルールと一致します。サンプルリソースは、CLI を使用するか ASM コンソールでデプロイできます。次の例では、CLI を使用します。ASM コンソールでサンプルリソースをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。
以下のコンテンツを含む sourceLabels.yaml ファイルを作成します。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: echo namespace: default spec: hosts: - echo-server.default.svc.cluster.local tcp: - match: - sourceLabels: app: telnet-client route: - destination: host: echo-server-2.default.svc.cluster.localkubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。
kubectl apply -f sourceLabels.yaml以下のコマンドを実行して
echo-server.default.svc.cluster.local 19000への接続を確立し、testというコンテンツを送信して、telnet-client アプリケーションを使用してテストを開始します。kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 testhello2 testというメッセージが echo-server-2 から返されます。これは、telnet-client アプリケーションが実行されているポッドから送信されたトラフィックが、仮想サービスで宣言されているルーティングルールと一致していることを示しています。以下のコマンドを実行して
echo-server.default.svc.cluster.local 19000への接続を確立し、testというコンテンツを送信して、telnet-client-2 アプリケーションを使用してテストを開始します。kubectl exec -it telnet-client-2-c56db78bd-7**** -c client -- telnet echo-server.default.svc.cluster.local:19000 testhello testというメッセージが echo-server から返されます。これは、トラフィックが echo-server-2 に転送されておらず、telnet-client-2 アプリケーションが実行されているポッドから送信されたトラフィックが、仮想サービスで宣言されているルーティングルールと一致していないことを示しています。ルーティングは想定どおりに実行されます。
gateways
tcp.match[n].gateways を設定して、特定のゲートウェイからサービスに送信されたリクエストを照合できます。
サポートされているかどうか
Ambient Mesh モード:サポートされています
サイドカーモード:サポートされています
サンプルリソースのデプロイ
上記の必須条件に加えて、次の例では 2 つの ASM ゲートウェイをデプロイする必要があります。これらは ingressgateway-1 と ingressgateway-2 という名前です。例で提供されている仮想サービスをこれら 2 つのゲートウェイに適用すると、ingressgateway-1 から送信されたトラフィックは echo-server アプリケーションにルーティングされ、ingressgateway-2 から送信されたトラフィックは echo-server-2 アプリケーションにルーティングされます。
2 つの ASM ゲートウェイを作成し、istio-ingressgateway-1 と istio-ingressgateway-2 という名前を付けます。詳細については、「イングレスゲートウェイの作成」をご参照ください。
ingressgateway-1 ゲートウェイと ingressgateway-2 ゲートウェイで同じ設定を行います。[ポートマッピング] を設定する際に、[ポートの追加] をクリックし、[プロトコル] を [TCP] に設定し、[サービスポート] を [19000] に設定します。

Istio ゲートウェイをデプロイします。
次の例では、CLI を使用します。ASM コンソールで Istio ゲートウェイをデプロイする方法の詳細については、「Istio ゲートウェイの管理」をご参照ください。
以下のコンテンツを使用して、それぞれ ingressgateway-1.yaml ファイルと ingressgateway-2.yaml ファイルを作成します。
次のサンプルコードでは、2 つのゲートウェイのリスニングポートが設定されています。この例では、TCP トラフィックが使用されています。したがって、Host は
*に設定されています。以下のコマンドを実行して、Istio ゲートウェイをデプロイします。
kubectl apply -f ingressgateway-1.yaml kubectl apply -f ingressgateway-2.yaml
2 つのゲートウェイの仮想サービスをデプロイします。
次の仮想サービスは、2 つのルーティングルールを定義しています。最初のルールはゲートウェイのマッチングを定義しています。トラフィックが ingressgateway-2 からの場合、トラフィックは
echo-server-2.default.svc.cluster.localにルーティングされます。サンプルリソースは、CLI を使用するか ASM コンソールでデプロイできます。次の例では、CLI を使用します。ASM コンソールでサンプルリソースをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。以下のコンテンツを含む ingressgateway-vs.yaml ファイルを作成します。
kubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。
kubectl apply -f ingressgateway-vs.yaml以下のコマンドを実行して ingressgateway-1 ゲートウェイの IP アドレスに接続し、
testというコンテンツを送信します。kubectl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 testhello testというメッセージが返されます。仮想サービスで定義されているように、ingressgateway-1 から送信されたトラフィックはecho-server.default.svc.cluster.localにルーティングされるはずです。トラフィックは想定どおりにルーティングされます。以下のコマンドを実行して ingressgateway-2 ゲートウェイの IP アドレスに接続し、
testというコンテンツを送信します。kubectl exec -it telnet-client-2-c56db78bd-7**** -c client -- telnet echo-server.default.svc.cluster.local:19000 testhello-2 testというメッセージが返されます。仮想サービスで定義されているように、ingressgateway-2 から送信されたトラフィックはecho-server-2.default.svc.cluster.localにルーティングされるはずです。トラフィックは想定どおりにルーティングされます。
sourceNamespace
sourceNamespace フィールドを設定して、トラフィックの送信元名前空間を照合できます。
サポートされているかどうか
Ambient Mesh モード:サポートされていません
サイドカーモード:サポートされています
サンプルリソースのデプロイ
次の YAML ファイルの目的:foo 名前空間から送信され、echo-server.default.svc.cluster.local 宛てのトラフィックは、echo-server-2.default.svc.cluster.local にルーティングされます。サンプルリソースは、CLI を使用するか ASM コンソールでデプロイできます。次の例では、CLI を使用します。ASM コンソールでリソースをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。
以下のコンテンツを含む source-namespace.yaml ファイルを作成します。
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: source-namespace namespace: default spec: hosts: - echo-server.default.svc.cluster.local http: [] tcp: - match: - sourceNamespace: foo route: - destination: host: echo-server-2.default.svc.cluster.local - route: - destination: host: echo-server.default.svc.cluster.localkubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。
kubectl apply -f source-namespace.yaml以下のコマンドを実行して、foo 名前空間の
telnet-clientアプリケーションを使用してtestというコンテンツを送信し、テストを開始します。kubectl -n foo exec -it telnet-client-foo-7c94569bfd-h**** -c client -- telnet echo-server.default.svc.cluster.local:19000 testhello2 testというメッセージが echo-server-2 から返されます。これは、foo 名前空間のtelnet-clientアプリケーションが実行されているポッドから送信されたトラフィックが、仮想サービスで宣言されているルーティングルールと一致していることを示しています。以下のコマンドを実行して、デフォルトの名前空間の
telnet-clientアプリケーションを使用してtestというコンテンツを送信し、テストを開始します。kubectl exec -it telnet-client-c56db78bd-7**** -c client -- telnet echo-server.default.svc.cluster.local:19000 testhello testというメッセージが echo-server から返され、トラフィックは echo-server-2 に転送されません。これは、default/telnet-clientポッドから送信されたトラフィックが、仮想サービスで定義されているデフォルトのマッチングルールに従ってecho-server.default.svc.cluster.localにルーティングされていることを示しています。
ルーティング
weight
weight フィールドを設定して、トラフィックのパーセンテージに基づいて複数のサブセット間でトラフィックをルーティングできます。
サポートされているかどうか
Ambient Mesh モード:サポートされていません
サイドカーモード:サポートされています
サンプルリソースのデプロイ
デプロイメントを作成します。
以下のコンテンツを含む echo-server-backup.yaml ファイルを作成します。
次の YAML ファイルは、echo-server アプリケーションのグレースケールサブセットをデプロイするために使用されます。
kubectl を使用して kubeconfig ファイルの情報に基づいてデータプレーンのクラスターに接続し、次のコマンドを実行してデプロイメントを作成します。
kubectl apply -f echo-server-backup.yaml
宛先ルールをデプロイします。
次の例では、CLI を使用します。ASM コンソールで宛先ルールをデプロイする方法の詳細については、「宛先ルールの管理」をご参照ください。
以下のコンテンツを含む echoserver-dr.yaml ファイルを作成します。
次の YAML ファイルは、echo-server アプリケーションの 2 つのサブセット(prod と gray)を作成する宛先ルールを定義しています。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: echo namespace: default spec: host: echo.default.svc.cluster.local subsets: - labels: version: prod name: prod - labels: version: gray name: graykubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して宛先ルールをデプロイします。
kubectl apply -f echoserver-dr.yaml
仮想サービスをデプロイします。
次の例では、CLI を使用します。ASM コンソールで仮想サービスをデプロイする方法の詳細については、「仮想サービスの管理」をご参照ください。
以下のコンテンツを含む echoserver-vs.yaml ファイルを作成します。
次の YAML ファイルは、prod サブセットと gray サブセットに
80:20のトラフィックウェイトを設定する仮想サービスを定義しています。これは、トラフィックの 80% が prod サブセットにルーティングされ、トラフィックの 20% が gray サブセットにルーティングされることを意味します。apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: echo spec: hosts: - echo-server.default.svc.cluster.local http: - route: - destination: host: echo-server.default.svc.cluster.local subset: gray weight: 20 - destination: host: echo-server.default.svc.cluster.local subset: prod weight: 80kubectl を使用して kubeconfig ファイルの情報に基づいて ASM インスタンスに接続し、次のコマンドを実行して仮想サービスをデプロイします。
kubectl apply -f echoserver-vs.yaml
以下のコマンドを実行して、
testというコンテンツを送信し、telnet-client アプリケーションを使用してテストを開始します。 echo-server アプリケーションからhello testというメッセージを受信したら、Ctrl + D ショートカットを押して終了します。上記の手順を 5 回繰り返します。$ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test hello-gray test $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test hello test $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test hello test $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test hello test $ ackctl exec -it telnet-client-5786fc744f-9**** -c client -- telnet echo-server.default.svc.cluster.local:19000 test hello testTCP トラフィックの負荷分散は接続レベルで動作します。上記のサンプルから、5 つの接続が仮想サービスで指定されたトラフィックのパーセンテージに基づいて prod サブセットと gray サブセットにルーティングされていることがわかります。トラフィックは設定されたトラフィックのパーセンテージに厳密に基づいてルーティングされるわけではないことに注意してください。