この Topic では、Service Mesh (ASM) コンソールで gRPC バージョンと gRPC API に基づいて gRPC サーバーへのトラフィックをシェーピングする方法について説明します。
gRPC バージョンに基づく gRPC サーバーへのトラフィックシェーピング
gRPC サービスは、Java、Go、Node.js、および Python の各 gRPC サーバーにデプロイされます。 次の例では、gRPC クライアントからのリクエストを、Java gRPC サーバーにデプロイされている gRPC サービスにルーティングする方法を示します。
ASM コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、設定する ASM インスタンスを見つけます。 ASM インスタンスの名前をクリックするか、[アクション] 列の [管理] をクリックします。
[コントロールプレーン] セクションで、[DestinationRule] タブをクリックし、[作成] をクリックします。
[作成] パネルで、[名前空間] ドロップダウンリストから目的の名前空間を選択します。 次のコンテンツをコードエディタにコピーします。 次に、[OK] をクリックします。
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: namespace: grpc-best name: grpc-server-dr spec: host: grpc-server-svc subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 - name: v3 labels: version: v3 - name: v4 labels: version: v4[コントロールプレーン] セクションで、[VirtualService] タブをクリックし、[作成] をクリックします。
[作成] パネルで、[名前空間] ドロップダウンリストから目的の名前空間を選択します。 次のコンテンツをコードエディタにコピーします。 次に、[OK] をクリックします。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: namespace: grpc-best name: grpc-server-vs spec: hosts: - "*" gateways: - grpc-gateway http: - match: - port: 9996 route: - destination: host: grpc-server-svc subset: v1 weight: 100次のコマンドを実行して、すべてのリクエストが Java gRPC サービスにルーティングされているかどうかを確認します。
for i in {1..100}; do docker exec -e GRPC_SERVER="${INGRESS_IP}" -it "$client_node_container" node mesh_client.js >> mesh_result done sort mesh_result | grep -v "^[[:space:]]*$"| uniq -c | sort -nrk1期待される出力:
100 TalkOneAnswerMore:JAVA 100 TalkMoreAnswerOne:JAVA 100 TalkBidirectional:JAVA 100 Talk:JAVA
gRPC API 操作を使用した gRPC サーバーへのトラフィックシェーピング
gRPC API 操作を使用して、gRPC サーバーへのトラフィックを詳細にシェーピングできます。 gRPC API 操作は、通信モデル用に構築できます。 詳細については、「gRPC の通信モデルを実装する」をご参照ください。 Java、Go、Node.js、Python のプログラミング言語で、4 つの gRPC API 操作と 4 つの gRPC サービスが利用可能です。 次の例では、gRPC API 操作のリクエストを、その操作と同じ言語を使用する gRPC サーバーにルーティングするルーティングルールを設定する方法を示します。
ASM コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、設定する ASM インスタンスを見つけます。 ASM インスタンスの名前をクリックするか、[アクション] 列の [管理] をクリックします。
[コントロールプレーン] セクションで、[VirtualService] タブをクリックし、[作成] をクリックします。
[作成] パネルで、[名前空間] ドロップダウンリストから目的の名前空間を選択します。 次のコンテンツをコードエディタにコピーします。 次に、[OK] をクリックします。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: namespace: grpc-best name: grpc-server-vs spec: hosts: - "*" gateways: - grpc-gateway http: - match: - port: 9996 - uri: exact: /org.feuyeux.grpc.LandingService/talk route: - destination: host: grpc-server-svc subset: v1 weight: 100 - match: - port: 9996 - uri: exact: /org.feuyeux.grpc.LandingService/talkOneAnswerMore route: - destination: host: grpc-server-svc subset: v2 weight: 100 - match: - port: 9996 - uri: exact: /org.feuyeux.grpc.LandingService/talkMoreAnswerOne route: - destination: host: grpc-server-svc subset: v3 weight: 100 - match: - port: 9996 - uri: exact: /org.feuyeux.grpc.LandingService/talkBidirectional route: - destination: host: grpc-server-svc subset: v4 weight: 100次のコマンドを実行して、各 gRPC API 操作のリクエストが、その操作と同じ言語を使用する gRPC サーバーに送信されているかどうかを確認します。
for i in {1..100}; do docker exec -e GRPC_SERVER="${INGRESS_IP}" -it "$client_node_container" node mesh_client.js >> mesh_result done sort mesh_result | grep -v "^[[:space:]]*$"| uniq -c | sort -nrk1期待される出力:
100 TalkOneAnswerMore:GOLANG 100 TalkMoreAnswerOne:NODEJS 100 TalkBidirectional:PYTHON 100 Talk:JAVA