2016-04-22 1 views
0

Ich bin versucht, bestehende Anwendungen zu überführen, dass die Arbeit Kubernetes wie folgt:Kann ich von außerhalb Kubernetes direkt zu Pods telefonieren?

  • Eine Außendienst unsere Anwendung durch einen Load-Balancer mit einer neuen Sitzung aufruft.
  • Unsere Anwendung gibt die IP des Servers zurück, der die Anforderung verarbeitet hat.
  • Alle nachfolgenden Anrufe von außen Service für diese Sitzung werden direkt auf den gleichen Server (unter Umgehung des Load-Balancer)

Gibt es eine Möglichkeit, dies zu tun in Kubernetes gemacht? Ich verstehe, dass Pod IPs nicht extern ausgesetzt sind, gibt es eine Möglichkeit, sie direkt auszusetzen?

Ich glaube auch nicht, dass ich sessionAffinity = "ClientIP" verwenden kann, da die Anfragen alle vom selben Ort kommen. Gibt es eine Möglichkeit, benutzerdefinierten sessionAffinity-Typ zu schreiben?

Antwort

1

Es hängt davon ab, wie Ihr Netzwerk eingerichtet ist und was Sie mit einem "externen Service" meinen, aber die Antwort ist höchstwahrscheinlich "nein".

Wenn Sie eines der Standardskripterstellungsskripts in einer Cloud-Umgebung verwenden, können Pod-IP-Adressen nicht aus dem Internet routingfähig sein. Daher ist kein Dienst im selben privaten Netzwerk wie Ihr Cluster möglich rede direkt mit den Pods.

Je nachdem, auf welchem ​​Cloud-Anbieter Sie sich befinden, werden Sie wahrscheinlich trotzdem das gewünschte Verhalten erhalten, indem Sie alle Anrufe an die externe IP-Adresse service of type LoadBalancer weiterleiten. Zum Beispiel auf der Google Cloud Platform, die cloud load balancer that gets created for such services by default maintains connection affinity by 5-tuple (src IP und Port, dst IP und Port, L4-Protokoll), die klingt wie es ist, was Sie wollen, da Sie pro Sitzung und nicht pro IP balancieren möchten.

Wie zum Erstellen eines neuen SessionAffinity-Typs, ist es nicht einfach, zu erweitern, da es erfordert, den Kubernetes-Quellcode zu ändern. Wenn dies wirklich ein Pfad ist, den Sie verwenden möchten, ist es wahrscheinlich, dass Sie Ihren eigenen Lastenausgleich in Ihrem Cluster ausführen möchten, anstatt sich auf den integrierten Lastenausgleich zu verlassen.

+0

Wir führen derzeit unsere Apps auf unseren eigenen Servern. Die Sitzungs-ID wird auch ein Teil der Nachrichtendaten sein, die wir senden. Es scheint, als wäre die einzige Lösung, unseren eigenen Load Balancer als Pod/Service vor unseren Apps in Kubernetes zu betreiben. Irgendeine Idee, wo ich anfangen sollte, nach so etwas zu suchen? –

+0

Vergessen zu erwähnen, aber alle 5 dieser Dinge reichen für die Session-Affinität aus. Die Quell- und Ziel-IPs werden immer gleich sein. Es muss auf einer Session-ID basieren, die wir erstellen. –

+0

Es gibt eine Handvoll Beispiele da draußen, aber ich bin mir nicht sicher, ob eine Karte direkt zu Ihrem Anwendungsfall passt. Ziehen Sie einen Blick auf http://paulbakker.io/kubernetes/load-balancing-kubernetes/ oder https://www.nginx.com/blog/load-balancing-kubernetes-services-ginx-plus/ –