Servizi LoadBalancer multirete

GKE multi-networking ti consente di connettere i tuoi carichi di lavoro a più reti VPC. Puoi esporre questi pod multirete a client interni o esterni utilizzando un servizio Kubernetes di type: LoadBalancer. GKE esegue il provisioning di un bilanciatore del carico L4 per il servizio che invia il traffico ai pod su una rete secondaria specificata. Google Cloud

Questo documento spiega come GKE implementa i servizi LoadBalancer per i pod multi-rete. Vengono descritte la configurazione, le funzionalità e le limitazioni richieste della funzionalità.

Come funzionano i servizi LoadBalancer multi-rete

Per esporre un carico di lavoro multirete, crei un Service di type: LoadBalancer. Questo servizio deve includere un selettore speciale che ha come target i pod in base alla rete della loro interfaccia secondaria. Aggiungi anche un'annotazione per specificare se creare un bilanciatore del carico interno o esterno.

L'etichetta networking.gke.io/network nel selettore filtra gli endpoint in base alla rete. In questo modo, il bilanciatore del carico invia il traffico solo alle interfacce del pod connesse alla rete specificata.

Servizio LoadBalancer interno

Per creare un bilanciatore del carico interno, aggiungi l'annotazione networking.gke.io/load-balancer-type: "Internal" al manifest del servizio. L'esempio seguente mostra un servizio che crea un bilanciatore del carico interno per indirizzare i pod sulla rete dmz:

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

Servizio LoadBalancer esterno

Per creare un bilanciatore del carico di rete esterno basato su un servizio di backend, aggiungi l'annotazione cloud.google.com/l4-rbs: enabled al manifest del servizio. L'esempio seguente mostra un servizio che crea un bilanciatore del carico esterno per i pod di destinazione sulla rete dmz:

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

Configurazione di pod e rete

I pod devono avere un'interfaccia nella rete a cui è destinato il servizio LoadBalancer. Devi anche configurare il routing all'interno del pod in modo che possa rispondere correttamente alle richieste sull'interfaccia di rete appropriata.

Puoi configurare il routing dei pod in uno dei seguenti modi:

  • Imposta un'interfaccia predefinita: utilizza l'annotazione networking.gke.io/default-interface sul pod per impostare l'interfaccia di rete secondaria come route predefinita.

  • Configura il routing basato su policy: utilizza un initContainer con la funzionalità NET_ADMIN per configurare le regole di routing all'interno del pod.

L'esempio seguente mostra un manifest Deployment per i pod con un'interfaccia sulla rete dmz. Il set di annotazioni networking.gke.io/default-interface imposta l'interfaccia dmz (eth1) come percorso predefinito.

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

Verifica degli endpoint multirete

GKE utilizza un controller dedicato, multinet-endpointslice-controller.gke.io, per gestire gli endpoint per i servizi multirete. Questo controller crea oggetti EndpointSlice per i tuoi servizi multirete. Gli indirizzi IP in questi oggetti EndpointSlice appartengono alla rete secondaria specificata nel selettore del servizio.

Se un bilanciatore del carico non ha backend integri, esamina EndpointSlice per il servizio per verificare che il controller abbia selezionato gli indirizzi IP dei pod corretti. Se EndpointSlice non ha endpoint, verifica che le etichette del selettore del servizio corrispondano ai pod in esecuzione e che il selettore networking.gke.io/network corrisponda alla rete dei pod.

Limitazioni

I servizi multi-rete LoadBalancer presentano le seguenti limitazioni:

  • I bilanciatori del carico interni richiedono l'impostazione secondaria di GKE.
  • I bilanciatori del carico basati su pool di destinazione o gruppi di istanze non sono supportati.
  • I servizi che utilizzano externalTrafficPolicy: Cluster non sono supportati.
  • I servizi non possono scegliere come target i pod hostNetwork.
  • Il networking IPv6 e dual stack non è supportato.
  • Non puoi modificare la rete di un servizio esistente.
  • Sono supportate solo le reti di livello 3.

Passaggi successivi