Stellen Sie die Ports 80 und 443 in Google Container Engine ohne Load Balancer bereit

23

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 LoadBalancereinwandfrei 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 LoadBalancerDienst 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:

Gibt es eine Möglichkeit, Port 80 und 443 für eine einzelne Instanz in Google Container Engine ohne Load Balancer bereitzustellen?

Ruben Ernst
quelle

Antworten:

10

Ja, durch externalIPs auf dem Dienst. Beispielservice, den ich verwendet habe:

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

Bitte beachten Sie, dass die in der Konfigurationsdatei aufgelisteten IP-Adressen die interne IP-Adresse von GCE sein müssen.

ConnorJC
quelle
Vielen Dank! Aber ich glaube, ich habe etwas verpasst. Der Dienst wird bereitgestellt, kann jedoch nicht über das Internet verwendet werden. Ich habe die richtigen Firewall-Regeln festgelegt. Der Dienst zeigt die richtigeexternalIp
Ruben Ernst
Entschuldigung für die verspätete Antwort, ich habe vergessen, dass ich mich mit genau demselben Thema befasst habe. Die aufgeführten IPs müssen die interne IP sein, nicht die externe (zumindest bei GCE).
ConnorJC
Danke, das war die Lösung! Leider darf ich noch nicht upvoten ... Ich habe diesen Kommentar gelöscht, um Ihnen mitzuteilen, dass diese Antwort in Kombination mit dem obigen Kommentar (der der Schlüssel war) mein Problem gelöst hat!
Ruben Ernst
1
Würde es Ihnen (oder RubenErnst) etwas ausmachen, die Antwort etwas zu erweitern? Insbesondere "müssen die auf GCE aufgelisteten IPs die interne IP sein." Welche IP meinst du? Funktioniert dies mit einer statischen IP, die Ihrem Einzelknotencluster zugewiesen ist?
Brett
@Brett: Entschuldigung für meine späte Antwort. Wurde Ihre Frage in der Zwischenzeit bereits beantwortet?
Ruben Ernst
4

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:

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

Nach diesem Setup konnte ich über http (s): // externalIp auf meinen Dienst zugreifen

derMikey
quelle
Die Verwendung der knoteninternen IP hat den Trick getan. 👍 Eine solche Verwechslung mit der Benennung!
James
1

Wenn Sie nur genau einen Pod haben, können Sie hostNetwork: truedies folgendermaßen erreichen:

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

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 staticDienst 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.

willwill
quelle
1

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 :

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

Ich habe den Service gemacht:

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

und dann die Firewall für alle (?) ips im Projekt geöffnet:

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

und war dann my-apperreichbar über die GCE-Instanz Public IP34.56.7.001 (nicht die Cluster-IP)

mikimisieren
quelle
0

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.

Michael Cole
quelle