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 oder internen LoadBalancer-Dienstes mit gemischten Protokollen für TCP- und UDP-Traffic verfügbar machen.

Weitere Informationen zu L4-Load-Balancern finden Sie unter LoadBalancer Dienste.

Übersicht

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

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

GKE unterstützt Dienste mit gemischten Protokollen mit IPv4-, IPv6- und Dual-Stack-Konfigurationen. Dienste mit gemischten Protokollen verwenden Weiterleitungsregeln der Schicht 3 (L3). Diese Regeln leiten standardmäßig den gesamten Traffic, der an der virtuellen IP-Adresse (VIP) des Load-Balancers eingeht, direkt an die Clusterknoten weiter.

Aus Sicherheitsgründen erstellt und verwaltet GKE automatisch Firewallregeln mit der Priorität 999, die nur den in Ihrem Dienstmanifest definierten spezifischen TCP- und UDP-Traffic zulassen. Anderer nicht autorisierter Traffic, der an die VIP-Adresse des Load-Balancers gerichtet ist, wird von von GKE verwalteten Firewallregeln mit der Priorität 1000 blockiert. Wenn Sie Firewallregeln mit höherer Priorität erstellen, achten Sie darauf, dass die Regeln nicht versehentlich nicht autorisierten Traffic zu Ihren Knoten zulassen. Weitere Informationen finden Sie unter Firewallregeln für GKE-Dienste.

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 diese Aufgabe 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.

Voraussetzungen

Damit Sie einen LoadBalancer-Dienst erstellen können, der gemischte Protokolle verwendet, muss Ihr Cluster die folgenden Anforderungen erfüllen:

  • Das Load-Balancing mit gemischten Protokollen ist ab GKE-Version 1.36.2-gke.1498000 allgemein verfügbar. Die allgemein verfügbare Version unterstützt sowohl externe als auch interne Load-Balancer mit IPv4-, IPv6- und Dual-Stack-Konfigurationen.
  • In den Versionen 1.34.1-gke.2190000 bis 1.36.2-gke.1498000 wird das Load-Balancing mit gemischten Protokollen nur für externe Load-Balancer unterstützt, die IPv4-Adressen verwenden.
  • Das Add-on HttpLoadBalancing muss in Ihrem Cluster aktiviert sein.
  • Bei internen Load-Balancern muss die GKE-Teilmengeneinstellung für den Cluster GKE subsetting aktiviert sein.
  • Legen Sie für neue interne LoadBalancer-Dienste im Dienstmanifest den Wert des Felds spec.loadBalancerClass auf networking.gke.io/l4-regional-internal fest. Bei vorhandenen internen Diensten, Ihr Manifest enthält bereits die Annotation networking.gke.io/load-balancer-type: "Internal" und Sie können die Annotation unverändert lassen.
  • Legen Sie für neue externe LoadBalancer-Dienste im Dienstmanifest das Feld spec.loadBalancerClass auf networking.gke.io/l4-regional-external fest. Bei vorhandenen externen Diensten enthält Ihr Manifest bereits die cloud.google.com/l4-rbs: "enabled" Annotation und Sie können die Annotation unverändert lassen.

Beschränkungen

  • In den Versionen 1.34.1-gke.2190000 bis 1.36.2-gke.1498000 unterstützen Load-Balancer mit gemischten Protokollen nur IPv4-Adressen.
  • Vorhandene Dienste mit den Finalizern gke.networking.io/l4-ilb-v1 oder gke.networking.io/l4-netlb-v1 können nicht für das Load-Balancing mit gemischten Protokollen verwendet werden. Wenn Sie gemischte Protokolle für diese Dienste verwenden möchten, müssen Sie den Dienst gemäß den vorherigen Anforderungen löschen und neu erstellen.
  • Das Aktualisieren von Ports im Dienst kann zu einer kurzen Unterbrechung des Traffics für den gesamten Traffic führen, der über den Load-Balancer weitergeleitet wird.
  • Sie können Private Service Connect nicht an Dienste mit gemischten Protokollen anhängen.

Preise

Cloud de Confiance Google Cloud berechnet Ihnen die Kosten pro Weiterleitungsregel, für alle externen IP-Adressen und für gesendete 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 Preise für VPC-Netzwerke.

