In diesem Dokument wird beschrieben, wie Sie Pods mit mehreren Netzwerken für interne oder externe
Clients freigeben, indem Sie externe Passthrough-Network-Load-Balancer und interne Passthrough-Network-Load-Balancer
Ressourcen in GKE erstellen. Google Cloud Es werden die erforderliche Konfiguration, Funktionen und Einschränkungen von LoadBalancer-Diensten mit mehreren Netzwerken 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 zu mehreren Netzwerken in GKE finden Sie unter Unterstützung mehrerer Netzwerke für Pods.
Funktionsweise von LoadBalancer-Diensten mit mehreren Netzwerken
Zum Freigeben einer Arbeitslast mit mehreren Netzwerken erstellen Sie einen Service vom type: LoadBalancer.
Der Dienst muss einen speziellen Selektor enthalten, der Pods basierend auf dem Netzwerk ihrer sekundären Schnittstelle auswählt. Fügen Sie eine Annotation hinzu, um anzugeben, ob ein interner oder externer Load-Balancer erstellt werden soll.
Das Label networking.gke.io/network im Selektor filtert Endpunkte nach Netzwerk. 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.
- Das Netzwerk eines vorhandenen Dienstes kann nicht geändert werden.
- 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 Netzwerken (nicht standardmäßig) nicht unterstützt.
Hinweis
Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:
- Folgen Sie der Anleitung unter Unterstützung mehrerer Netzwerke für Pods einrichten, um Ihre VPC-Netzwerke vorzubereiten und einen GKE Cluster mit einem zusätzlichen Netzwerk zu erstellen.
- Prüfen Sie, ob für Ihren Cluster die Teilmengeneinstellung für interne Layer 4-Load-Balancer aktiviert ist. Verwenden Sie zum Aktivieren dieser Funktion das Flag
--enable-l4-ilb-subsetting, wenn Sie den Cluster erstellen oder aktualisieren. - Achten Sie darauf, dass in Ihrem Cluster GKE-Version 1.37 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 demdefault-Netzwerk verbunden ist, undeth1, die mit demdmz-Netzwerk verbunden 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 dazu der Pod-Spezifikation einen initContainer mit der Funktion NET_ADMIN hinzu.
Das folgende Beispiel zeigt einen initContainer, der eine Standardroute für die eth1-Schnittstelle 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 initContainer-Befehl 172.16.1.0/24 durch den sekundären IP-Adressbereich Ihres Pod-Netzwerks.
Internen LoadBalancer-Dienst bereitstellen
Wenn Sie das web-app-Deployment im dmz-Netzwerk freigeben möchten, 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: LoadBalancerDieses Manifest erstellt einen Dienst mit den folgenden Eigenschaften:
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 demdmz-Netzwerk verbunden sind.
Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f internal-lb-service.yaml
Externen LoadBalancer-Dienst bereitstellen
Wenn Sie das web-app-Deployment für externe Clients freigeben möchten, 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: LoadBalancerDieses Manifest erstellt einen Dienst mit den folgenden Eigenschaften:
cloud.google.com/l4-rbs: "enabled": Gibt einen Backend-Dienst-basierten externen Passthrough-Network-Load-Balancer an.selector: Wählt Pods mit dem Labelapp: web-appaus, die mit demdmz-Netzwerk verbunden sind.
Wenden Sie das Manifest auf Ihren Cluster an:
kubectl apply -f external-lb-service.yaml
Dienste prüfen
Prüfen Sie nach der Bereitstellung der Dienste, ob die Load-Balancer korrekt erstellt und konfiguriert wurden.
Prüfen Sie den Status der Dienste:
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.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 desdmzNetzwerks ü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 zum Testen des externen Load-Balancers eine Anfrage an seine externe IP-Adresse:
curl EXTERNAL_LB_IP:80Ersetzen Sie
EXTERNAL_LB_IPdurch die externe IP-Adresse desweb-app-external-lb-Dienstes.Senden Sie zum Testen des internen Load-Balancers 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 Load-Balancern mit mehreren Netzwerken beheben.
Erstellung des Load-Balancers schlägt fehl
Wenn die Erstellung des Load-Balancers fehlschlägt, suchen Sie in den Dienstereignissen nach 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 gibt an, 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 auf Konfigurationsfehler:
kubectl get networks NETWORK_NAME -o yaml
Ersetzen Sie NETWORK_NAME durch den Namen Ihres Netzwerks.
In einer gültigen Konfiguration sind sowohl die Bedingungen ParamsReady als auch Ready
True. Wenn ParamsReady nicht True ist, prüfen Sie, ob parametersRef in der
Network-Spezifikation korrekt mit dem Namen, der Art und der Gruppe einer
vorhandenen GKENetworkParamSet-Ressource übereinstimmt.
Wenn die Network-Ressource korrekt ist, aber immer noch nicht bereit ist, prüfen Sie den Status von
dem 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 wurde, aber keine fehlerfreien Back-Ends 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 Controller
multinet-endpointslice-controller.gke.ioerstellt die Endpunkte mit mehreren Netzwerken. Die in der EndpointSlice aufgeführten Pod-IP-Adressen gehören zum Netzwerk, das vom Dienst verwendet wird. Wenn die EndpointSlice keine Endpunkte hat, prüfen Sie, ob die Selektorlabels des Dienstes mit den ausgeführten Pods übereinstimmen und ob der Netzwerkselektor mit dem Netzwerk der Pods übereinstimmt.
Nächste Schritte
- Informationen zur Unterstützung mehrerer Netzwerke für Pods
- Informationen zu Diensten mit mehreren Netzwerken.