LoadBalancer-Dienste für mehrere Netzwerke

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-interface Annotation im Pod, um die sekundäre Netzwerkschnittstelle als Standard route festzulegen.

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