Typ Transportschicht Internetschicht Anzahl der Weiterleitungsregeln Anzahl der externen IP-Adressen
Intern Einzeln oder gemischt (TCP, UDP oder beides) IPv4 1 0
IPv6 1 0
IPv4 und IPv6 (Dual-Stack) 2 0
Extern Einzeln oder gemischt (TCP, UDP oder beides) IPv4 1 1
IPv6 1 1
IPv4 und IPv6 (Dual-Stack) 2 2

Arbeitslast bereitstellen

In diesem Abschnitt wird beschrieben, wie Sie eine Beispielarbeitslast bereitstellen, die sowohl auf TCP- als auch auf UDP-Ports wartet. 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 auf Port 8080 für TCP- als auch für UDP-Traffic wartet. 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 Dienst vom Typ LoadBalancer, der das Deployment sowohl für TCP- als auch für UDP-Traffic verfügbar macht. Sie können entweder einen externen oder einen internen Load-Balancer erstellen.

  1. Speichern Sie das folgende Manifest als mixed-protocol-lb.yaml, um einen externen Load-Balancer zu erstellen:

    apiVersion: v1
    kind: Service
    metadata:
      name: mixed-protocol-external-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
    

    Legen Sie den Wert des Felds spec.loadBalancerClass auf networking.gke.io/l4-regional-internal fest, um einen internen Load-Balancer zu erstellen.

    Der vorherige 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

Nachdem Sie den Dienst erstellt haben, prüfen Sie, ob GKE den Load-Balancer erfolgreich erstellt hat.

  1. Untersuchen Sie den Dienst.

    kubectl describe service SERVICE_NAME
    

    Ersetzen Sie SERVICE_NAME durch den Namen Ihres Dienstes (z. B. mixed-protocol-lb).

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

    • Das Feld status.loadBalancer.ingress.ip ist ausgefüllt.
    • Prüfen Sie bei Clustern mit den Versionen 1.34.1-gke.2190000 bis 1.36.2-gke.1498000, ob die folgenden Annotationen für Ihren externen Load-Balancer vorhanden sind:
      • service.kubernetes.io/tcp-forwarding-rule
      • service.kubernetes.io/udp-forwarding-rule
    • Prüfen Sie bei Clustern, die mit Versionen nach 1.36.2-gke.1498000 erstellt wurden, je nach Konfiguration, ob die folgenden Annotationen für Ihren Load-Balancer vorhanden sind:
      • Für IPv4: service.kubernetes.io/l3-forwarding-rule
      • Für IPv6: service.kubernetes.io/l3-forwarding-rule-ipv6
      • Für Dual-Stack: beide Annotationen.
    • 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 werden 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"  # for internal LB, use: "networking.gke.io/l4-regional-internal"
  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 gemischte Protokolle 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 Load-Balancer, der nur TCP verwendet, 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" # for internal LB, use: "networking.gke.io/l4-regional-internal"
  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 aktualisieren

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" # for internal LB, use: "networking.gke.io/l4-regional-internal"
  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 LoadBalancer-Dienst mit gemischten Protokollen zu löschen:

kubectl delete service SERVICE_NAME

Ersetzen Sie SERVICE_NAME durch den Namen Ihres Dienstes (z. B. mixed-protocol-external-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.

Auf Fehlerereignisse prüfen

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 SERVICE_NAME
    

    Ersetzen Sie SERVICE_NAME durch den Namen Ihres Dienstes.

  2. Prüfen Sie am Ende der Ausgabe im Abschnitt Events auf Fehlermeldungen.

Fehler: Mixed Protocol wird für LoadBalancer nicht unterstützt

Wenn Sie den Dienst mit der cloud.google.com/l4-rbs: "enabled" Annotation erstellt haben, wird möglicherweise ein Warnereignis vom ursprünglichen Dienst-Controller angezeigt nachdem Sie den Load-Balancer mit gemischten Protokollen erstellt haben: 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.

Nach einem Update fehlt die Portdefinition

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 die Patchberechnung auf Clientseite die Portliste falsch zusammenführen, wodurch eine der Portdefinitionen entfernt wird. Dieses Problem betrifft Clients, die clientseitige Patches 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 --server-side Flag mit kubectl apply:

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

    Ersetzen Sie YOUR_SERVICE_MANIFEST durch den Namen Ihres Dienstmanifests.

  • Für 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 vollständigen Spezifikation des Dienstobjekts erforderlich.

Nächste Schritte