Mit GKE-Multi-Networking können Sie Ihre Arbeitslasten mit mehreren VPC-Netzwerken verbinden. Sie können diese Multi-Network-Pods für interne oder externe Clients freigeben, 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 Multi-Network-Pods implementiert. Es werden die erforderliche Konfiguration, die Funktionen und die Einschränkungen des Features behandelt.
Funktionsweise von LoadBalancer-Diensten für mehrere Netzwerke
Wenn Sie eine Multi-Network-Arbeitslast freigeben möchten, 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. Sie können auch eine Annotation hinzufügen, um anzugeben, ob ein interner oder externer Load-Balancer erstellt werden soll.
Das Label networking.gke.io/network im Selektor filtert Endpunkte nach Netzwerk. 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 dem Dienst
manifest die
networking.gke.io/load-balancer-type: "Internal" Annotation hinzu. Im folgenden Beispiel wird ein Dienst gezeigt, der einen internen Load-Balancer erstellt, um Pods im dmz-Netzwerk 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 Backend-Dienst-basierten externen Netzwerk-Load-Balancer erstellen möchten, fügen Sie dem Dienstmanifest die Annotation cloud.google.com/l4-rbs: enabled hinzu. Im folgenden Beispiel wird ein Dienst gezeigt, der einen externen Load-Balancer erstellt, um Pods im dmz-Netzwerk 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 im Pod so konfigurieren, dass er korrekt auf Anfragen an der entsprechenden Netzwerkschnittstelle antworten kann.
Sie können das Pod-Routing auf eine der folgenden Arten konfigurieren:
Standardschnittstelle festlegen: Verwenden Sie die
networking.gke.io/default-interfaceAnnotation im Pod, um die sekundäre Netzwerkschnittstelle als Standard route festzulegen.Richtlinienbasiertes Routing konfigurieren: Verwenden Sie einen
initContainermit derNET_ADMINFunktion, um Routingregeln im Pod zu konfigurieren.
Im folgenden Beispiel wird ein Deployment-Manifest für Pods mit einer Schnittstelle im dmz-Netzwerk gezeigt. Die Annotation networking.gke.io/default-interface legt die dmz-Schnittstelle (eth1) als Standardroute fest.
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
Multi-Network-Endpunkte prüfen
GKE verwendet einen dedizierten Controller, multinet-endpointslice-controller.gke.io, um Endpunkte für Multi-Network-Dienste zu verwalten. Dieser Controller erstellt EndpointSlice-Objekte für Ihre Multi-Network-Dienste. Die IP-Adressen in diesen EndpointSlice-Objekten gehören zum sekundären Netzwerk, das im Dienstselektor angegeben ist.
Wenn ein Load-Balancer keine fehlerfreien Back-Ends hat, prüfen Sie das EndpointSlice für den Dienst, um zu bestätigen, dass der Controller die richtigen Pod-IP-Adressen ausgewählt hat. Wenn das EndpointSlice keine Endpunkte hat, prüfen Sie, ob die Labels des Dienstselektors mit Ihren ausgeführten Pods übereinstimmen und ob der Selektor networking.gke.io/network mit dem Netzwerk der Pods übereinstimmt.
Beschränkungen
Für LoadBalancer-Dienste für mehrere Netzwerke gelten die folgenden Einschränkungen:
- Für interne Load-Balancer ist die GKE-Untergruppe erforderlich.
- Load-Balancer, die auf Zielpools oder Instanzgruppen basieren, werden nicht unterstützt.
- Dienste, die
externalTrafficPolicy: Clusterverwenden, werden nicht unterstützt. - Dienste können nicht auf
hostNetwork-Pods ausgerichtet sein. - 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.
Nächste Schritte
- Informationen zum Bereitstellen von Multi-Network-Diensten finden Sie im Multi-Network Services User Guide.