Knative サービスで分散システムまたはマイクロサービスモデルを使用している場合、gRPC プロトコルを使用してクライアントとサーバー間の通信効率を向上させることができます。ACK Knative は、gRPC を含む HTTP および HTTP/2 アクセスプロトコルをサポートしています。Knative Service YAML ファイルを使用して gRPC サービスをデプロイできます。Knative ゲートウェイは、gRPC プロトコルのルーティングを自動的に処理します。
前提条件
ステップ 1:gRPC サービスのデプロイ
Container Service for Kubernetes (ACK) コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
-
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
-
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 サービスでは、port 配下の name フィールドを h2c に設定する必要があります。 protocol: TCP -
サービス管理ページから取得できる ゲートウェイ IP アドレスに デフォルトドメイン をバインドするために、Hosts ファイルにマッピングを追加します。
お使いのコンピューター上の Hosts ファイルを探し、
<アクセスゲートウェイ IP> <デフォルトドメイン名>のフォーマットでバインド情報を追加します。これにより、ドメイン名を使用してサービスに直接アクセスできるようになります。例:121.xx.xxx.xx helloworld-grpc.default.example.com
ステップ 2:gRPC サービスの可用性の検証
-
grpcbin にアクセスし、お使いのオペレーティングシステム用の BloomRPC をインストールします。
-
次のコードを 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 プロトコル上に構築されています。パスフォーマットは {パッケージ名}.{サービス名}/{メソッド名} です。Knative ゲートウェイはこのパスフォーマットを使用して gRPC トラフィックをルーティングします。たとえば、gRPC を使用して grpcbin の Index メソッドにアクセスする場合、HTTP/2 プロトコルの Path フィールドの値は grpcbin.GRPCBin/Index となります。
-
BloomRPC を使用して gRPC サービスの可用性をテストします。サーバーが正常な応答を返した場合、サービスは利用可能です。
-
gRPC.proto ファイルを BloomRPC にインポートします。
-
左側のナビゲーションウィンドウで、DummyUnary メソッドをクリックします。ページの上部で、サーバーアドレスを `ドメイン名:ポート` のフォーマットで入力します。例:helloworld-grpc.default.example.com:80。
-
緑色の実行ボタンをクリックし、サーバーが正常な応答を返すかどうかを確認します。
-
参照
カスタムドメインに HTTPS 証明書を設定できます。詳細については、「HTTPS 証明書アクセスの設定」をご参照ください。