https://github.com/grpc/grpc/blob/master/doc/load-balancing.md の負荷分散ページを読みましたが、それでも正しいことについて混乱していますバックエンドGRPCインスタンス間のロードバランシングへのアプローチ。複数のgRPC「マイクロサービス」インスタンスをデプロイしており、他のgRPCクライアントがそれらの間でルーティングできるようにしたいと考えています。これらをkubernetes(実際にはGoogle Container Engine)のポッドとしてデプロイしています。
誰かがgRPCサーバー間でgRPCクライアントリクエストをロードバランシングする「推奨」アプローチを説明できますか?クライアントはエンドポイントを認識する必要があるようです-Container Engineに組み込まれているLoadBalancerを利用して支援することはできませんか?
Kubernetesについて話すことはできませんが、gRPCの負荷分散に関しては、基本的に2つのアプローチがあります。
grpc::ChannelArguments::SetLoadBalancingPolicyName
"round_robin"を引数として(将来的には " service configuration "で選択することも可能ですが、その構成をDNSレコードにエンコードする方法の設計では、まだ確定していません)。ご不明な点がありましたらお知らせください。
サマレンドラが述べたように
Envoy を確認できます。元はLyftで構築されたものです。
着信接続と発信接続の両方でHTTP/2とgRPCをファーストクラスでサポートしています。
私たちはgojekでgRPCサービスにenvoyを使用しており、非常に高い負荷の下でも十分に機能します。
Grpcサーバー間の負荷分散では、kubernatesのデフォルトの負荷分散はL4ロードバランサーであるため役に立ちません。 L7ロードバランサーが必要になります。
なぜL7なのか?
grpcはhttp2を使用します。接続は永続的で、リクエストは同じ接続を介して送信されます。 L4ロードバランサーはtcp接続を使用して負荷分散しますが、要求レベルでのロードバランスが必要なため、L7ロードバランサーが必要になります。特に通信がgrpcサーバー間である場合。
いくつかのオプションがあります。Linkered/Envoy
このため、これらはkubernatesで適切に動作し、優れたサービスメッシュも提供します。
サービスを外部の作業に公開するには、nghttpxおよびnghttpx Ingressコントローラーを使用できます。
クライアント側のロードバランシングを使用することもできますが、良いメリットはありません。
nghttpx および nghttpx Ingress controller プロジェクトをチェックアウトすることをお勧めします。これらのプロジェクトにより、HTTP/2ストリームのL7ロードバランシングを実行できます。
Google Cloud Platformにバンドルされているエンドポイント管理に関する情報については、 https://cloud.google.com/endpoints/docs/architecture-overview もご覧ください。
AWS/ECSの場合 https://aws.Amazon.com/blogs/aws/new-network-load-balancer-effortless-scaling-to-millions-of-requests-per-second/ =ターゲットグループ間のラウンドロビン接続に機能します。
NLBがHTTP1でのみ実行できるヘルスチェックをリッスンするために何かを行う必要があります。また、独自のSSLを終了することもできます。