Externen Load-Balancer mit gemischten Protokollen erstellen

In diesem Dokument wird beschrieben, wie Sie eine Anwendung, die in einem Google Kubernetes Engine-Cluster (GKE) ausgeführt wird, mithilfe eines externen LoadBalancer-Dienstes mit gemischtem Protokoll für TCP- und UDP-Traffic im Internet verfügbar machen.

Weitere Informationen zu externen Passthrough-Network-Load-Balancern finden Sie unter Backend-Dienst-basierter externer Passthrough-Network-Load-Balancer.

Übersicht

Sie können Anwendungen, die sowohl TCP- als auch UDP-Protokolle verwenden, mit zwei separaten GKE-LoadBalancer-Diensten mit einer manuell koordinierten, freigegebenen IP-Adresse verfügbar machen. Dieser Ansatz ist jedoch ineffizient, da mehrere Dienste für eine einzelne Anwendung verwaltet werden müssen. Außerdem kann es zu Problemen wie Konfigurationsfehlern oder ausgeschöpften IP-Adresskontingenten kommen.

Mit LoadBalancer-Diensten mit gemischten Protokollen können Sie einen einzelnen Dienst verwenden, um den Traffic für TCP und UDP zu verwalten. Die Verwendung eines einzelnen Dienstes vereinfacht die Konfiguration, da Sie eine einzelne IPv4-Adresse und einen konsolidierten Satz von Weiterleitungsregeln für beide Protokolle verwenden können. Diese Funktion wird für externe Passthrough-Network Load Balancer unterstützt.

Hinweise

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, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem Befehl gcloud components update ab. In früheren gcloud CLI-Versionen werden die Befehle in diesem Dokument möglicherweise nicht unterstützt.
  • Prüfen Sie, ob Sie einen vorhandenen Autopilot- oder Standardcluster haben. Informationen zum Erstellen eines neuen Clusters finden Sie unter Autopilot-Cluster erstellen.

Voraussetzungen

Wenn Sie einen externen LoadBalancer-Dienst erstellen möchten, der gemischte Protokolle verwendet, muss Ihr Cluster die folgenden Anforderungen erfüllen:

  • Load-Balancing mit gemischten Protokollen ist nur für neu erstellte Cluster ab Version 1.34.1-gke.2190000 verfügbar.
  • Das Add-on HttpLoadBalancing muss in Ihrem Cluster aktiviert sein.
  • Wenn Sie den Load-Balancer für neue externe LoadBalancer-Dienste implementieren möchten, legen Sie das Feld spec.loadBalancerClass im Dienstmanifest auf networking.gke.io/l4-regional-external fest. Bei vorhandenen Diensten ist die Annotation cloud.google.com/l4-rbs: "enabled" bereits in Ihrem Manifest enthalten. Sie können sie unverändert lassen.

Beschränkungen

  • Load-Balancer mit gemischten Protokollen unterstützen nur IPv4-Adressen.
  • Sie können in einem Dienstmanifest mit den folgenden Finalizern keine gemischten Protokolle verwenden:

    • gke.networking.io/l4-ilb-v1
    • gke.networking.io/l4-netlb-v1

    Wenn Ihr Manifest diese Finalizer enthält, müssen Sie den Dienst löschen und gemäß den vorherigen Anforderungen neu erstellen.

Preise

Google Cloud berechnet Ihnen pro Weiterleitungsregel alle externen IP-Adressen und gesendeten Daten. In der folgenden Tabelle wird die Anzahl der Weiterleitungsregeln und externen IP-Adressen beschrieben, die für die angegebenen Konfigurationen verwendet werden. Weitere Informationen finden Sie unter VPC-Netzwerkpreise.

Typ Transportschicht Internetschicht Anzahl der Weiterleitungsregeln Anzahl der externen IP-Adressen
Extern Einzeln (entweder TCP oder UDP) IPv4 1 1
IPv6 1 1
IPv4 und IPv6(Dual-Stack) 2 2
Gemischt (sowohl TCP als auch UDP) IPv4 2 1

Arbeitslast bereitstellen

In diesem Abschnitt wird gezeigt, wie Sie eine Beispielarbeitslast bereitstellen, die sowohl TCP- als auch UDP-Ports überwacht. Die Deployment-Konfiguration ist unabhängig davon, ob Sie einen LoadBalancer-Dienst mit gemischten Protokollen oder zwei separate LoadBalancer-Dienste mit einem einzelnen Protokoll verwenden.

  1. Das folgende Manifest gilt für eine Beispielanwendung, die sowohl TCP- als auch UDP-Traffic auf Port 8080 überwacht. Speichern Sie das folgende Manifest als mixed-app-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mixed-app-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: mixed-app
      template:
        metadata:
          labels:
            app: mixed-app
        spec:
          containers:
          - image: gcr.io/kubernetes-e2e-test-images/agnhost:2.6
            name: agnhost
            args: ["serve-hostname", "--port=8080", "--tcp=true", "--udp=true", "--http=false"]
            ports:
              - name: tcp8080
                protocol: TCP
                containerPort: 8080
              - name: udp8080
                protocol: UDP
                containerPort: 8080
    
  2. Wenden Sie das Manifest auf Ihren Cluster an:

    kubectl apply -f mixed-app-deployment.yaml
    

Load-Balancer mit gemischten Protokollen erstellen

Erstellen Sie einen Service vom Typ LoadBalancer, der das Deployment für TCP- und UDP-Traffic freigibt.

  1. Speichern Sie das folgende Manifest als mixed-protocol-lb.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: mixed-protocol-lb
    spec:
      loadBalancerClass: "networking.gke.io/l4-regional-external"
      type: LoadBalancer
      selector:
        app: mixed-app
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
      - name: udp-port
        protocol: UDP
        port: 8080
    

    Der oben genannte Dienst hat zwei Ports, einen für TCP und einen für UDP, beide auf Port 8080.

  2. Wenden Sie das Manifest auf Ihren Cluster an:

    kubectl apply --server-side -f mixed-protocol-lb.yaml
    

Load-Balancer mit gemischten Protokollen prüfen

Prüfen Sie nach dem Erstellen des Dienstes, ob GKE den Load-Balancer erfolgreich erstellt hat.

  1. Untersuchen Sie den Dienst.

    kubectl describe service mixed-protocol-lb
    

    Die Ausgabe zeigt die externe IP-Adresse des Load-Balancers und die Weiterleitungsregeln für TCP und UDP. Prüfen Sie die folgenden Details in der Ausgabe:

    • Das Feld status.loadBalancer.ingress.ip ist ausgefüllt.
    • Prüfen Sie, ob die folgenden Annotationen für Ihren externen Load-Balancer vorhanden sind:
      • service.kubernetes.io/tcp-forwarding-rule
      • service.kubernetes.io/udp-forwarding-rule
    • Der Abschnitt Events enthält keine Fehlermeldungen.

Load-Balancer mit gemischten Protokollen aktualisieren

Sie können die Ports eines Load-Balancers mit gemischten Protokollen aktualisieren, indem Sie das Dienstmanifest bearbeiten. Führen Sie den folgenden Befehl aus, um den Dienst zu bearbeiten:

kubectl edit service SERVICE_NAME

Ersetzen Sie SERVICE_NAME durch den Namen Ihres Dienstes.

Ports aktualisieren

Wenn Sie die Ports eines Load Balancers mit gemischten Protokollen aktualisieren möchten, ändern Sie den Abschnitt ports des Dienstmanifests. Sie können Ports hinzufügen, entfernen oder ändern.

Im folgenden Beispiel wird ein UDP-Port für das Streaming und ein TCP-Port für Game-Server-Metadaten hinzugefügt:

apiVersion: v1
kind: Service
metadata:
  name: mixed-protocol-lb
spec:
  loadBalancerClass: "networking.gke.io/l4-regional-external"
  type: LoadBalancer
  selector:
    app: mixed-app
  ports:
  - name: tcp-port
    protocol: TCP
    port: 8080
  - name: streaming
    protocol: UDP
    port: 10100
  - name: gameserver-metadata
    protocol: TCP
    port: 10400
  - name: https
    protocol: TCP
    port: 443

Load-Balancer mit einem einzelnen Protokoll auf ein gemischtes Protokoll aktualisieren

Wenn Sie einen Load-Balancer mit einem einzelnen Protokoll in einen Load-Balancer mit gemischten Protokollen ändern möchten, bearbeiten Sie den Dienst so, dass er Ports für sowohl das TCP- als auch das UDP-Protokoll enthält.

