gRPC はサービス間通信のプロトコルで、HTTP/2 上で動作します。リソースベースの HTTP/1 上で動作する REST と異なり、gRPC は Service Definitions ベースです。データの通信や永続化のための小さなバイナリフォーマットへシリアライズすることができる protocol buffers (“proto”) と呼ばれるフォーマットで service definitions を指定します。
gRPC では .proto
ファイルから multiple programming languages へのボイラープレートコードを生成することができます。このため、gRPC は 多言語での microservices のための理想的な選択となるでしょう。
gRPC は TLS や client-side load balancing のようなユースケースをサポートしています。さらに gRPC のアーキテクチャに Istio を組み込むことはメトリクスの収集、トラフィックルールの追加、RPC-level authorization といった利点があります。すべてのトラフィックタイプに同一の Istio API を使用できるため、トラフィックが HTTP, TCP, gRPC, そして データベースプロトコルの間で混在している場合でも、Istio は 便利な管理レイヤーを追加できます。
Istio とそのデータプレーンプロキシーである Envoy の両方が gRPC をサポートします。Istio を用いてどのように gRPC トラフィックを管理するか見てみましょう。
このように、client
と server
の2つの gRPC サービスがあります。client
は RPC コールを server
の /SayHello
関数へ2秒ごとに行います。
Istio を gRPC Kubernetes サービスへ追加するためには要件があります。Kubernetes の Service ports の labeling です。server のポートは以下のようにラベル付けされます。
apiVersion: v1
kind: Service
metadata:
name: server
spec:
selector:
app: server
type: ClusterIP
ports:
- name: grpc # important!
protocol: TCP
port: 8080
アプリケーションをデプロイすると、service graph で client と server の間のトラフィックを見ることができます。
server の gRPC トラフィックメトリクスを Grafana でも見ることができます。
また、10秒遅延させる fault を server
へ挿入するための Istio のトラフィックルールを適用できます。アプリケーションの回復性をテストするために、カオステストシナリオでこのルールを適用できるかもしれません。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: server-fault
spec:
hosts:
- server
http:
- fault:
delay:
percentage:
value: 100.0
fixedDelay: 10s
route:
- destination:
host: server
subset: v1
これにより client RPC にタイムアウト(Outgoing Request Duration
)を起こします。
gRPC と Istio についてさらに学ぶために: