In diesem Dokument wird beschrieben, wie Sie Pods mit mehreren Netzwerken für interne oder externe Clients verfügbar machen, indem Sie Google Cloud regionale externe Passthrough-Network-Load-Balancer- und interne Passthrough-Network-Load-Balancer-Ressourcen in GKE erstellen. Es werden die erforderliche Konfiguration, die Funktionen und die Einschränkungen von Multi-Netzwerk-LoadBalancer-Diensten beschrieben.
Wenn Sie Arbeitslasten mit mehreren VPC-Netzwerken verbinden, verwenden Sie einen Kubernetes-Dienst vom Typ LoadBalancer, um Traffic an Pods in einem bestimmten sekundären Netzwerk weiterzuleiten. Wenn Sie den Dienst erstellen, erstellt GKE einen Passthrough-Network-Load-Balancer, um diesen Traffic zu verwalten.
Weitere Informationen zur Unterstützung mehrerer Netzwerke in GKE finden Sie unter Unterstützung mehrerer Netzwerke für Pods.
Funktionsweise von LoadBalancer-Diensten für mehrere Netzwerke
Um eine Arbeitslast mit mehreren Netzwerken verfügbar zu machen, erstellen Sie ein Service vom Typ type: LoadBalancer.
Der Dienst muss einen speziellen Selektor enthalten, der auf Pods auf Grundlage des Netzwerks ihrer sekundären Schnittstelle ausgerichtet ist. Fügen Sie eine Annotation hinzu, um anzugeben, ob ein interner oder externer Load Balancer erstellt werden soll.
Mit dem Label networking.gke.io/network in den Auswahlfiltern werden Endpunkte nach Netzwerk gefiltert. Dieses Label sorgt dafür, dass der Load Balancer Traffic nur an die Pod-Schnittstellen sendet, die mit dem angegebenen Netzwerk verbunden sind.
Beschränkungen
Für Load Balancer mit mehreren Netzwerken gelten die folgenden Einschränkungen:
- Dienste, die
externalTrafficPolicy: Clusterverwenden, werden nicht unterstützt. - Dienste, die auf
hostNetwork-Pods ausgerichtet sind, werden nicht unterstützt. - IPv6 und Dual-Stack-Netzwerke werden nicht unterstützt.
- Sie können das Netzwerk eines vorhandenen Dienstes nicht ändern.
- Es werden nur Layer 3-Netzwerke unterstützt.
- Load Balancer, die auf Zielpools oder Instanzgruppen-Back-Ends basieren, werden nicht unterstützt.
- ClusterIP- und NodePort-Dienste werden in sekundären (nicht standardmäßigen) Netzwerken nicht unterstützt.
Hinweis
Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:
- Führen Sie die Schritte unter Unterstützung mehrerer Netzwerke für Pods einrichten aus, um Ihre VPC-Netzwerke vorzubereiten und einen GKE-Cluster mit einem zusätzlichen Netzwerk zu erstellen.
- Achten Sie darauf, dass in Ihrem Cluster die Teilmengeneinstellung für interne L4-Load-Balancer aktiviert ist. Wenn Sie dieses Feature aktivieren möchten, verwenden Sie beim Erstellen oder Aktualisieren des Clusters das Flag
--enable-l4-ilb-subsetting. - Achten Sie darauf, dass auf Ihrem Cluster die GKE-Version 1.36 oder höher ausgeführt wird.
Pods mit mehreren Netzwerken bereitstellen
Wenn Sie Pods an ein zusätzliches Netzwerk anhängen möchten, erstellen Sie ein Deployment mit der Annotation networking.gke.io/interfaces. Diese Annotation gibt die Netzwerke und Schnittstellen für die Pods an.
Speichern Sie das folgende Manifest als
web-app-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: web-app labels: app: web-app spec: replicas: 3 selector: matchLabels: app: web-app template: metadata: labels: app: web-app annotations: networking.gke.io/default-interface: 'eth1' networking.gke.io/interfaces: '[ {"interfaceName":"eth0","network":"default"}, {"interfaceName": "eth1","network": "dmz"} ]' spec: containers: - name: whereami image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1 ports: - containerPort: 8080Dieses Manifest erstellt ein Deployment mit dem Namen
web-appmit drei Pods. Die Pods haben zwei Schnittstellen:eth0, die mit dem Netzwerkdefaultverbunden ist, undeth1, die mit dem Netzwerkdmzverbunden ist. Mit der Annotationnetworking.gke.io/default-interfacewirdeth1als Standardschnittstelle für die Pods festgelegt.Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f web-app-deployment.yaml
Wenn Sie eine nicht standardmäßige Schnittstelle für Ihren Dienst verwenden, müssen Sie das Routing im Pod konfigurieren. Fügen Sie der Pod-Spezifikation einen initContainer mit der Funktion NET_ADMIN hinzu, um das Routing zu konfigurieren.
Im folgenden Beispiel wird ein initContainer gezeigt, das eine Standardroute für die Schnittstelle eth1 hinzufügt:
initContainers:
- name: init-routes-busybox
image: busybox
command: ['sh', '-c', 'ip route add default dev eth1 table 200 && ip rule add from 172.16.1.0/24 table 200']
securityContext:
capabilities:
add: ["NET_ADMIN"]
Ersetzen Sie im Befehl initContainer den Wert 172.16.1.0/24 durch den sekundären IP-Adressbereich Ihres Pod-Netzwerks.
Internen LoadBalancer-Dienst bereitstellen
Um das web-app-Deployment im dmz-Netzwerk verfügbar zu machen, erstellen Sie einen internen LoadBalancer-Dienst.
Speichern Sie das folgende Manifest als
internal-lb-service.yaml:apiVersion: v1 kind: Service metadata: name: web-app-internal-lb namespace: default annotations: networking.gke.io/load-balancer-type: "Internal" spec: externalTrafficPolicy: Local ports: - port: 80 protocol: TCP targetPort: 8080 selector: networking.gke.io/network: dmz app: web-app type: LoadBalancerMit diesem Manifest wird ein Service mit den folgenden Attributen erstellt:
networking.gke.io/load-balancer-type: "Internal": Gibt einen internen Passthrough-Network Load Balancer an.selector: Wählt Pods mit dem Labelapp: web-appaus, die mit dem Netzwerkdmzverbunden sind.
Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f internal-lb-service.yaml
Externen LoadBalancer-Dienst bereitstellen
Um das web-app-Deployment für externe Clients verfügbar zu machen, erstellen Sie einen externen LoadBalancer-Dienst.
Speichern Sie das folgende Manifest als
external-lb-service.yaml:apiVersion: v1 kind: Service metadata: name: web-app-external-lb namespace: default annotations: cloud.google.com/l4-rbs: "enabled" spec: externalTrafficPolicy: Local ports: - port: 80 protocol: TCP targetPort: 8080 selector: networking.gke.io/network: dmz app: web-app type: LoadBalancerMit diesem Manifest wird ein Service mit den folgenden Attributen erstellt:
cloud.google.com/l4-rbs: "enabled": gibt einen Backend-Dienst-basierten externen Passthrough-Network-Load-Balancer an. In GKE 1.37 und höher ist diese Konfiguration die Standardeinstellung und die Annotation ist nicht erforderlich.selector: wählt Pods mit dem Labelapp: web-appaus, die mit dem Netzwerkdmzverbunden sind.
Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f external-lb-service.yaml
Dienste überprüfen
Prüfen Sie nach der Bereitstellung der Dienste, ob die Load Balancer erstellt und richtig konfiguriert wurden.
Status der Dienste prüfen:
kubectl get servicesDie Ausgabe sieht etwa so aus:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web-app-external-lb LoadBalancer 10.8.47.77 35.239.57.231 80:31550/TCP 5m web-app-internal-lb LoadBalancer 10.8.43.251 172.16.0.43 80:32628/TCP 6m kubernetes ClusterIP 10.8.32.1 <none> 443/TCP 43hDie
EXTERNAL-IP-Adresse für den internen Load Balancer gehört zumdmz-Netzwerk.So listen Sie die Weiterleitungsregeln in Ihrem Projekt auf:
gcloud compute forwarding-rules listDie Ausgabe sieht etwa so aus:
NAME REGION IP_ADDRESS IP_PROTOCOL TARGET af901673cc0f24907a6aa8c3ce4afc21 us-central1 35.239.57.231 TCP us-central1/backendServices/k8s2-xhvzqabw-default-web-app-external-lb-u4xbs4ot k8s2-tcp-xhvzqabw-default-web-app-internal-lb-vp1x1d6a us-central1 172.16.0.43 TCP us-central1/backendServices/k8s2-xhvzqabw-default-web-app-internal-lb-vp1x1d6aBeschreiben Sie die Weiterleitungsregel für den internen Load Balancer, um zu prüfen, ob er mit dem richtigen Netzwerk verbunden ist:
gcloud compute forwarding-rules describe k8s2-tcp-xhvzqabw-default-web-app-internal-lb-vp1x1d6a --region=$REGIONErsetzen Sie
REGIONdurch die Region Ihres Clusters.Die entsprechende Ausgabe sieht etwa so aus: Prüfen Sie, ob die Felder
networkundsubnetworkmit den Details desdmz-Netzwerks übereinstimmen.IPAddress: 172.16.0.43 IPProtocol: TCP ... loadBalancingScheme: INTERNAL name: k8s2-tcp-xhvzqabw-default-web-app-internal-lb-vp1x1d6a network: https://www.googleapis.com/compute/v1/projects/projectId/global/networks/dmz-vpc ... subnetwork: https://www.googleapis.com/compute/v1/projects/projectId/regions/us-central1/subnetworks/dmz-subnet
Load Balancer testen
Senden Sie eine Anfrage an die externe IP-Adresse des externen Load Balancers, um ihn zu testen:
curl EXTERNAL_LB_IP:80Ersetzen Sie
EXTERNAL_LB_IPdurch die externe IP-Adresse desweb-app-external-lb-Dienstes.Um den internen Load Balancer zu testen, senden Sie eine Anfrage von einem Host in derselben VPC wie der Load Balancer:
curl INTERNAL_LB_IP:80Ersetzen Sie
INTERNAL_LB_IPdurch die IP-Adresse desweb-app-internal-lb-Dienstes.
Fehlerbehebung
In diesem Abschnitt wird beschrieben, wie Sie Probleme mit Multi-Netzwerk-Load-Balancern beheben.
Load-Balancer kann nicht erstellt werden
Wenn die Erstellung des Load Balancers fehlschlägt, prüfen Sie die Dienstereignisse auf Fehlermeldungen:
kubectl describe service SERVICE_NAME
Ersetzen Sie SERVICE_NAME durch den Namen Ihres Dienstes.
Eine Fehlermeldung wie network some-other-network does not exist weist darauf hin, dass das im Dienstselektor angegebene Netzwerk nicht im Cluster definiert ist.
Prüfen Sie, ob das Netzwerk vorhanden ist:
kubectl get networks
Wenn das Netzwerk vorhanden ist, prüfen Sie, ob das Network-Objekt korrekt auf eine gültige GKENetworkParamSet-Ressource verweist. Prüfen Sie den Status der Network-Ressource, um nach Konfigurationsfehlern zu suchen:
kubectl get networks NETWORK_NAME -o yaml
Ersetzen Sie NETWORK_NAME durch den Namen Ihres Netzwerks.
In einer gültigen Konfiguration sind sowohl die Bedingung ParamsReady als auch die Bedingung Ready True. Wenn ParamsReady nicht True ist, prüfen Sie, ob der parametersRef in der Network-Spezifikation mit dem Namen, der Art und der Gruppe einer vorhandenen GKENetworkParamSet-Ressource übereinstimmt.
Wenn die Ressource Network korrekt ist, aber immer noch nicht bereit ist, prüfen Sie den Status der referenzierten GKENetworkParamSet auf Fehler, z. B. ein fehlendes Subnetz:
kubectl get gkenetworkparamsets GNP_NAME -o yaml
Ersetzen Sie GNP_NAME durch den Namen Ihres GKENetworkParamSet.
Load-Balancer hat keine Back-Ends
Wenn der Load Balancer bereitgestellt ist, aber keine fehlerfreien Backends hat, gehen Sie so vor:
- Prüfen Sie, ob ein Knotenpool mit Netzwerkschnittstellen im Netzwerk vorhanden ist, das vom Dienst verwendet wird.
- Prüfen Sie, ob die vom Dienst ausgewählten Pods ausgeführt werden.
Prüfen Sie die Endpunkte für den Dienst:
kubectl describe endpointslice -l kubernetes.io/service-name=SERVICE_NAMEDer
multinet-endpointslice-controller.gke.io-Controller erstellt die Multi-Netzwerk-Endpunkte. Die im EndpointSlice aufgeführten Pod-IP-Adressen gehören zum Netzwerk, das vom Service verwendet wird. Wenn das EndpointSlice keine Endpunkte hat, prüfen Sie, ob die Labels der Serviceauswahl mit den ausgeführten Pods übereinstimmen und ob die Netzwerkauswahl mit dem Netzwerk der Pods übereinstimmt.