gRPC

gRPC はサービス間通信のプロトコルで、HTTP/2 上で動作します。リソースベースの HTTP/1 上で動作する REST と異なり、gRPC は Service Definitions ベースです。データの通信や永続化のための小さなバイナリフォーマットへシリアライズすることができる protocol buffers (“proto”) と呼ばれるフォーマットで service definitions を指定します。

gRPC では .proto ファイルから multiple programming languages へのボイラープレートコードを生成することができます。このため、gRPC は 多言語での microservices のための理想的な選択となるでしょう。

gRPC は TLSclient-side load balancing のようなユースケースをサポートしています。さらに gRPC のアーキテクチャに Istio を組み込むことはメトリクスの収集、トラフィックルールの追加、RPC-level authorization といった利点があります。すべてのトラフィックタイプに同一の Istio API を使用できるため、トラフィックが HTTP, TCP, gRPC, そして データベースプロトコルの間で混在している場合でも、Istio は 便利な管理レイヤーを追加できます。

Istio とそのデータプレーンプロキシーである Envoy の両方が gRPC をサポートします。Istio を用いてどのように gRPC トラフィックを管理するか見てみましょう。

grpc

このように、clientserver の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 の間のトラフィックを見ることができます。

kiali

server の gRPC トラフィックメトリクスを Grafana でも見ることができます。

また、10秒遅延させる faultserver へ挿入するための 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 についてさらに学ぶために: