Ingress für externe Application Load Balancer konfigurieren

Auf dieser Seite erfahren Sie, wie Sie einen externen Application Load Balancer durch Erstellen eines Kubernetes Ingress-Objekts konfigurieren.

Machen Sie sich vor dem Lesen dieser Seite mit den GKE-Netzwerkkonzepten vertraut.

Hinweis

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diesen Task verwenden möchten, installieren und dann initialisieren Sie die gcloud CLI. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem gcloud components update Befehl ab. Ältere gcloud CLI-Versionen unterstützen möglicherweise nicht die Ausführung der Befehle in diesem Dokument.
  • Achten Sie darauf, dass Sie einen vorhandenen Autopilot- oder Standardcluster haben. Informationen zum Erstellen eines neuen Clusters finden Sie unter Autopilot-Cluster erstellen.

Add-on HttpLoadBalancing aktivieren

Für den Cluster muss das Add-on HttpLoadBalancing aktiviert sein. Dieses Add-on ist standardmäßig aktiviert. In Autopilot-Clustern können Sie dieses Add-on nicht deaktivieren.

Sie können das HttpLoadBalancing Add-on über die Google Cloud console oder die Google Cloud CLI aktivieren.

Console

  1. Öffnen Sie in der Google Cloud console die Seite Google Kubernetes Engine.

    Zur Seite "Google Kubernetes Engine"

  2. Klicken Sie auf den Namen des Clusters, den Sie ändern möchten.

  3. Klicken Sie unter Netzwerk im Feld HTTP-Load-Balancing auf HTTP-Load-Balancing bearbeiten.

  4. Klicken Sie das Kästchen HTTP-Load-Balancing aktivieren an.

  5. Klicken Sie auf Änderungen speichern.

gcloud

gcloud container clusters update CLUSTER_NAME --update-addons=HttpLoadBalancing=ENABLED

Ersetzen Sie CLUSTER_NAME durch den Namen Ihres Clusters.

Statische IP-Adresse erstellen

Ein externer Application Load Balancer stellt eine stabile IP-Adresse bereit, mit der Sie Anfragen an einen oder mehrere Services weiterleiten können. Wenn Sie eine permanente IP-Adresse benötigen, müssen Sie eine globale statische externe IP-Adresse reservieren, bevor Sie eine Ingress-Ressource erstellen.

Wenn Sie eine vorhandene Ingress-Ressource so ändern, dass eine statische IP-Adresse anstelle einer sitzungsspezifischen IP-Adresse verwendet wird, ändert GKE möglicherweise die IP-Adresse des Load-Balancers, wenn GKE die Weiterleitungsregel des Load-Balancers neu erstellt.

Externen Application Load Balancer erstellen

In dieser Übung konfigurieren Sie einen externen Application Load Balancer, um Anfragen je nach URL-Pfad an verschiedene Services weiterzuleiten.


Eine detaillierte Anleitung dazu finden Sie direkt in der Google Cloud Console. Klicken Sie dazu einfach auf Anleitung:

Anleitung


Deployments und Services erstellen

Erstellen Sie zwei Deployments mit Services namens hello-world-1 und hello-world-2:

  1. Speichern Sie das folgende Manifest als hello-world-deployment-1.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-world-deployment-1
    spec:
      selector:
        matchLabels:
          greeting: hello
          version: one
      replicas: 3
      template:
        metadata:
          labels:
            greeting: hello
            version: one
        spec:
          containers:
          - name: hello-app-1
            image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
            env:
            - name: "PORT"
              value: "50000"
    

    Dieses Manifest beschreibt ein Beispiel-Deployment mit drei Replikaten.

  2. Wenden Sie das Manifest auf den Cluster an:

    kubectl apply -f hello-world-deployment-1.yaml
    
  3. Speichern Sie das folgende Manifest als hello-world-service-1.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: hello-world-1
    spec:
      type: NodePort
      selector:
        greeting: hello
        version: one
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50000
    

    Dieses Manifest beschreibt einen Service mit folgenden Attributen:

    • Jeder Pod mit dem Label greeting: hello und dem Label version: one ist ein Mitglied des Services.
    • GKE leitet Anfragen, die an TCP-Port 60000 gesendet werden, an einen der Mitglieds-Pods an TCP-Port 50000 weiter.
    • Der Servicetyp ist NodePort, was erforderlich ist, sofern Sie nicht containernatives Load Balancing verwenden. Bei Verwendung von containernativem Load-Balancing gibt es keine Einschränkungen für den Servicetyp . Es wird jedoch empfohlen, einen Service vom Typ type ClusterIP zu verwenden, es sei denn, Sie benötigen explizit den von einem NodePort-Service bereitgestellten nodePort. LoadBalancer-Services werden nicht als Ingress-Back-Ends unterstützt.
  4. Wenden Sie das Manifest auf den Cluster an:

    kubectl apply -f hello-world-service-1.yaml
    
  5. Speichern Sie das folgende Manifest als hello-world-deployment-2.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-world-deployment-2
    spec:
      selector:
        matchLabels:
          greeting: hello
          version: two
      replicas: 3
      template:
        metadata:
          labels:
            greeting: hello
            version: two
        spec:
          containers:
          - name: hello-app-2
            image: "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
            env:
            - name: "PORT"
              value: "8080"
    

    Dieses Manifest beschreibt ein Beispiel-Deployment mit drei Replikaten.

  6. Wenden Sie das Manifest auf den Cluster an:

    kubectl apply -f hello-world-deployment-2.yaml
    
  7. Speichern Sie das folgende Manifest als hello-world-service-2.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: hello-world-2
    spec:
      type: NodePort
      selector:
        greeting: hello
        version: two
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
    

    Dieses Manifest beschreibt einen Service mit folgenden Attributen:

    • Jeder Pod mit dem Label greeting: hello und dem Label version: two ist ein Mitglied des Services.
    • GKE leitet Anfragen, die an TCP-Port 80 gesendet werden, an einen der Mitglieds-Pods an TCP-Port 8080 weiter.
  8. Wenden Sie das Manifest auf den Cluster an:

    kubectl apply -f hello-world-service-2.yaml
    

Ingress-Objekt erstellen

Erstellen Sie ein Ingress, das Regeln für das Routing von Anfragen abhängig vom URL-Pfad in der Anfrage angibt. Wenn Sie das Ingress-Objekt erstellen, erstellt und konfiguriert der GKE-Ingress-Controller einen externen Application Load Balancer.

  1. Speichern Sie das folgende Manifest als my-ingress.yaml:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
      annotations:
        # If the class annotation is not specified it defaults to "gce".
        kubernetes.io/ingress.class: "gce"
    spec:
      rules:
      - http:
          paths:
          - path: /*
            pathType: ImplementationSpecific
            backend:
              service:
                name: hello-world-1
                port:
                  number: 60000
          - path: /v2
            pathType: ImplementationSpecific
            backend:
              service:
                name: hello-world-2
                port:
                  number: 80
    

    Dieses Manifest beschreibt ein Ingress mit den folgenden Attributen:

    • Es gibt zwei GKE-Ingress-Klassen. Wenn Sie eine Ingress-Klasse angeben möchten, müssen Sie die Annotation kubernetes.io/ingress.class verwenden. Sie können einen GKE-Ingress nicht mit spec.ingressClassName angeben.

    • Die Klasse gce stellt einen externen Application Load Balancer bereit.

    • Die Klasse gce-internal stellt einen internen Application Load Balancer bereit.

    • Wenn Sie eine Ingress-Ressource ohne die Annotationen spec.ingressClassName und kubernetes.io/ingress.class bereitstellen, erstellt GKE einen externen Application Load Balancer. Dies ist das gleiche Verhalten, wenn Sie die Annotation kubernetes.io/ingress.class: gce angeben. Weitere Informationen finden Sie unter Verhalten des GKE-Ingress-Controllers.

    • GKE erstellt für jeden backend.service einen Google Cloud Backend-Service. Jeder dieser Backend-Dienste entspricht einem Kubernetes-Service und jeder Backend-Dienst muss auf eine Google Cloud Systemdiagnose verweisen. Diese Systemdiagnose unterscheidet sich von einer Kubernetes-Aktivitätsprüfung oder -Bereitschaftsprüfung, da die Systemdiagnose außerhalb des Clusters implementiert wird. Weitere Informationen finden Sie unter Systemdiagnosen.

    • Wenn ein Client eine Anfrage mit dem URL-Pfad / an den Load-Balancer sendet, leitet GKE die Anfrage an den Service hello-world-1 auf Port 60000 weiter. Wenn ein Client eine Anfrage mit dem URL-Pfad /v2 an den Load-Balancer sendet, leitet GKE die Anfrage an den Service hello-world-2 auf Port 80 weiter. Weitere Informationen zu den path und pathType Attributen finden Sie unter URL-Pfade.

    • Wenn Sie eine globale statische externe IP-Adresse reservieren möchten, fügen Sie dem Ingress Objekt eine kubernetes.io/ingress.global-static-ip-name Annotation hinzu, wie hier gezeigt:

     apiVersion: networking.k8s.io/v1
     kind: Ingress
     metadata:
       name: my-ingress
       annotations:
         kubernetes.io/ingress.global-static-ip-name: my-static-address
     ```
    
  2. Wenden Sie das Manifest auf den Cluster an:

    kubectl apply -f my-ingress.yaml
    

Externen Application Load Balancer testen

Warten Sie etwa fünf Minuten, bis der Load Balancer konfiguriert wurde, und testen Sie dann den externen Application Load Balancer:

  1. Sehen Sie sich das Ingress-Objekt an:

    kubectl get ingress my-ingress --output yaml
    

    Die Ausgabe zeigt die IP-Adresse des externen Application Load Balancers:

    status:
      loadBalancer:
        ingress:
        - ip: 203.0.113.1
    
  2. Testen Sie den Pfad /:

    curl LOAD_BALANCER_IP_ADDRESS/
    

    Ersetzen Sie LOAD_BALANCER_IP_ADDRESS durch die externe IP-Adresse des Load-Balancers.

    Die Ausgabe sieht in etwa so aus:

    Hello, world!
    Version: 1.0.0
    Hostname: ...
    

    Wenn die Ausgabe einen 404-Fehler enthält, warten Sie einige Minuten.

  3. Testen Sie den Pfad /v2:

    curl load-balancer-ip/v2
    

    Die Ausgabe sieht in etwa so aus:

    Hello, world!
    Version: 2.0.0
    Hostname: ...
    

Funktionsweise von Ingress für externes Load-Balancing

In diesem Abschnitt werden die Komponenten und Konfigurationen beschrieben, die externes Load-Balancing für Ihre GKE-Anwendungen ermöglichen, einschließlich URL-Pfadabgleich, Netzwerk-Endpunktgruppen und freigegebene VPC-Integration.

URL-Pfade

Das einzige unterstützte Platzhalterzeichen für das Feld path eines Ingress ist das Zeichen *. Das Zeichen * muss auf einen Schrägstrich (/) folgen und das letzte Zeichen des Musters sein. Beispielsweise sind /*, /foo/* und /foo/bar/* gültige Muster, *, /foo/bar* und /foo/*/bar jedoch nicht.

