Google Remote Procedure Call(gRPC)フレームワークは HTTP/2 プロトコルを使用し、双方向ストリーミング、ヘッダー圧縮、多重化などの機能をサポートしています。これにより、ネットワーク伝送の効率が向上します。このトピックでは、Container Service for Kubernetes(ACK)クラスターに gRPC アプリケーションをデプロイし、クラウドネイティブゲートウェイを使用して gRPC アプリケーションのリクエストをルーティングする方法について説明します。
前提条件
クラウドネイティブゲートウェイが作成されていること。詳細については、「MSE クラウドネイティブゲートウェイを作成する」をご参照ください。
ACK クラスターが作成されていること。詳細については、「ACK マネージドクラスターを作成する」をご参照ください。
手順 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 サービスを追加します。
サービスソースを追加する
[MSE コンソール] にログインします。上部のナビゲーションバーで、リージョンを選択します。
左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションペインで、Routes をクリックします。表示されるページで、[ソース] タブをクリックします。
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 クラスターのノードプールで構成されます。ほとんどの場合、クラスター外のコンポーネントがクラスター内のサービスにアクセスするには、セキュリティグループでサービスに必要なすべてのポートを有効にする必要があります。
セキュリティグループを変更できます。詳細については、「セキュリティグループルールを構成する」をご参照ください。
サービスを追加する
[MSE コンソール] にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションペインで、Routes をクリックします。表示されるページで、[サービス] タブをクリックします。
[サービス] タブで、[サービスの追加] をクリックします。[サービスの追加] パネルで、パラメーターを構成し、[OK] をクリックします。
パラメーター
説明
[ソースタイプ]
[コンテナサービス] を選択します。
[名前空間]
クラスターの名前空間を選択します。
[サービス]
[サービス] セクションから 1 つ以上のサービスを選択します。
ゲートウェイから grpcbin サービスへのルートを追加する
[MSE コンソール] にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Cloud-Native Gateway > ゲートウェイリスト を選択します。[ゲートウェイ] ページで、ゲートウェイの名前をクリックします。
左側のナビゲーションペインで、Routes をクリックし、[ルート] タブをクリックします。
[ルート] タブで、[ルートの追加] をクリックします。[ルートの追加] ページで、パラメーターを構成し、[保存してアドバタイズ] をクリックします。詳細については、「ルートを作成する」をご参照ください。
パラメーター
説明
[ルーティングルール名]
このフィールドに grpc と入力します。
[ドメイン名]
ドロップダウンリストからデフォルトのドメイン名 * を選択します。
[パス]
ドロップダウンリストから [プレフィックス] を選択し、/grpcbin.GRPCBin で始まるパスを入力します。
説明gRPC サービスのパスは、{パッケージ名}.{サービス名}/{メソッド名} 形式です。必要なルートプレフィックスを構成できます。
[シナリオ]
ルートに [単一サービス] を選択します。
[バックエンドサービス]
サービスを指定し、[サービスポート] パラメーターを構成します。
結果の確認
bloomrpc を使用して gRPC サービスの可用性をテストします。レスポンスが返された場合、gRPC サービスは使用可能です。
他の gRPC クライアントを使用してテストすることもできます。