In diesem Dokument wird gezeigt, wie Sie eine Anwendung, die in einem Google Kubernetes Engine-Cluster (GKE) ausgeführt wird, mithilfe eines externen oder internen LoadBalancer-Dienstes mit gemischtem Protokoll 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. 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 Traffic für TCP und UDP zu verwalten. Wenn Sie einen einzelnen Dienst verwenden, wird die Konfiguration vereinfacht, da Sie eine einzelne IP-Adresse und einen konsolidierten Satz von Weiterleitungsregeln für beide Protokolle verwenden können. Dieses Feature wird sowohl für regionale externe Passthrough-Network Load Balancer als auch für interne Passthrough-Network Load Balancer unterstützt.
GKE unterstützt Services mit gemischten Protokollen mit IPv4-, IPv6- und Dual-Stack-Konfigurationen. Dienste mit gemischten Protokollen verwenden Weiterleitungsregeln der Schicht 3 (L3). Diese Regeln leiten den gesamten Traffic, der an der virtuellen IP-Adresse (VIP) des Load Balancers eingeht, direkt an die Clusterknoten weiter.
Zur Aufrechterhaltung der Sicherheit 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 GKE-verwalteten Firewallregeln mit der Priorität 1.000 blockiert. Wenn Sie Firewallregeln mit höherer Priorität erstellen, achten Sie darauf, dass die Regeln nicht versehentlich unautorisierten Traffic zu Ihren Knoten zulassen. Weitere Informationen finden Sie unter GKE-Service-Firewallregeln.
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, 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 updateab. In früheren gcloud CLI-Versionen werden die Befehle in diesem Dokument möglicherweise nicht unterstützt.
- Sie benötigen einen vorhandenen Autopilot- oder Standardcluster. 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:
- 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
HttpLoadBalancingmuss für Ihren Cluster aktiviert sein. - Für interne Load Balancers muss im Cluster die GKE-Teilmengeneinstellung aktiviert sein.
- Legen Sie für neue interne LoadBalancer-Dienste im Dienstmanifest den Wert des Felds
spec.loadBalancerClassaufnetworking.gke.io/l4-regional-internalfest. Bei vorhandenen internen Diensten ist die Annotationnetworking.gke.io/load-balancer-type: "Internal"bereits in Ihrem Manifest enthalten. Sie können sie unverändert lassen. - Bei neuen externen LoadBalancer-Diensten muss der Load Balancer ein Backend-Dienst-basierter regionaler externer Passthrough-Network-Load-Balancer sein. In GKE 1.37 und höher ist diese Konfiguration die Standardeinstellung. In früheren Versionen legen Sie das Feld
spec.loadBalancerClassim Dienstmanifest aufnetworking.gke.io/l4-regional-externalfest. Bei vorhandenen externen Diensten ist die Annotationcloud.google.com/l4-rbs: "enabled"bereits in Ihrem Manifest enthalten. 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-v1odergke.networking.io/l4-netlb-v1kö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 löschen und gemäß den oben genannten Anforderungen neu erstellen. - Das Aktualisieren von Ports im Dienst kann zu einer kurzen Unterbrechung des Traffics führen, der über den Load-Balancer geleitet wird.
- Sie können Private Service Connect nicht an Dienste mit gemischten Protokollen anhängen.
Preise
Google Cloud stellt Ihnen jede Weiterleitungsregel, alle externen IP-Adressen und alle gesendeten Daten in Rechnung. 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 |
|---|---|---|---|---|
| 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 gezeigt, wie Sie eine Beispielarbeitslast bereitstellen, die sowohl TCP- als auch UDP-Ports überwacht. Die Bereitstellungskonfiguration ist dieselbe, unabhängig davon, ob Sie einen LoadBalancer-Dienst mit gemischten Protokollen oder zwei separate LoadBalancer-Dienste mit einem einzelnen Protokoll verwenden.
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: 8080Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f mixed-app-deployment.yaml
Load-Balancer für gemischte Protokolle erstellen
Erstellen Sie einen Service vom Typ LoadBalancer, der das Deployment für TCP- und UDP-Traffic verfügbar macht. Sie können entweder einen externen oder einen internen Load Balancer erstellen.
Speichern Sie zum Erstellen eines externen Load-Balancers das folgende Manifest als
mixed-protocol-lb.yaml: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: 8080Zum Erstellen eines internen Load-Balancers legen Sie für das Feld
spec.loadBalancerClassden Wertnetworking.gke.io/l4-regional-internalfest.Der vorherige Dienst hat zwei Ports, einen für TCP und einen für UDP, beide auf Port 8080.
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.
Untersuchen Sie den Dienst.
kubectl describe service SERVICE_NAMEErsetzen Sie
SERVICE_NAMEdurch den Namen Ihres Dienstes (z. B.mixed-protocol-lb).Die Ausgabe zeigt die IP-Adresse des Load Balancers und die Weiterleitungsregeln. Prüfen Sie in der Ausgabe die folgenden Details:
- Das Feld
status.loadBalancer.ingress.ipist ausgefüllt. - Prüfen Sie bei Clustern mit 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-ruleservice.kubernetes.io/udp-forwarding-rule
- Prüfen Sie bei Clustern, die mit Versionen nach 1.36.2-gke.1498000 erstellt wurden, ob die folgenden Anmerkungen für Ihren Load-Balancer vorhanden sind, je nach Konfiguration:
- Für IPv4:
service.kubernetes.io/l3-forwarding-rule - Für IPv6:
service.kubernetes.io/l3-forwarding-rule-ipv6 - Für Dual-Stack: beide Anmerkungen.
- Für IPv4:
- Der Abschnitt
Eventsenthält keine Fehlermeldungen.
- Das Feld
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 ein gemischtes Protokoll umstellen
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" # 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 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" # 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 gemischtem Protokoll 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.
Nach Fehlerereignissen suchen
Der erste Schritt bei der Fehlerbehebung besteht darin, die Ereignisse zu prüfen, die mit Ihrem Dienst verknüpft sind.
Details zu Ihrem Dienst abrufen:
kubectl describe service SERVICE_NAMEErsetzen Sie
SERVICE_NAMEdurch den Namen Ihres Dienstes.Prüfen Sie am Ende der Ausgabe den Abschnitt
Eventsauf 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 die clientseitige Patch-Berechnung die Portliste fälschlicherweise zusammenführen, wodurch 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-sidemitkubectl apply:kubectl apply --server-side -f YOUR_SERVICE_MANIFEST.yamlErsetzen Sie
YOUR_SERVICE_MANIFESTdurch 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
- Weitere Informationen zum Verfügbarmachen von Anwendungen über Dienste
- Weitere Informationen zu LoadBalancer-Diensten