すべてのプロダクト
Search
ドキュメントセンター

Microservices Engine:クラウドネイティブゲートウェイに基づいて gRPC アプリケーションのリクエストをルーティングする

最終更新日:Jan 08, 2025

Google Remote Procedure Call(gRPC)フレームワークは HTTP/2 プロトコルを使用し、双方向ストリーミング、ヘッダー圧縮、多重化などの機能をサポートしています。これにより、ネットワーク伝送の効率が向上します。このトピックでは、Container Service for Kubernetes(ACK)クラスターに gRPC アプリケーションをデプロイし、クラウドネイティブゲートウェイを使用して gRPC アプリケーションのリクエストをルーティングする方法について説明します。

前提条件

手順 1:ACK クラスターに gRPC アプリケーションをデプロイする

アプリケーションのデプロイ方法の詳細については、「Deployment を使用してステートレスアプリケーションを作成する」をご参照ください。

この例では、ACK クラスターはサービスディスカバリに使用されます。バックエンドサービスは、アノテーションベースのサービス API を使用して CoreDNS に登録されます。この例では、grpcbin という名前のアプリケーションをバックエンドサービスとして使用して、複数の gRPC サービスを実装します。次のコードは、ACK クラスター内の grpcbin アプリケーションで使用されるリソースの構成を示しています。

説明

Kubernetes サービスの port フィールドにある gRPC サービスの name には、grpc を含める必要があります。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpcbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grpcbin
  template:
    metadata:
      labels:
        app: grpcbin
    spec:
      serviceAccountName: grpcbin
      containers:
      - image: docker.io/moul/grpcbin
        imagePullPolicy: IfNotPresent
        name: grpcbin
        ports:
        - containerPort: 9000
        - containerPort: 9001
        resources:
            requests:
              cpu: '1'
              memory: 2Gi
            limit:
              cpu: '1'
              memory: 2Gi
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: grpcbin
---
apiVersion: v1
kind: Service
metadata:
  name: grpcbin-grpc
  labels:
    app: grpcbin
spec:
  ports:
  - name: grpc  // gRPC サービスの名前
    port: 9000
    targetPort: 9000
  selector:
    app: grpcbin

次のコードは、gRPC サービスの proto 定義を示しています。

syntax = "proto3";

package grpcbin;

service GRPCBin {
  rpc Index(EmptyMessage) returns (IndexReply) {}
  // パラメーターを指定せずに呼び出されるメソッド。呼び出し後、空のレスポンスが返されます。
  rpc Empty(EmptyMessage) returns (EmptyMessage) {}
  // リクエストパラメーターが返されます。
  rpc DummyUnary(DummyMessage) returns (DummyMessage) {}
  // レスポンスのストリーミング呼び出しが開始され、10 個のレスポンスメッセージが返されます。
  rpc DummyServerStream(DummyMessage) returns (stream DummyMessage) {}
  // リクエストのストリーミング呼び出しが開始され、10 個のリクエストが受信され、最後のリクエスト本文が返されます。
  rpc DummyClientStream(stream DummyMessage) returns (DummyMessage) {}
  // リクエストとレスポンスの両方に使用されるストリーミングメソッド。
  rpc DummyBidirectionalStreamStream(stream DummyMessage) returns (stream DummyMessage) {}
  // このメソッドが呼び出された後、指定された gRPC エラーが返されます。
  rpc SpecificError(SpecificErrorRequest) returns (EmptyMessage) {}
  // このメソッドが呼び出された後、ランダムなエラーが返されます。
  rpc RandomError(EmptyMessage) returns (EmptyMessage) {}
  // このメソッドが呼び出された後、ヘッダーが返されます。
  rpc HeadersUnary(EmptyMessage) returns (HeadersMessage) {}
  // このメソッドが呼び出された後、レスポンスは返されません。
  rpc NoResponseUnary(EmptyMessage) returns (EmptyMessage) {}
}

message HeadersMessage {
  message Values {
    repeated string values = 1;
  }
  map<string, Values> Metadata = 1;
}

message SpecificErrorRequest {
  uint32 code = 1;
  string reason = 2;
}

message EmptyMessage {}

message DummyMessage {
  message Sub {
    string f_string = 1;
  }
  enum Enum {
    ENUM_0 = 0;
    ENUM_1 = 1;
    ENUM_2 = 2;
  }
  string f_string = 1;
  repeated string f_strings = 2;
  int32 f_int32 = 3;
  repeated int32 f_int32s = 4;
  Enum f_enum = 5;
  repeated Enum f_enums = 6;
  Sub f_sub = 7;
  repeated Sub f_subs = 8;
  bool f_bool = 9;
  repeated bool f_bools = 10;
  int64 f_int64 = 11;
  repeated int64 f_int64s= 12;
  bytes f_bytes = 13;
  repeated bytes f_bytess = 14;
  float f_float = 15;
  repeated float f_floats = 16;
}

message IndexReply {
  message Endpoint {
    string path = 1;
    string description = 2;
  }
  string description = 1;
  repeated Endpoint endpoints = 2;
}

gRPC サービスの基盤となるレイヤーは HTTP/2 プロトコルに基づいており、Path フィールドは {パッケージ名}.{サービス名}/{メソッド名} 形式です。MSE クラウドネイティブゲートウェイは、Path フィールドを使用して gRPC ルーティングを実装できます。たとえば、gRPC を使用して grpcbin の Index メソッドにアクセスする場合、HTTP/2 プロトコルの Path フィールドの値は grpcbin.GRPCBin/Index です。

手順 2:クラウドネイティブゲートウェイを使用して gRPC リクエストをルーティングする

