Momentan arbeite ich an einem kleinen Hobbyprojekt, das ich Open Source machen werde, sobald es fertig ist. Dieser Dienst wird in Google Container Engine ausgeführt. Ich habe mich für GCE entschieden, um Konfigurationsprobleme zu vermeiden, die Kosten sind erschwinglich und um neue Dinge zu lernen.
Meine Pods laufen LoadBalancer
einwandfrei und ich habe einen Dienst mit dem Typ " Expose" für die Ports 80 und 443 erstellt. Dies funktioniert einwandfrei.
Ich habe jedoch festgestellt, dass für jeden LoadBalancer
Dienst ein neuer Lastenausgleich für Google Compute Engine erstellt wird. Dieser Load Balancer ist ziemlich teuer und für ein Hobby-Projekt in einer einzigen Instanz wirklich übertrieben.
Um die Kosten zu senken, suche ich nach einer Möglichkeit, die Ports ohne Load Balancer freizulegen.
Was ich bisher ausprobiert habe:
Stellen Sie einen
NodePort
Dienst bereit . Leider ist es nicht erlaubt, einen Port unter 30000 freizulegen.Stellen Sie ein Ingress bereit, aber dadurch wird auch ein Lastenausgleich erstellt.
Versucht zu deaktivieren
HttpLoadBalancing
( https://cloud.google.com/container-engine/reference/rest/v1/projects.zones.clusters#HttpLoadBalancing ), erstellt aber dennoch einen Lastenausgleich.
Gibt es eine Möglichkeit, Port 80 und 443 für eine einzelne Instanz in Google Container Engine ohne Load Balancer bereitzustellen?
quelle
externalIp
Zusätzlich zu der großartigen und funktionierenden Lösung von ConnorJC: Dieselbe Lösung wird auch in dieser Frage beschrieben: Kubernetes - kann ich die Verwendung des GCE Load Balancer zur Kostensenkung vermeiden?
"InternalIp" bezieht sich auf die interne IP-Adresse der Recheninstanz (auch als Knoten bezeichnet) (in Google Cloud Platform -> Google Compute Engine -> VM-Instanzen).
Dieser Kommentar gibt einen Hinweis darauf, warum die interne und nicht die externe IP-Adresse konfiguriert werden sollte.
Nachdem ich den Dienst für die Ports 80 und 443 konfiguriert hatte, musste ich eine Firewall-Regel erstellen, die Datenverkehr zu meinem Instanzknoten zulässt:
Nach diesem Setup konnte ich über http (s): // externalIp auf meinen Dienst zugreifen
quelle
Wenn Sie nur genau einen Pod haben, können Sie
hostNetwork: true
dies folgendermaßen erreichen:Beachten Sie, dass Ihr Pod auf diese Weise den DNS-Resolver des Hosts und nicht den des Kubernetes erbt . Das bedeutet, dass Sie Clusterdienste nicht mehr nach DNS-Namen auflösen können. Im obigen Beispiel können Sie beispielsweise nicht über http: // static auf den
static
Dienst zugreifen . Sie können weiterhin über ihre Cluster-IP auf Dienste zugreifen, die von Umgebungsvariablen injiziert werden .Diese Lösung ist besser als die Verwendung von externalIP des Dienstes, da kube-proxy umgangen wird und Sie die richtige Quell-IP erhalten.
quelle
Um die Antworten von @ConnorJC @ derMikey in genau das zusammenzufassen, was für mich funktioniert hat:
Bei einem Clusterpool, der auf der Compute Engine-Instanz ausgeführt wird :
Ich habe den Service gemacht:
und dann die Firewall für alle (?) ips im Projekt geöffnet:
und war dann
my-app
erreichbar über die GCE-Instanz Public IP34.56.7.001
(nicht die Cluster-IP)quelle
Ich bevorzuge es, die Cloud-Load-Balancer erst dann zu verwenden, wenn dies aus Kosten- und Lieferantengründen erforderlich ist.
Stattdessen benutze ich Folgendes: https://kubernetes.github.io/ingress-nginx/deploy/
Es ist ein Pod, der einen Load Balancer für Sie ausführt. Diese Seite enthält GKE-spezifische Installationshinweise.
quelle