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

Container Service for Kubernetes:KnativeにgRPCサービスをデプロイする

最終更新日:Dec 14, 2024

Knative Serviceが分散システムまたはマイクロサービスアーキテクチャを採用している場合、gRPCプロトコルを使用して、クライアントとサーバー間の通信効率を高めることができます。 ACK Knativeは、gRPCを含むHTTPおよびHTTP/2プロトコルをサポートします。 KnativeサービスのYAMLファイルにgRPCサービスをデプロイし、KnativeゲートウェイでgRPCルーティングを自動的に実装できます。

前提条件

Knativeはクラスターにデプロイされています。 詳細については、「」「Knativeのデプロイ」をご参照ください。

ステップ1: gRPCサービスのDepoy

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. On theクラスターページで、管理するクラスターの名前をクリックし、アプリケーション > Knative左側のナビゲーションウィンドウに表示されます。

  3. [Knative] ページで、[サービス] タブをクリックします。 [名前空間][デフォルト] に設定し、[テンプレートから作成] をクリックし、[サンプルテンプレート] ドロップダウンリストから [カスタム] を選択します。 次のコンテンツをテンプレートエディターにコピーし、[作成] をクリックしてhelloworld-grpcという名前のKnativeサービスを作成します。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-grpc
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/class: mpa.autoscaling.knative.dev
        spec:
          containers:
          - image: docker.io/moul/grpcbin # The image contains a tool that is used to test gRPC by providing a gRPC Service to respond to requests. 
            env:
            - name: TARGET
              value: "Knative"
            ports:
            - containerPort: 9000
              name: h2c # Set the name of the gRPC Service in the Knative port section to h2c. 
              protocol: TCP
  4. Hostsファイルにマッピングを追加します。 [デフォルトドメイン] 列のデフォルトドメイン名を、[サービス] タブの [ゲートウェイ] 列のゲートウェイアドレスにマップします。

    マシン上のHostsファイルを見つけ、Hostsファイルにマッピングを追加します。 マッピングは、ゲートウェイアドレス + スペース文字 + デフォルトドメイン名形式である必要があります。 次に、デフォルトのドメイン名を使用してgRPCサービスにアクセスします。

    例:

    121.xx.xxx.xx helloworld-grpc.default.example.com

ステップ2: gRPCサービスの可用性を確認する

  1. grpcbinにアクセスし、OSに適したBloomRPCをインストールします。

  2. 次の内容をgRPC.protoファイルにコピーし、オンプレミスマシンに保存します。

    syntax = "proto3";
    
    package grpcbin;
    
    service GRPCBin {
      rpc Index(EmptyMessage) returns (IndexReply) {}
      // Define an RPC method that takes an empty message as the input and returns an empty message as the output. 
      rpc Empty(EmptyMessage) returns (EmptyMessage) {}
      // Define an RPC method that takes a dummy message as the input and returns a dummy message as the output. 
      rpc DummyUnary(DummyMessage) returns (DummyMessage) {}
      // Define an RPC method that takes a dummy message as the input and returns a stream of dummy messages (10 messages) as the output. 
      rpc DummyServerStream(DummyMessage) returns (stream DummyMessage) {}
      // Define an RPC method that takes a stream of dummy messages (10 messages) as the input and returns a dummy message as the output. 
      rpc DummyClientStream(stream DummyMessage) returns (DummyMessage) {}
      // Define an RPC method that takes a stream of dummy messages as the input and returns a stream of dummy messages as the output. 
      rpc DummyBidirectionalStreamStream(stream DummyMessage) returns (stream DummyMessage) {}
      // Define an RPC method that returns a message of the specified gRPC error. 
      rpc SpecificError(SpecificErrorRequest) returns (EmptyMessage) {}
      // Define an RPC method that returns a message of a random error.
      rpc RandomError(EmptyMessage) returns (EmptyMessage) {}
      // Define an RPC method that returns a header. 
      rpc HeadersUnary(EmptyMessage) returns (HeadersMessage) {}
      // Define an RPC method that does not return any messages. 
      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を使用します。 gRPCサービスのパスは {パケット名}.{サービス名}/{メソッド名} です。 Pathフィールドを上記のパスに設定することで、gRPCパケットをルーティングするようにKnativeゲートウェイを設定できます。 たとえば、gRPCを使用してHTTP/2経由でgrpcbin Indexにアクセスする場合、PathフィールドをGRPCBin. GRPCBin/Indexに設定します。

  3. BloomRPCを使用して、gRPCサービスの可用性を確認します。 gRPCサービスは、サーバーが通常どおり応答を返す場合に使用できます。

    1. gRPC.protoファイルをBloomRPCにインポートします。

    2. 左側のナビゲーションウィンドウで、DummyUnaryメソッドをクリックし、ページ上部で [ドメイン名: ポート] を指定します。 例: helloworld-grpc.default.example.com:80

    3. 緑色のボタンをクリックして、サーバーから返される応答が正常かどうかを確認します。

関連ドキュメント

カスタムドメイン名を使用してHTTPS経由でサービスにアクセスするように証明書を設定できます。 詳細については、「HTTPS経由でサービスにアクセスするための証明書の設定」をご参照ください。