Im folgenden Beispiel wird einem vorhandenen reinen TCP-Load-Balancer ein UDP-Port für DNS hinzugefügt:

apiVersion: v1
kind: Service
metadata:
  name: already-existing-single-protocol-lb
spec:
  loadBalancerClass: "networking.gke.io/l4-regional-external"
  type: LoadBalancer
  selector:
    app: mixed-app
  ports:
  - name: http
    protocol: TCP
    port: 80
  - name: https
    protocol: TCP
    port: 443
  - name: dns
    protocol: UDP
    port: 53

Load-Balancer mit gemischten Protokollen auf ein einzelnes Protokoll umstellen

Wenn Sie einen Load-Balancer mit gemischten Protokollen in einen Load-Balancer mit einem einzelnen Protokoll ändern möchten, entfernen Sie alle Ports für eines der Protokolle.

Im folgenden Beispiel wird der UDP-Port für DNS entfernt, wodurch der Load-Balancer nur noch TCP verwendet:

apiVersion: v1
kind: Service
metadata:
  name: already-existing-mixed-protocol-lb
spec:
  loadBalancerClass: "networking.gke.io/l4-regional-external"
  type: LoadBalancer
  selector:
    app: mixed-app
  ports:
  - name: http
    protocol: TCP
    port: 80
  - name: https
    protocol: TCP
    port: 443

LoadBalancer mit gemischten Protokollen löschen

Führen Sie den folgenden Befehl aus, um den externen LoadBalancer-Dienst mixed-protocol-lb zu löschen:

kubectl delete service mixed-protocol-lb

GKE entfernt automatisch alle Load Balancer-Ressourcen, die für den Dienst erstellt wurden.

Fehlerbehebung

In diesem Abschnitt wird beschrieben, wie Sie häufige Probleme mit LoadBalancer-Diensten mit gemischten Protokollen beheben.

Nach Fehlerereignissen suchen

Der erste Schritt bei der Fehlerbehebung besteht darin, die Ereignisse zu prüfen, die mit Ihrem Dienst verknüpft sind.

  1. Rufen Sie die Details Ihres Dienstes ab:

    kubectl describe service mixed-protocol-lb
    
  2. Prüfen Sie am Ende der Ausgabe den Abschnitt Events auf Fehlermeldungen.

Fehler: Gemischtes Protokoll wird für LoadBalancer nicht unterstützt

Wenn Sie den Dienst mit der Annotation cloud.google.com/l4-rbs: "enabled" erstellt haben, wird nach dem Erstellen des Load-Balancers mit gemischten Protokollen möglicherweise ein Warnereignis vom ursprünglichen Dienstcontroller angezeigt: mixed-protocol is not supported for LoadBalancer.

Sie können diese Meldung ignorieren, da der neue Controller, der gemischte Protokolle unterstützt, den Load-Balancer korrekt bereitstellt.

Portdefinition fehlt nach einem Update

Symptom:

Wenn Sie einen Dienst aktualisieren, der denselben Port für TCP und UDP verwendet (z. B. Port 8080), fehlt eine der Portdefinitionen im aktualisierten Dienst.

Ursache:

Dies ist ein bekanntes Problem in Kubernetes. Wenn Sie einen Dienst mit mehreren Protokollen am selben Port aktualisieren, kann es passieren, dass die clientseitige Patchberechnung die Portliste fälschlicherweise zusammenführt und eine der Portdefinitionen entfernt wird. Dieses Problem betrifft Clients, die clientseitiges Patchen verwenden, z. B. kubectl apply und den Go-Client mit Merge-Patches.

Lösung:

Die Problemumgehung für dieses Problem hängt von Ihrem Client ab.

  • Für kubectl: Verwenden Sie das Flag --server-side mit kubectl apply:

    kubectl apply --server-side -f YOUR_SERVICE_MANIFEST.yaml
    

    Ersetzen Sie YOUR_SERVICE_MANIFEST durch den Namen Ihres Dienstmanifests.

  • go-client: Verwenden Sie keine Merge-Patches. Verwenden Sie stattdessen einen Update-Aufruf, um den Dienst zu ersetzen. Dazu ist eine HTTP-PUT-Anfrage mit der gesamten Spezifikation des Service-Objekts erforderlich.

Nächste Schritte