Service Mesh (ASM) ingressゲートウェイを使用して、ASMインスタンスのGoogle Remote Procedure Call (gRPC) サービスにアクセスできます。 これにより、gRPCサービスに正確なアクセス制御を実装し、サービスガバナンスを改善し、サービス間通信のセキュリティを確保できます。 このトピックでは、ingressゲートウェイを使用してASMインスタンスのgRPCサービスにアクセスする方法と、gRPCサービスの2つのバージョン間でトラフィックをシフトする方法について説明します。
前提条件
ingressゲートウェイがデプロイされます。 詳細については、「ingressゲートウェイの作成」をご参照ください。
最新バージョンのASMインスタンスが作成され、インスタンスエディションはEnterpriseまたはUltimateです。 アプリケーションは、ASMインスタンスに追加されたContainer Service for Kubernetes (ACK) クラスターにデプロイされます。 詳細については、「ASMインスタンスに関連付けられているクラスターへのアプリケーションのデプロイ」をご参照ください。
手順1: 2つのバージョンのgRPCサービスをデプロイする
gRPCサービスのバージョン1とバージョン2: istio-grpc-server-v1とistio-grpc-server-v2をデプロイします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
の上部にデプロイメントページから名前空間を選択します。名前空間ドロップダウンリストをクリックし、YAMLから作成する.
説明選択する名前空間には、istio-injection=enabledラベルが必要です。これは、名前空間に対して自動サイドカープロキシ注入が有効になっていることを示します。 詳細については、「自動サイドカープロキシ注入の有効化」をご参照ください。
On the作成ページ、サンプルテンプレートをカスタム次のYAMLコードをコードエディターにコピーし、作成.
手順2: ASMインスタンスのルーティングルールの設定
ASMインスタンスのIstioゲートウェイ、仮想サービス、および宛先ルールを作成して、すべてのインバウンドトラフィックをistio-grpc-server-v1にルーティングします。
ASMコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、設定するASMインスタンスを見つけます。 ASMインスタンスの名前をクリックするか、[操作] 列の [管理] をクリックします。
を作成するCreate anIstioゲートウェイ.
ASMインスタンスの詳細ページで、左側のナビゲーションウィンドウから を選択します。 表示されるページで、[YAMLから作成] をクリックします。
On the作成ページを選択します。デフォルトから名前空間ドロップダウンリストからテンプレートを選択します。テンプレートドロップダウンリストで、次の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: - "*"
を作成します。Create a宛先ルール.
ASMインスタンスの詳細ページで、左側のナビゲーションウィンドウから を選択します。 表示されるページで、[YAMLから作成] をクリックします。
On the作成ページを選択します。デフォルトから名前空間ドロップダウンリストからテンプレートを選択します。テンプレートドロップダウンリストで、次のYAMLコンテンツをコードエディターにコピーし、作成.
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"
を作成します。Create a仮想サービス.
ASMインスタンスの詳細ページで、左側のナビゲーションウィンドウから を選択します。 表示されるページで、[YAMLから作成] をクリックします。
On the作成ページを選択します。デフォルトから名前空間ドロップダウンリストからテンプレートを選択します。テンプレートドロップダウンリストで、次のYAMLコンテンツをコードエディターにコピーし、作成.
手順3: ingressゲートウェイを作成するか、既存のingressゲートウェイを使用する
ingressゲートウェイのポート8080を有効にします。 ポート8080が存在しない場合は、ポート8080を追加します。
ingressゲートウェイの作成
ASMコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
On theIngressゲートウェイページをクリックします。作成必要に応じてパラメーターを設定し、作成.
次の表に、いくつかのパラメーターを示します。 詳細については、「Ingress gatewayパラメーター」をご参照ください。
パラメーター
説明
クラスター
ingressゲートウェイをデプロイするクラスター。
CLBインスタンスタイプ
Classic Load Balancer (CLB) インスタンスのアクセスタイプ。 この例では、[インターネットアクセス] を選択します。
CLBインスタンスの作成または既存のCLBインスタンスの使用
[CLBインスタンスの作成] または [既存のCLBインスタンスの使用] を選択できます。
既存のCLBインスタンスの使用: ドロップダウンリストから既存のCLBインスタンスを選択します。
CLBインスタンスの作成: [CLBインスタンスの作成] をクリックし、ドロップダウンリストから必要なCLBインスタンスの仕様を選択します。
説明Kubernetes ServiceごとにCLBインスタンスを選択することを推奨します。 複数のKubernetes Servicesが同じCLBインスタンスを共有する場合、次のリスクと制限が存在します。
別のKubernetesサービスによってすでに使用されているCLBインスタンスを使用するようにKubernetesサービスを設定した場合、CLBインスタンスの既存のリスナーは強制的に上書きされます。 これにより、元のKubernetes Serviceが中断される可能性があります。
Kubernetes Serviceの作成時にCLBインスタンスを作成した場合、Kubernetes Services間でCLBインスタンスを共有することはできません。 共有できるのは、CLBコンソールまたはAPIを呼び出して作成したCLBインスタンスのみです。
同じCLBインスタンスを共有するKubernetesサービスは、異なるフロントエンドリスニングポートを使用する必要があります。 そうしないと、ポートの競合が発生する可能性があります。
複数のKubernetesサービスが同じCLBインスタンスを共有する場合、Kubernetesではリスナー名とvServerグループ名が一意の識別子として使用されます。 リスナーまたはvServerグループの名前は変更しないでください。
クラスター間でCLBインスタンスを共有することはできません。
ポートマッピング
プロトコルをTCPに、サービスポートを8080に設定します。
既存のingressゲートウェイへのポート8080の追加
ASMコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[Ingress Gateway] ページで、目的のゲートウェイの名前をクリックします。 [ゲートウェイの詳細] ページの [基本オプション] セクションで、[ポート] の横にあるアイコンをクリックします。 [ポートマッピング] ダイアログボックスで、[ポートの追加] をクリックし、[プロトコル] を [TCP] に設定し、[サービスポート] を [8080] に設定し、[送信] をクリックします。
ステップ4: gRPCクライアントを起動する
gRPCurlは、gRPCサービスとやり取りするために使用できるコマンドラインツールです。 gRPCサービスのテストとデバッグ、およびサービスの定義とメタデータの表示を簡単に行うことができます。 gRPCurlをダウンロードしてインストールするには、https://github.com/fullstorydev/grpcurl. 次のコマンドを実行します。
grpcurl -d '{"name": "Jack"}' -plaintext {IP address of the ingress gateway}: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: 特定の比率に基づいて、2つのバージョンのgRPCサービスにトラフィックをルーティングする
istio-grpc-server-v2へのトラフィックのルート40% とistio-grpc-server-v1へのトラフィックの60% 。
ASMコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
VirtualServiceベージのgrpc-vs仮想サーバで、アクション列にあるYAMLをクリックします。
[編集] ダイアログボックスで、次のYAMLコードをコードエディターにコピーします。 次に、[OK] をクリックします。
.... 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 address of the ingress gateway}: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!"