LoadBalancer-Dienste für mehrere Netzwerke

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-interface für den Pod, um die sekundäre Netzwerkschnittstelle als Standardroute festzulegen.

  • Richtlinienbasiertes Routing konfigurieren: Verwenden Sie ein initContainer mit der Funktion NET_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: Cluster verwenden, 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