Mit GKE Multi-Networking können Sie Ihre Arbeitslasten mit mehreren VPC-Netzwerken verbinden. Sie können diese Pods mit mehreren Netzwerken für interne oder externe Clients verfügbar machen, indem Sie einen Kubernetes-Dienst vom Typ type: LoadBalancer verwenden.
GKE stellt einen Google Cloud L4-Load-Balancer für den Dienst bereit, der Traffic an Pods in einem angegebenen sekundären Netzwerk sendet.
In diesem Dokument wird erläutert, wie GKE LoadBalancer-Dienste für Pods mit mehreren Netzwerken implementiert. Darin werden die erforderliche Konfiguration, die Funktionen und die Einschränkungen des Features beschrieben.
Funktionsweise von LoadBalancer-Diensten für mehrere Netzwerke
Um eine Arbeitslast mit mehreren Netzwerken verfügbar zu machen, erstellen Sie einen Service vom Typ type:
LoadBalancer. Dieser Dienst muss einen speziellen Selektor enthalten, der Pods basierend auf dem Netzwerk ihrer sekundären Schnittstelle auswählt. Außerdem 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. So wird sichergestellt, dass der Load-Balancer Traffic nur an die Pod-Schnittstellen sendet, die mit dem angegebenen Netzwerk verbunden sind.
Interner LoadBalancer-Dienst
Wenn Sie einen internen Load-Balancer erstellen möchten, fügen Sie Ihrem Dienstmanifest die Annotation networking.gke.io/load-balancer-type: "Internal" hinzu. Im folgenden Beispiel wird ein Dienst gezeigt, der einen internen Load Balancer erstellt, um Pods im Netzwerk dmz anzusprechen:
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: LoadBalancer
Externer LoadBalancer-Dienst
Wenn Sie einen externen Netzwerk-Load-Balancer erstellen möchten, müssen Sie einen Backend-Dienst-basierten Load-Balancer konfigurieren. In GKE 1.37 und höher ist dies das Standardverhalten. Fügen Sie in früheren Versionen die Annotation cloud.google.com/l4-rbs: enabled in Ihr Dienstmanifest ein. Im folgenden Beispiel wird ein Dienst gezeigt, der einen externen Load-Balancer erstellt, um Pods im Netzwerk dmz anzusprechen:
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: LoadBalancer
Pod- und Netzwerkkonfiguration
Ihre Pods müssen eine Schnittstelle in dem Netzwerk haben, auf das der LoadBalancer-Dienst ausgerichtet ist. Außerdem müssen Sie das Routing innerhalb des Pods konfigurieren, damit er korrekt auf Anfragen über die entsprechende Netzwerkschnittstelle reagieren kann.
Sie haben folgende Möglichkeiten, das Pod-Routing zu konfigurieren:
Standardschnittstelle festlegen: Verwenden Sie die Annotation
networking.gke.io/default-interfacefür den Pod, um die sekundäre Netzwerkschnittstelle als Standardroute festzulegen.Richtlinienbasiertes Routing konfigurieren: Verwenden Sie ein
initContainermit der FunktionNET_ADMIN, um Routingregeln im Pod zu konfigurieren.
Das folgende Beispiel zeigt ein Deployment-Manifest für Pods mit einer Schnittstelle im Netzwerk dmz. Mit der Annotation networking.gke.io/default-interface wird die dmz-Schnittstelle (eth1) als Standardroute festgelegt.
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: 8080
Endpunkte für mehrere Netzwerke prüfen
GKE verwendet einen dedizierten Controller, multinet-endpointslice-controller.gke.io, um Endpunkte für Dienste mit mehreren Netzwerken zu verwalten. Dieser Controller erstellt EndpointSlice-Objekte für Ihre Dienste mit mehreren Netzwerken. Die IP-Adressen in diesen EndpointSlice-Objekten gehören zum sekundären Netzwerk, das in der Dienstauswahl angegeben ist.
Wenn ein Load Balancer keine fehlerfreien Back-Ends hat, prüfen Sie die EndpointSlice für den Dienst, um zu sehen, ob der Controller die richtigen Pod-IP-Adressen ausgewählt hat. Wenn der EndpointSlice keine Endpunkte hat, prüfen Sie, ob die Labels des Dienstselektors mit Ihren ausgeführten Pods übereinstimmen und ob der networking.gke.io/network-Selektor mit dem Netzwerk der Pods übereinstimmt.
Beschränkungen
Für LoadBalancer-Dienste mit mehreren Netzwerken gelten die folgenden Einschränkungen:
- Für interne Load Balancer ist die GKE-Teilmengeneinstellung erforderlich.
- Auf Zielpools oder Instanzgruppen basierende Load Balancer werden nicht unterstützt.
- Dienste, die
externalTrafficPolicy: Clusterverwenden, werden nicht unterstützt. - Dienste können nicht auf
hostNetwork-Pods ausgerichtet werden. - 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.
Nächste Schritte
- Anleitung zum Bereitstellen von Multi-Netzwerk-Diensten
- Informationen zum Vorbereiten von VPCs und zum Erstellen eines GKE-Cluster mit zusätzlichen Netzwerken finden Sie im GKE Multi-Network User Guide.