Knative サービスで分散アーキテクチャまたはマイクロサービスアーキテクチャを使用している場合、gRPC を使用してクライアントとサーバー間の通信効率を向上させることができます。ACS Knative は、gRPC を含む HTTP および HTTP/2 プロトコルをサポートしています。Knative サービスの YAML ファイルに gRPC サービスを追加できます。その後、Knative Ingress は gRPC に基づいてトラフィックを自動的にルーティングできます。
前提条件
Knative は ACS クラスタにデプロイされています。詳細については、Knative のデプロイを参照してください。
手順 1: gRPC サービスのデプロイ
ACS コンソールにログオンします。左側のナビゲーションペインで、クラスタをクリックします。
クラスタページで、管理するクラスタを見つけ、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、 を選択します。
Knative ページで、サービスタブをクリックします。名前空間をdefault に設定し、テンプレートから作成をクリックし、サンプルテンプレートドロップダウンリストからカスタムを選択します。次のコンテンツをテンプレートエディターにコピーし、作成をクリックして、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 # リクエストに応答する gRPC サービスを提供することにより、gRPC をテストするために使用されるツールが含まれているイメージ。 env: - name: TARGET value: "Knative" ports: - containerPort: 9000 name: h2c # Knative ポートセクションの gRPC サービスの名前を h2c に設定します。 protocol: TCPHosts ファイルにマッピングを追加します。サービスタブのデフォルトドメイン列のデフォルトドメイン名をゲートウェイ列のゲートウェイアドレスにマッピングします。
マシン上の Hosts ファイルを見つけ、Hosts ファイルにマッピングを追加します。マッピングは、ゲートウェイアドレス + スペース文字 + デフォルトドメイン名の形式である必要があります。次に、デフォルトドメイン名を使用して gRPC サービスにアクセスします。
例:
121.xx.xxx.xx helloworld-grpc.default.example.com
手順 2: gRPC サービスの可用性の確認
grpcbin にアクセスし、OS に適した BloomRPC をインストールします。
次のコンテンツを
gRPC.protoファイルにコピーし、ファイルをオンプレミスマシンに保存します。syntax = "proto3"; package grpcbin; service GRPCBin { rpc Index(EmptyMessage) returns (IndexReply) {} // 空のメッセージを入力として受け取り、空のメッセージを出力として返す RPC メソッドを定義します。 rpc Empty(EmptyMessage) returns (EmptyMessage) {} // ダミメッセージを入力として受け取り、ダミメッセージを出力として返す RPC メソッドを定義します。 rpc DummyUnary(DummyMessage) returns (DummyMessage) {} // ダミメッセージを入力として受け取り、ダミメッセージのストリーム (10 メッセージ) を出力として返す RPC メソッドを定義します。 rpc DummyServerStream(DummyMessage) returns (stream DummyMessage) {} // ダミメッセージのストリーム (10 メッセージ) を入力として受け取り、ダミメッセージを出力として返す RPC メソッドを定義します。 rpc DummyClientStream(stream DummyMessage) returns (DummyMessage) {} // ダミメッセージのストリームを入力として受け取り、ダミメッセージのストリームを出力として返す RPC メソッドを定義します。 rpc DummyBidirectionalStreamStream(stream DummyMessage) returns (stream DummyMessage) {} // 指定された gRPC エラーのメッセージを返す RPC メソッドを定義します。 rpc SpecificError(SpecificErrorRequest) returns (EmptyMessage) {} // ランダムエラーのメッセージを返す RPC メソッドを定義します。 rpc RandomError(EmptyMessage) returns (EmptyMessage) {} // ヘッダーを返す RPC メソッドを定義します。 rpc HeadersUnary(EmptyMessage) returns (HeadersMessage) {} // メッセージを返さない RPC メソッドを定義します。 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 ゲートウェイを設定できます。たとえば、HTTP/2 経由で GRPCBin Index にアクセスするために gRPC を使用する場合は、Path フィールドをgrpcbin.GRPCBin/Indexに設定します。BloomRPC を使用して、gRPC サービスの可用性を確認します。サーバーが正常に応答を返す場合、gRPC サービスは使用可能です。
gRPC.protoファイルを BloomRPC にインポートします。左側のナビゲーションペインで、DummyUnary メソッドをクリックし、ページの上部に
ドメイン名:ポートを指定します。例:helloworld-grpc.default.example.com:80。緑色のボタンをクリックし、サーバーから返された応答が正常かどうかを確認します。
参考資料
カスタムドメイン名を使用して HTTPS 経由でサービスにアクセスするための証明書を設定する方法の詳細については、HTTPS 経由で Knative サービスにアクセスするための証明書の設定を参照してください。