Ein spezifischeres Muster hat Vorrang vor einem weniger spezifischen Muster. Wenn sowohl /foo/* als auch /foo/bar/* vorhanden sind, wird /foo/bar/bat für den Abgleich mit /foo/bar/* herangezogen. Weitere Informationen zu Pfadeinschränkungen und zum Musterabgleich finden Sie in der Dokumentation zu URL-Zuordnungen.

Bei GKE-Clustern, auf denen eine frühere Version als 1.21.3-gke.1600 ausgeführt wird, ist ImplementationSpecific der einzige unterstützte Wert für das Feld pathType. Bei Clustern mit Version 1.21.3-gke.1600 oder höher werden auch die Werte Prefix und Exact für pathType unterstützt.

Netzwerk-Endpunktgruppen

Wenn Ihr Cluster containernatives Load-Balancingunterstützt, empfehlen wir die Verwendung von Netzwerk-Endpunktgruppen (NEGs). Wenn Sie das Ingress-Objekt erstellen, erstellt GKE einen Application Load Balancer im Projekt. Außerdem werden in jeder Zone, in der der Cluster ausgeführt wird, NEGs erstellt. Die Endpunkte in der NEG und die Endpunkte des Dienstes werden synchronisiert. Für GKE Cluster ab Version 1.17 ist containernatives Load-Balancing standardmäßig aktiviert und unter bestimmten Bedingungen ist keine explizite Dienst Annotation cloud.google.com/neg: '{"ingress": true}' erforderlich. Für Cluster, bei denen NEGs nicht die Standardeinstellung ist, wird trotzdem dringend empfohlen, containernatives Load-Balancing zu verwenden, das explizit pro Service aktiviert werden muss. Die Annotation sollte so auf Services angewendet werden:

kind: Service
...
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
...

Wenn Sie diese Annotation hinzufügen, wird für den vorhandenen Service ein neuer Backend-Service erstellt. Dies kann zu einem vorübergehenden Ausfall des Service führen.

Freigegebene VPC

Wenn sich der GKE-Cluster, in dem Sie die Ingress-Ressourcen bereitstellen, in einem Dienstprojekt befindet, und Sie möchten, dass die GKE-Steuerungsebene die Firewallressourcen in Ihrem Hostprojekt verwaltet, muss das GKE-Dienstkonto des Dienstprojekts die entsprechenden IAM-Berechtigungen im Hostprojekt erhalten, gemäß Firewallressourcen für Cluster mit gemeinsam genutzter VPC verwalten. Dadurch kann der Ingress-Controller Firewallregeln erstellen, um sowohl eingehenden Traffic als auch Traffic für Google Cloud Systemdiagnosen zuzulassen.

Das folgende Beispiel zeigt ein Ereignis, das in den Ingress-Ressourcenlogs vorhanden sein kann. Dieser Fehler tritt auf, wenn der Ingress-Controller keine Firewallregel erstellen kann, die eingehenden Traffic für Google Cloud Systemdiagnosen zulässt, wenn die Berechtigungen nicht richtig konfiguriert sind.

Firewall change required by security admin: `gcloud compute firewall-rules update <RULE_NAME> --description "GCE L7 firewall rule" --allow tcp:<PORT> --source-ranges 130.211.0.0/22,35.191.0.0/16 --target-tags <TARGET_TAG> --project <HOST_PROJECT>

Wenn Sie die Firewallregeln manuell aus dem Hostprojekt bereitstellen möchten, können Sie die firewallXPNError Ereignisse stummschalten. Dazu fügen Sie der Ingress-Ressource die networking.gke.io/suppress-firewall-xpn-error: "true" Annotation hinzu.

Zusammenfassung der externen Ingress-Annotationen

Mit den folgenden Annotationen können Sie das Verhalten Ihrer externen Ingress-Ressourcen und der zugehörigen Kubernetes-Serviceobjekte konfigurieren.

Ingress-Annotationen

Annotation Beschreibung
kubernetes.io/ingress.allow-http Gibt an, ob HTTP-Traffic zwischen dem Client und dem HTTP(S)-Load-Balancer zugelassen wird. Mögliche Werte sind "true" und "false". Der Standardwert ist "true". Weitere Informationen finden Sie unter HTTP deaktivieren.
ingress.gcp.kubernetes.io/pre-shared-cert Mit dieser Annotation können Sie Zertifikatressourcen an GKE-Ingress-Ressourcen anhängen. Weitere Informationen finden Sie unter Mehrere SSL-Zertifikate mit externen Application Load Balancern verwenden.
kubernetes.io/ingress.global-static-ip-name Mit dieser Annotation können Sie festlegen, dass der Load-Balancer eine statische externe IP-Adresse verwenden soll, die Sie zuvor erstellt haben. Weitere Informationen finden Sie unter Statische IP-Adressen für HTTP(S)-Load-Balancer.
networking.gke.io/v1beta1.FrontendConfig Mit dieser Annotation können Sie die clientseitige Konfiguration des Load-Balancers anpassen. Weitere Informationen finden Sie unter Ingress-Konfiguration.
networking.gke.io/suppress-firewall-xpn-error Wenn Kubernetes bei Ingress-Load-Balancern die Firewallregeln aufgrund unzureichender Berechtigungen nicht ändern kann, wird alle paar Minuten ein firewallXPNError-Ereignis erstellt. Ab GLBC 1.4 können Sie das Ereignis firewallXPNError stummschalten. Dazu müssen Sie der Ressource für eingehenden Traffic die Annotation networking.gke.io/suppress-firewall-xpn-error: "true" hinzufügen. Sie können diese Annotation jederzeit entfernen, um die Stummschaltung aufzuheben. Mögliche Werte sind true und false. Der Standardwert ist false.
Annotation Beschreibung
cloud.google.com/app-protocols Mit dieser Annotation können Sie das Protokoll für die Kommunikation zwischen dem Load-Balancer und der Anwendung festlegen. Die Protokolle HTTP, HTTPS und HTTP2 stehen zur Auswahl.
cloud.google.com/backend-config Mit dieser Annotation können Sie einen Backend-Dienst konfigurieren, der einem Service zugeordnet ist. Weitere Informationen finden Sie unter Ingress-Konfiguration.
cloud.google.com/neg Mit dieser Annotation legen Sie fest, dass der Load-Balancer Netzwerk-Endpunktgruppen verwenden soll. Weitere Informationen finden Sie unter Containernatives Load-Balancing verwenden.

Nächste Schritte