Obecnie pracuję nad małym projektem hobbystycznym, który zrobię, gdy będzie gotowy. Ta usługa działa w Google Container Engine. Wybrałem GCE, aby uniknąć kłopotów z konfiguracją, koszty są przystępne i nauczyć się nowych rzeczy.
Moje zasobniki działają poprawnie i utworzyłem usługę typu, LoadBalancer
aby wyświetlić usługę na portach 80 i 443. Działa to doskonale.
Odkryłem jednak, że dla każdej LoadBalancer
usługi tworzony jest nowy moduł równoważenia obciążenia Google Compute Engine. Ten moduł równoważenia obciążenia jest dość drogi i naprawdę przesadzony w przypadku projektu hobby na jednym wystąpieniu.
Aby obniżyć koszty, szukam sposobu na ujawnienie portów bez modułu równoważenia obciążenia.
Co próbowałem do tej pory:
Wdróż
NodePort
usługę. Niestety niedozwolone jest ujawnianie portu poniżej 30000.Wdróż Ingress, ale spowoduje to także moduł równoważenia obciążenia.
Próbowałem wyłączyć
HttpLoadBalancing
( https://cloud.google.com/container-engine/reference/rest/v1/projects.zones.clusters#HttpLoadBalancing ), ale nadal tworzy moduł równoważenia obciążenia.
Czy istnieje sposób na ujawnienie portów 80 i 443 dla pojedynczego wystąpienia w Google Container Engine bez modułu równoważenia obciążenia?
źródło
externalIp
Oprócz świetnego i działającego rozwiązania ConnorJC: to samo rozwiązanie opisano również w tym pytaniu: Kubernetes - czy mogę uniknąć używania modułu równoważenia obciążenia GCE w celu zmniejszenia kosztów?
„InternalIp” odnosi się do wewnętrznego adresu IP instancji obliczeniowej (zwanej także węzłem) (jak widać na Google Cloud Platform -> Google Compute Engine -> Instancje VM)
Ten komentarz daje wskazówkę, dlaczego należy skonfigurować wewnętrzny, a nie zewnętrzny adres IP.
Ponadto po skonfigurowaniu usługi dla portów 80 i 443 musiałem utworzyć regułę zapory zezwalającą na ruch do mojego węzła instancji:
Po tej konfiguracji mogę uzyskać dostęp do mojej usługi za pośrednictwem http (s): // externalIp
źródło
Jeśli masz tylko jedną kapsułę, możesz użyć tego
hostNetwork: true
do osiągnięcia:Zauważ, że w ten sposób Twoja kapsuła odziedziczy resolver DNS hosta, a nie Kubernetes. Oznacza to, że nie można już rozwiązywać usług klastrowych według nazwy DNS. Na przykład w powyższym przykładzie nie można uzyskać dostępu do
static
usługi pod adresem http: // static . Nadal możesz uzyskać dostęp do usług według ich adresu IP klastra, które są wstrzykiwane przez zmienne środowiskowe .To rozwiązanie jest lepsze niż korzystanie z zewnętrznego adresu IP usługi, ponieważ pomija kube-proxy, a otrzymasz poprawny źródłowy adres IP.
źródło
Aby zsyntetyzować odpowiedzi @ConnorJC @ derMikey na dokładnie to, co dla mnie zadziałało:
Biorąc pod uwagę pulę klastrów uruchomioną w wystąpieniu silnika obliczeniowego :
Wykonałem usługę:
a następnie otworzył zaporę dla wszystkich (?) IPS w projekcie:
a następnie
my-app
był dostępny za pośrednictwem publicznego adresu IP wystąpienia GCE34.56.7.001
(nie adresu IP klastra)źródło
Wolę nie używać funkcji równoważenia obciążenia w chmurze, dopóki nie będzie to konieczne ze względu na koszty i blokadę dostawcy.
Zamiast tego używam tego: https://kubernetes.github.io/ingress-nginx/deploy/
To kapsuła, która obsługuje dla ciebie moduł równoważenia obciążenia. Ta strona zawiera uwagi dotyczące instalacji specyficzne dla GKE.
źródło