Ujawnij porty 80 i 443 w Google Container Engine bez modułu równoważenia obciążenia

23

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, LoadBalanceraby wyświetlić usługę na portach 80 i 443. Działa to doskonale.

Odkryłem jednak, że dla każdej LoadBalancerusł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:

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?

Ruben Ernst
źródło

Odpowiedzi:

10

Tak, przez zewnętrzne adresy IP usługi. Przykładowa usługa, z której korzystałem:

apiVersion: v1
kind: Service
metadata:
  name: bind
  labels:
    app: bind
    version: 3.0.0
spec:
  ports:
    - port: 53
      protocol: UDP
  selector:
    app: bind
    version: 3.0.0
  externalIPs:
    - a.b.c.d
    - a.b.c.e

Należy pamiętać, że adresy IP wymienione w pliku konfiguracyjnym muszą być wewnętrznymi adresami IP w GCE.

ConnorJC
źródło
Dzięki! Ale myślę, że coś przeoczyłem. Usługa jest wdrożona, ale nie można jej uzyskać z Internetu. Ustawiam prawidłowe reguły zapory. Usługa wyświetla poprawnieexternalIp
Ruben Ernst
Przepraszam za spóźnioną odpowiedź, zapomniałem, że spędziłem czas na tym samym problemie. Wymienione adresy IP muszą być wewnętrznymi adresami IP, a nie zewnętrznymi (przynajmniej w GCE).
ConnorJC,
Dzięki, to było rozwiązanie! Niestety nie mogę jeszcze głosować ... Upuściłem ten komentarz, aby poinformować Cię, że ta odpowiedź w połączeniu z powyższym komentarzem (który był kluczem) rozwiązał mój problem!
Ruben Ernst,
1
Czy (lub @RubenErnst) chciałbyś nieco rozwinąć odpowiedź? W szczególności „adresy IP wymienione w GCE muszą być adresami IP nadnerczy”. Które IP masz na myśli? Czy możesz uzyskać to dzięki statycznemu adresowi IP przypisanemu do klastra z jednym węzłem?
Brett,
@Brett: Przepraszam za spóźnioną odpowiedź. Czy w międzyczasie udzielono już odpowiedzi na twoje pytanie?
Ruben Ernst,
4

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:

gcloud compute firewall-rules create your-name-for-this-fw-rule --allow tcp:80,tcp:443 --source-ranges=0.0.0.0/0

Po tej konfiguracji mogę uzyskać dostęp do mojej usługi za pośrednictwem http (s): // externalIp

derMikey
źródło
Wykorzystanie wewnętrznego adresu IP węzła załatwiło sprawę. 👍 Takie zamieszanie w nazewnictwie!
James
1

Jeśli masz tylko jedną kapsułę, możesz użyć tego hostNetwork: truedo osiągnięcia:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: caddy
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: caddy
    spec:
      hostNetwork: true # <---------
      containers:
      - name: caddy
        image: your_image
        env:
        - name: STATIC_BACKEND # example env in my custom image
          value: $(STATIC_SERVICE_HOST):80

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 staticusł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.

wola
źródło
1

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 :

gce vm name: gke-my-app-cluster-pool-blah`
internal ip: 10.123.0.1
external ip: 34.56.7.001 # will be publically exposed

Wykonałem usługę:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-app
  name: my-app-service
spec:
  clusterIP: 10.22.222.222
  externalIPs:
  - 10.123.0.1 # the instance internal ip
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: my-app
  type: ClusterIP

a następnie otworzył zaporę dla wszystkich (?) IPS w projekcie:

gcloud compute firewall-rules create open-my-app --allow tcp:80,tcp:443 --source-ranges=0.0.0.0/0

a następnie my-appbył dostępny za pośrednictwem publicznego adresu IP wystąpienia GCE34.56.7.001 (nie adresu IP klastra)

micimize
źródło
0

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.

Michael Cole
źródło