So wählen Sie die externe IP-Adresse eines Kubernetes-Load-Balancers in Google Kubernetes Engine aus

16

Ich stelle eine Web-App mit Google Kubernetes Engine bereit und möchte sie über einen Load Balancer auf einer vorhandenen statischen IP-Adresse zugänglich machen, die ich im Rahmen desselben Projekts in Google Cloud Platform kontrolliere, da der Domainname verwendet werden soll zeigt schon auf diese IP.

Die Yaml-Datei, die ich für den Pod verwendet habe, ist:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: my-container
    image: gcr.io/my-project/my-app:latest

Ich kann einen Lastenausgleich einrichten, indem ich Folgendes verwende:

apiVersion: v1
kind: Service
metadata:
  name: my-load-balancer
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: LoadBalancer

Dies bietet eine externe IP-Adresse, auf die die App zugreifen kann, aber ich kann sie nicht so konfigurieren, dass sie die gewünschte IP-Adresse verwendet. In der Dokumentation zu den Diensten wird eine spec.clusterIP-Einstellung erwähnt, die sich jedoch nicht auf die externe IP zu beziehen scheint. Ebenso wird nach dem Einrichten des Lastenausgleichs das Feld status.loadBalancer.ingress.ip des Dienstes auf seine externe IP-Adresse festgelegt, dies scheint jedoch keine konfigurierbare Einstellung zu sein.

Als Alternative habe ich versucht, manuell eine Weiterleitungsregel in der Google Compute Engine-Konsole zu erstellen, um den Datenverkehr von meiner statischen IP-Adresse an den von Kubernetes eingerichteten Zielpool weiterzuleiten. Wenn ich jedoch versuche, eine Verbindung herzustellen, wird die Verbindung abgelehnt.

Gibt es eine Möglichkeit, das zu tun, was ich möchte - einen Kubernetes-Pod (oder Replikationscontroller) in der Google Kubernetes-Engine unter einer ausgewählten statischen IP-Adresse verfügbar zu machen?

Ben
quelle

Antworten:

9

TL; DR Google Container Engine mit Kubernetes 1.1 unterstützt loadBalancerIPnur das Markieren der automatisch zugewiesenen IP als statisch zuerst.

Kubernetes v1.1 unterstützt externalIPs :

apiVersion: v1
kind: Service
spec:
  type: LoadBalancer
  loadBalancerIP: 10.10.10.10
  ...

Bisher gibt es keine wirklich gute konsistente Dokumentation zur Verwendung in GCE. Sicher ist, dass diese IP zunächst eine Ihrer vorab zugewiesenen statischen IPs sein muss.

Die regionenübergreifende Dokumentation zum Lastenausgleich bezieht sich hauptsächlich auf Compute Engine und nicht auf Kubernetes / Container Engine. Sie ist jedoch weiterhin nützlich, insbesondere im Abschnitt "Konfigurieren des Lastenausgleichsdienstes".

Wenn Sie nur einen Kubernetes LoadBalancer auf GCE erstellen, wird eine Netzwerk-Compute-Engine> Netzwerk> Netzwerklastenausgleich> Weiterleitungsregel erstellt, die auf einen Zielpool verweist, der aus Ihren Computern in Ihrem Cluster besteht (normalerweise nur diejenigen, auf denen die Pods ausgeführt werden, die der Dienstauswahl entsprechen). . Es sieht so aus, als würde das Löschen eines Namespaces die erstellten Regeln nicht bereinigen.


Aktualisieren

Es wird jetzt tatsächlich unterstützt (obwohl unter dokumentiert):

  1. Stellen Sie sicher, dass Sie Kubernetes 1.1 oder höher ausführen (unter GKE bearbeiten Sie Ihren Cluster und überprüfen Sie "Node-Version")
  2. Unter Netzwerk> Externe IP-Adressen sollten Sie bereits einige kurzlebige IP-Adressen als auf die VM-Instanz Ihres Clusters verweisend markiert haben (falls nicht oder nicht sicher, stellen Sie sie einmal ohne bereit loadBalancerIP, warten Sie, bis Sie eine externe IP-Adresse zugewiesen haben, wenn Sie sie ausführen kubectl get svc, und suchen Sie diese IP-Adresse in der Liste auf dieser Seite). Markieren Sie einen von ihnen als statisch , lassen Sie uns sagen , dass es externe Adresse ist 10.10.10.10.
  3. Bearbeiten Sie Ihren LoadBalancerloadBalancerIP=10.10.10.10 wie oben beschrieben (passen Sie die IP- Adresse an, die Sie von Google erhalten haben).

Wenn Sie jetzt Ihren LoadBalancer oder sogar Ihren Namespace löschen, sollte diese IP-Adresse beim erneuten Bereitstellen auf diesem Cluster erhalten bleiben. Wenn Sie den Cluster ändern müssen, sollten einige manuelle Änderungen möglich sein:

  1. Unter Abschnitt „Target - Pools“ Tab „Network Load Balancing“ , klicken Sie auf „Create Zielpool“ Button:
    • Name: cluster-pool(oder irgendein anderer Name)
    • Region: Wählen Sie die Region eines Ihrer Cluster aus
    • Gesundheitscheck: Optional, wenn Sie möchten
    • Bestehende Instanzgruppen auswählen: Ihr Kubernetes-Cluster
  2. Unter Abschnitt „Netzwerklastenausgleich“, „Weiterleitungsregeln“ Registerkarte , klicken Sie auf „Erstellen Weiterleitungsregel“ Button:
    • Name: http-cross-region-gfr(oder irgendein anderer Name)
    • Region: Wählen Sie die Region eines Ihrer Cluster aus
    • Externe IP: Wählen loadbalancer-ip-crossregionSie die gerade reservierte aus
    • Zielpool: Wählen cluster-poolSie den gerade erstellten Pool aus
Wernight
quelle
Sind die noch relevant?
Ben
8

Gute Nachrichten. Dies wird in Kubernetes v1.1 behoben. Sie können das service.spec.loadBalancerIPFeld auf eine IP einstellen, von der Sie wissen, dass Sie sie besitzen.


Bisherige:

Dies ist ein Merkmal, das durch die Risse fiel. Es sollte funktionieren (und hat vielleicht sogar irgendwann funktioniert), war aber nicht gut getestet und wurde dabei kaputt gemacht und dann versehentlich (vorübergehend) entworfen.

Es ist auf meiner Shortlist für Dinge, die nach 1.0 behoben werden müssen.

https://github.com/GoogleCloudPlatform/kubernetes/issues/10323

Tim Hockin
quelle
Dies sollte wahrscheinlich ein Kommentar sein, keine Antwort.
Ward - Reinstate Monica
5
@Ward: "Es ist nicht möglich" vom Entwickler ist eine Antwort, IMHO, und es wurde als solche akzeptiert.
Sven