5

Ein wenig Hintergrund: Ich habe einen Go-Dienst, der gRPC verwendet, um mit Client-Apps zu kommunizieren. gRPC verwendet HTTP2, sodass ich Google App Engine oder den Google Cloud HTTP Load Balancer nicht verwenden kann. Ich brauche einen TCP-Lastausgleich vom Internet zu meiner Go-Anwendung.Wie legen Sie eine statische IP-Adresse für einen Google Container Engine-Dienst (GKE) fest?

Ich ging durch die GKE-Tutorials und lese die verschiedenen Dokumente und ich finde keine Möglichkeit, meiner Anwendung eine statische IP-Adresse zu geben. Wie erhält man also eine statische IP-Adresse an etwas, das in GKE läuft?

Antwort

3

Ich habe schließlich herausgefunden. Um dies zu tun, bitten Sie GKE, einen externen Load Balancer für Sie einzurichten. Dann ersetzen Sie Teile des Stapels selektiv. Die gute Nachricht ist, dass Sie auf dem Weg auch HTTP-Health-Check einrichten können, was GKE standardmäßig nicht tut.

Stellen Sie sicher, dass Sie über die Google Cloud Platform eine statische IP-Adresse zur Verfügung haben. Sie können in der Konsole anfordern.

Holen Sie da und läuft mit so etwas wie:

kubectl expose rc api-server --name=api-server --port=8080,8081 --create-external-load-balancer=true 

(Ich verwende den Port 8080 für HTTP Gesundheitsprüfung und 8081 zu gRPC Anfragen zu dienen).

--create-external-load-balancer=true aktualisiert die Kubernetes-Dienste mit einer Ingress-Regel, richtet einen Zielpool ein, richtet einen Netzwerklastenausgleich ein und fügt eine Firewallregel hinzu. Wir müssen # 1 und # 3 beheben.

Finde heraus, wo alles schon läuft.

export TARGET_POOL_NAME=$(gcloud compute target-pools list | head -n 2 | tail -n 1 | cut -d " " -f 1) 

export EXTERNAL_IP=$(gcloud compute addresses list | head -n 2 | tail -n 1 | cut -d " " -f 3) 

Bringen Sie die Gesundheits-Check auf den Zielpool

gcloud compute http-health-checks create api-server-http-basic-check --port 8080 --request-path "/_health" 

gcloud compute target-pools add-health-checks ${TARGET_POOL_NAME} --http-health-check api-server-http-basic-check 

eine neue Weiterleitungsregel Erstellen Sie die eine, die von GKE

gcloud compute forwarding-rules create api-server \ 
--region us-central1 --port-range 8080-8081 \ 
--address ${EXTERNAL_IP} --target-pool ${TARGET_POOL_NAME} 

Löschen Sie die ursprüngliche GKE-Weiterleitungsregel

zu ersetzen
gcloud compute forwarding-rules delete $(gcloud compute forwarding-rules list | head -n 2 | tail -n 1 | cut -d " " -f 1) 

Aktualisieren Sie den Kubernetes Dienst Eindringen von dem neuen IP zu ermöglichen:

kubectl patch services api-server -p "{\"status\":{\"loadBalancer\":{\"ingress\": [{\"ip\": \"${EXTERNAL_IP}\"} ]}}}" 

Das sollte es tun!

für mich, meine Köpfe und Schwänze Arbeit Seien Sie vorsichtig mit Kopie einfügen, weil ich nur eine App läuft, aber Sie könnten Dinge in einer anderen Reihenfolge sehen.

+0

Zach - Ich bin froh, dass du das herausgefunden hast. Wenn Sie einen Dienst in GKE erstellen, sollten Sie in der Lage sein, die Zuweisung einer bestimmten IP-Adresse anzufordern. Wenn Sie also eine statische IP-Adresse erstellen, sollten Sie diese Ihrem Dienst zuweisen können. –

+0

Danke für die Antwort @RobertBailey! Ich sehe das als Command Line Flag zu kubctl expose. Wo stelle ich die public-ip in meine * _controller.json, wenn ich 'kubectl create' verwende? Ich denke, ich muss noch erreichen, um den http-Health-Check anzuhängen, also zu erkunden, wie es eingerichtet wurde, war wirklich informativ. –

+0

Ich denke, dass deprecatedPublicIPs das Feld ist, das Sie wollen (https://github.com/kubernetes/kubernetes/blob/master/pkg/api/v1/types.go#L1534-L1539), aber es könnte das neue Feld externalIPs oben sein es. Und das geht in Ihrer * _service.json Datei, nicht die Replikations-Controller-Konfiguration. –

4

Dies wird nicht in kubernetes v1.0.x unterstützt, aber in v1.1.x wird es als service.spec.loadBalancerIP verfügbar sein. Solange Sie diese IP besitzen, werden wir sie benutzen.

+0

Ich versuche, 'loadBalancerIP' auf meinem GKE (v1.1.1) Dienst zu verwenden. Erstellt eine statische IP-Adresse in der Cloud-Konsole und fügte sie der Service-Definition hinzu. Trotzdem erhält der Dienst eine andere IP-Adresse und die statische IP-Adresse bleibt nicht zugewiesen - mache ich etwas falsch? –

+1

poste bitte deine YAML oder JSON, bitte? Führen Sie auch 'kubectl get service -o yaml' aus, damit wir sehen können, was der Server denkt. –

+0

Wild rate: Ich vermute, dass Sie eine ältere kubectl-Befehlszeile haben (ich glaube, die gcloud-Paketversion wartet auf einen neuen gcloud-Push) –

Verwandte Themen