ACK クラスターをクラウドネイティブゲートウェイのサービスソースとして追加し、grpcbin サービスを追加します。

サービスソースを追加する

  1. [MSE コンソール] にログインします。上部のナビゲーションバーで、リージョンを選択します。

  2. 左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの名前をクリックします。

  3. 左側のナビゲーションペインで、Routes をクリックします。表示されるページで、[ソース] タブをクリックします。

  4. Add Source をクリックします。Add Source パネルで、[ソースタイプ] を Container Service に設定し、パラメーターを構成して、OK をクリックします。

    パラメーター

    説明

    ACK/ACK Serverless Cluster

    バックエンドサービスが実行されているクラスターを選択します。

    説明

    ゲートウェイを作成する際には、クラスターがデプロイされている VPC を選択する必要があります。こうすることで、サービスソースを追加する際に、この VPC 内のクラスターが自動的に取得されます。

    [kubernetes Ingress をリッスンする]

    • このスイッチをオンにすると、クラウドネイティブゲートウェイは Ingress リソースの変更を自動的にリッスンし、Ingress リソースのドメイン名とルートのリッスンされた構成が有効になります。

    • このスイッチをオフにすると、クラウドネイティブゲートウェイは Ingress リソースの変更をリッスンしなくなり、Ingress リソースのドメイン名とルートのリッスンされた構成は無効になります。この操作を実行する際は注意してください。

    重要

    MSE コンソールで手動で構成されたドメイン名とルートの優先度は、クラウドネイティブゲートウェイがリッスンする Ingress リソースのドメイン名とルートの優先度よりも高くなります。

    Ingress Class

    Ingress リソースが関連付けられている Ingress クラス。

    • このパラメーターを指定しない場合、クラウドネイティブゲートウェイはクラスター内のすべての Ingress リソースを監視します。

    • このパラメーターに Ingress クラスを指定した場合、クラウドネイティブゲートウェイは、class アノテーションを持つ Ingress リソース、または Spec.IngressClassName の値が構成された値と同じである Ingress リソースを監視します。このパラメーターには複数の Ingress クラスを指定できません。このパラメーターを nginx に設定すると、クラウドネイティブゲートウェイは IngressClass が nginx である Ingress リソース、または Ingress クラスに関連付けられていない Ingress リソースをリッスンします。

    Namespace

    Ingress リソースが属する名前空間。

    • このパラメーターを指定しない場合、クラウドネイティブゲートウェイはクラスターのすべての名前空間にあるすべての Ingress リソースをリッスンします。

    • このパラメーターに単一の名前空間を指定した場合、クラウドネイティブゲートウェイはクラスターの指定された名前空間にある Ingress リソースをリッスンします。一度に複数の名前空間を指定することはできません。

    Update Ingress Status

    このパラメーターで [開く] を選択すると、リッスンする Ingress の IP アドレスが、クラウドネイティブゲートウェイに関連付けられたサーバーロードバランサー(SLB)インスタンスの IP アドレスに変更されます。

    説明

    この機能は、ゲートウェイのバージョンが 1.2.9 以降の場合にのみ使用できます。

    [セキュリティグループルール]

    セキュリティグループは、ACK クラスターのノードプールで構成されます。ほとんどの場合、クラスター外のコンポーネントがクラスター内のサービスにアクセスするには、セキュリティグループでサービスに必要なすべてのポートを有効にする必要があります。

    セキュリティグループを変更できます。詳細については、「セキュリティグループルールを構成する」をご参照ください。

サービスを追加する

  1. [MSE コンソール] にログインし、上部のナビゲーションバーでリージョンを選択します。

  2. 左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの名前をクリックします。

  3. 左側のナビゲーションペインで、Routes をクリックします。表示されるページで、[サービス] タブをクリックします。

  4. [サービス] タブで、[サービスの追加] をクリックします。[サービスの追加] パネルで、パラメーターを構成し、[OK] をクリックします。

    パラメーター

    説明

    [ソースタイプ]

    [コンテナサービス] を選択します。

    [名前空間]

    クラスターの名前空間を選択します。

    [サービス]

    [サービス] セクションから 1 つ以上のサービスを選択します。

ゲートウェイから grpcbin サービスへのルートを追加する

  1. [MSE コンソール] にログインし、上部のナビゲーションバーでリージョンを選択します。

  2. 左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの名前をクリックします。

  3. 左側のナビゲーションペインで、Routes をクリックし、[ルート] タブをクリックします。

  4. [ルート] タブで、[ルートの追加] をクリックします。[ルートの追加] ページで、パラメーターを構成し、[保存してアドバタイズ] をクリックします。詳細については、「ルートを作成する」をご参照ください。

    パラメーター

    説明

    [ルーティングルール名]

    このフィールドに grpc と入力します。

    [ドメイン名]

    ドロップダウンリストからデフォルトのドメイン名 * を選択します。

    [パス]

    ドロップダウンリストから [プレフィックス] を選択し、/grpcbin.GRPCBin で始まるパスを入力します。

    説明

    gRPC サービスのパスは、{パッケージ名}.{サービス名}/{メソッド名} 形式です。必要なルートプレフィックスを構成できます。

    [シナリオ]

    ルートに [単一サービス] を選択します。

    [バックエンドサービス]

    サービスを指定し、[サービスポート] パラメーターを構成します。

結果の確認

bloomrpc を使用して gRPC サービスの可用性をテストします。レスポンスが返された場合、gRPC サービスは使用可能です。

他の gRPC クライアントを使用してテストすることもできます。测试gRPC服务可用性