5

Trochę tła: mam usługę Go, która używa gRPC do komunikacji z aplikacjami klienckimi. gRPC używa protokołu HTTP2, więc nie mogę używać Google App Engine ani modułu równoważenia obciążenia HTTP Google Cloud. Potrzebuję surowego równoważenia obciążenia TCP z Internetu do mojej aplikacji Go.Jak ustawić statyczny adres IP dla usługi Google Container Engine (GKE)?

Przeszedłem przez samouczki GKE i przeczytałem różne dokumenty i nie mogę znaleźć żadnego sposobu na nadanie aplikacji statycznego adresu IP. Jak uzyskać statyczny adres IP dla czegoś działającego w GKE?

Odpowiedz

3

W końcu to rozgryzłem. Aby to zrobić, poprosimy GKE, aby skonfigurował dla ciebie zewnętrzny moduł równoważenia obciążenia, a następnie wybiórczo zastępuje części stosu. Dobrą wiadomością jest to, że po drodze możesz także skonfigurować sprawdzanie kondycji HTTP, które GKE nie robi domyślnie.

Upewnij się, że masz statyczne IP dostępne z Google Cloud Platform. Możesz zamówić w Konsoli.

Pobierz na życzenie i działa z czymś takim:

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

(używam portu 8080 dla HTTP kontroli zdrowotnej oraz 8081 do obsługi żądań gRPC).

--create-external-load-balancer=true aktualizuje usługi Kubomenetes za pomocą reguły ingresu, ustawia pulę docelową, ustawia moduł równoważenia obciążenia sieciowego i dodaje regułę zapory. Będziemy musieli naprawić # 1 i # 3.

Dowiedz się, gdzie wszystko już działa.

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) 

zamocować lekarskie do puli docelowej

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 

Utwórz nową regułę przekierowania, aby zastąpić jeden wygenerowany przez GKE

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

Usuń oryginalny regułę przekazywania GKE

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

Zaktualizuj usługę Kubernetes, aby umożliwić wjazd z nowego adresu IP:

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

To powinno wystarczyć!

Uważaj przy kopiowaniu, moje głowy i ogony działają dla mnie, ponieważ mam tylko jedną uruchomioną aplikację, ale możesz zobaczyć rzeczy w innej kolejności.

+0

Zach - Cieszę się, że udało ci się to rozgryźć. Gdy tworzysz usługę w GKE, powinieneś być w stanie zażądać jej przypisania do określonego adresu IP. Więc jeśli utworzysz statyczny adres IP, powinieneś mieć możliwość przypisania go do twojej usługi. –

+0

Dzięki za odpowiedź @RobertBailey! Widzę to jako flagę wiersza poleceń do eksponowania kubctl. Gdzie mogę umieścić public-ip w moim * _controller.json, jeśli używam 'kubectl create'? Myślę, że nadal muszę sięgnąć, aby dołączyć kontrolę stanu http, więc zbadanie, w jaki sposób został skonfigurowany, okazało się bardzo pouczające. –

+0

Myślę, że przestarzałePublicIPs to pole, które chcesz (https://github.com/kubernetes/kubernetes/blob/master/pkg/api/v1/types.go#L1534-L1539), ale może to być nowe pole externalIPs powyżej to. I to dzieje się w pliku * _service.json, a nie w konfiguracji kontrolera replikacji. –

4

To nie jest obsługiwane w pakiecie kubernetes v1.0.x, ale w wersji 1.1.x będzie dostępne jako service.spec.loadBalancerIP. Tak długo, jak faktycznie będziesz właścicielem tego IP, użyjemy go.

+0

Próbuję użyć "loadBalancerIP" w mojej usłudze GKE (v1.1.1). Utworzono statyczny adres IP w konsoli chmury i dodano go do definicji usługi. Mimo to usługa otrzymuje inny adres IP, a statyczny adres IP pozostaje nieprzypisany - czy robię coś nie tak? –

+1

opublikuj swój YAML lub JSON, proszę? Uruchom także 'kubectl get service -o yaml', abyśmy mogli zobaczyć, co serwer myśli. –

+0

Dziki domysł: podejrzewam, że masz starszą komendę Kubectl (myślę, że wersja dołączona do gcloud czeka na nowe naciśnięcie gcloud) –

Powiązane problemy