Ich habe die Seite zum Lastausgleich unter https://github.com/grpc/grpc/blob/master/doc/load-balancing.md zum Start gelesen, bin aber immer noch verwirrt, was den richtigen Ansatz für das Load-Balancing angeht zwischen den Back-End-GRPC-Instanzen. Wir implementieren mehrere gRPC-Instanzen "microservice" und möchten, dass unsere anderen gRPC-Clients zwischen ihnen geroutet werden können. Wir setzen diese als Pods in kubernetes (eigentlich Google Container Engine) ein.
Kann jemand den "empfohlenen" Ansatz zum Load-Balancing von gRPC-Clientanforderungen zwischen den gRPC-Servern erläutern? Es scheint, dass die Kunden über die Endpunkte informiert sein müssen. Ist es nicht möglich, den integrierten LoadBalancer in der Container-Engine zur Unterstützung zu nutzen?
Ich kann nicht über kubernetes sprechen, aber bezüglich gRPC-Lastausgleich gibt es im Wesentlichen zwei Ansätze:
grpc::ChannelArguments::SetLoadBalancingPolicyName
mit "round_robin" als Argument verwenden (in der Zukunft wäre es auch möglich, über " Dienstkonfiguration " auszuwählen, aber das Design dafür, wie diese Konfiguration in DNS-Einträgen zu kodieren, ist noch nicht abgeschlossen.Lassen Sie mich wissen, wenn Sie Fragen haben.
Wie von Samarendra erwähnt
Envoy , Ursprünglich in Lyft gebaut.
Es bietet erstklassige Unterstützung für HTTP/2 und gRPC für eingehende und ausgehende Verbindungen.
Wir haben envoy für unsere gRPC-Dienste bei gojek eingesetzt, was uns unter recht hoher Last gut tut.
Für den Lastausgleich zwischen Grpc-Server wird der Standard-Lastausgleich von kubernates nicht hilfreich sein, da es sich um einen L4-Lastausgleich handelt. Sie würden L7-Lastausgleich benötigen.
Warum L7?
grpc verwendet http2, wobei die Verbindungen dauerhaft sind und die Anforderung über dieselbe Verbindung gesendet wird. Der L4-Lastausgleich wird mit TCP-Verbindungen ausgelastet. Sie benötigen jedoch einen Lastausgleich auf Anforderungsebene, sodass ein L7-Lastausgleich erforderlich ist. vor allem, wenn die Kommunikation zwischen GRPC-Servern erfolgt.
es gibt ein paar Optionen, Sie könnten Linkered/Envoy
dafür verwenden, sie funktionieren gut mit kubernates und bieten auch ein gutes Service-Mesh.
um Ihre Dienste für die Außenarbeit verfügbar zu machen, können Sie den Ingh-Controller nghttpx und nghttpx verwenden.
sie können auch clientseitige Lastverteilung verwenden, aber ich sehe darin keinen guten Nutzen.
Vielleicht möchten Sie nghttpx und die nghttpx Ingress Controller - Projekte überprüfen. Diese Projekte ermöglichen den L7-Lastausgleich für HTTP/2-Streams.
Unter https://cloud.google.com/endpoints/docs/architecture-overview finden Sie weitere Informationen zum Endpoint Management, das in der Google Cloud Platform enthalten ist.
Wenn in AWS/ECS ein https://aws.Amazon.com/blogs/aws/new-network-load-balancer-effortless-scaling-to-millions-of-requests-per-second/ funktionieren wird Robin Verbindungen zwischen Ihren Zielgruppen abzurunden.
Sie müssen etwas tun, um die Gesundheitsprüfung anzuhören, die NLBs nur in HTTP1 ausführen können. Sie können auch Ihr eigenes SSL kündigen.