Service Mesh(ASM)イングレスゲートウェイを使用して、ASM インスタンス内の Google Remote Procedure Call(gRPC)サービスにアクセスできます。これにより、gRPC サービスに対する正確なアクセス制御を実装し、サービスガバナンスを向上させ、サービス間の通信のセキュリティを確保できます。このトピックでは、イングレスゲートウェイを使用して ASM インスタンス内の gRPC サービスにアクセスする方法と、gRPC サービスの 2 つのバージョン間でトラフィックをシフトする方法について説明します。
前提条件
手順 1:サンプルアプリケーションをデプロイする
gRPC サービスのバージョン 1 とバージョン 2(istio-grpc-server-v1 と istio-grpc-server-v2)をデプロイします。
app.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
次のコマンドを実行して、アプリケーションをデプロイします。
kubectl apply -f app.yaml
手順 2:ルーティングルールを設定する
すべてのインバウンドトラフィックを istio-grpc-server-v1 にルーティングするように、ASM インスタンスの Istio ゲートウェイ、仮想サービス、およびデスティネーションルールを作成します。
次のコマンドを実行して、rules.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: grpc-gateway spec: selector: istio: ingressgateway servers: - port: number: 8080 name: grpc protocol: GRPC hosts: - "*" --- apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: dr-istio-grpc-server spec: host: grpc-helloworld-py trafficPolicy: loadBalancer: simple: ROUND_ROBIN subsets: - name: v1 labels: version: "v1" - name: v2 labels: version: "v2" --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: grpc-vs spec: hosts: - "*" gateways: - grpc-gateway http: - match: - port: 8080 route: - destination: host: grpc-helloworld-py port: number: 50051 subset: v1 weight: 100 - destination: host: grpc-helloworld-py port: number: 50051 subset: v2 weight: 0次のコマンドを実行して、ルーティングルールをデプロイします。
kubectl apply -f rules.yaml
手順 3:イングレスゲートウェイを作成するか、既存のイングレスゲートウェイを使用する
イングレスゲートウェイを作成する
イングレスゲートウェイを作成し、イングレスゲートウェイの [サービスポート] を 8080 に設定します。
ポート 8080 を既存のイングレスゲートウェイに追加する
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[イングレスゲートウェイ] ページで、目的のゲートウェイの名前をクリックします。基本オプション[ゲートウェイの詳細] ページの
ポート[ポート マッピング][ポートを追加]プロトコルTCP[サービス ポート]8080[送信] セクションで、 の横にある アイコンをクリックします。 ダイアログボックスで、 をクリックし、 を に設定し、 を に設定して、 をクリックします。
手順 4: gRPC クライアントを起動する
grpcurl コマンドラインツールをインストールして、次のコマンドを実行します。
grpcurl -d '{"name": "Jack"}' -plaintext {イングレスゲートウェイの IP アドレス}:8080 helloworld.Greeter/SayHello出力は、すべてのリクエストが istio-grpc-server-v1 にルーティングされていることを示しています。
"message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
手順 5:特定の比率に基づいて gRPC サービス v2 にトラフィックをルーティングする
トラフィックの 40% を istio-grpc-server-v2 に、60% を istio-grpc-server-v1 にルーティングします。
次のコマンドを実行して、仮想サービスを編集します。
kubectl edit VirtualService grpc-vs次のコマンドを実行して
routeを変更し、ルールを保存します。.... route: - destination: host: grpc-helloworld-py port: number: 50051 subset: v1 weight: 60 - destination: host: grpc-helloworld-py port: number: 50051 subset: v2 weight: 40次の gRPCurl コマンドを実行して、ASM インスタンスにデプロイした gRPC サービスにアクセスします。
grpcurl -d '{"name": "Jack"}' -plaintext {イングレスゲートウェイの IP アドレス}:8080 helloworld.Greeter/SayHello出力は、トラフィックの 40% が istio-grpc-server-v2 にルーティングされていることを示しています。
説明トラフィックは、正確に 60:40 の比率で istio-grpc-server-v1 と istio-grpc-server-v2 にルーティングされない場合があります。ただし、全体的なトラフィック分布はこの比率に常に近くなります。
"message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"