Configura un bilanciatore del carico di rete passthrough esterno globale con backend NEG di zona

Questo documento mostra come creare un bilanciatore del carico di rete passthrough esterno globale per bilanciare il traffico tra i backend NEG zonali di cui è stato eseguito il deployment in più regioni.

Prima di iniziare

Assicurati che la tua configurazione soddisfi i seguenti prerequisiti.

Installa Google Cloud CLI

Le istruzioni di questa guida utilizzano Google Cloud CLI per configurare un bilanciatore del carico di rete passthrough esterno globale. Per installarla, vedi Installa gcloud CLI.

Ruoli obbligatori

Se hai creato il progetto, ti viene concesso il ruolo Proprietario (roles/owner). Per impostazione predefinita, il ruolo Proprietario (roles/owner) o il ruolo Editor (roles/editor) include le autorizzazioni necessarie per seguire questo documento.

Se non sei il creatore del progetto, le autorizzazioni richieste devono essere concesse al principal appropriato. Ad esempio, un'entità può essere un Account Google (per gli utenti finali) o un service account.

Per ottenere le autorizzazioni necessarie per configurare un bilanciatore del carico di rete pass-through esterno globale con backend di gruppi di istanze VM, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:

Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Per saperne di più su ruoli e autorizzazioni per Cloud Load Balancing, consulta Ruoli e autorizzazioni. Per saperne di più sulla definizione delle policy IAM con concessioni condizionali per le regole di forwarding, consulta Condizioni IAM per le regole di forwarding.

Panoramica della configurazione

Il seguente diagramma mostra un bilanciatore del carico di rete passthrough esterno globale con backend NEG zonali di cui è stato eseguito il deployment nelle regioni us-west1 e europe-west2. Per capire come funziona un bilanciatore del carico di rete passthrough esterno globale, consulta la sezione Architettura nella guida alla panoramica.

In questo esempio, sono configurati i seguenti componenti:

  • Quattro VM di backend:

    • vm-us-1 e vm-us-2 in zona us-west1-a
    • vm-eu-1 e vm-eu-2 in zona europe-west2-a
  • Due NEG di zona con GCE_VM_IP endpoint:

    • Collega nic0 di vm-us-1 e vm-us-2 al NEG nella zona us-west1-a
    • Collega nic0 di vm-eu-1 e vm-eu-2 al NEG nella zona europe-west2-a
  • Un singolo bilanciatore del carico di rete passthrough esterno globale per bilanciare il traffico TCP:80 tra i quattro endpoint di rete.

Un bilanciatore del carico di rete passthrough esterno globale invia il traffico ai backend NEG di zona
    di cui è stato eseguito il deployment nelle regioni `us-west1` ed `europe-west2`.
Distribuzione del traffico ai backend NEG di zona utilizzando un bilanciatore del carico di rete passthrough esterno globale (fai clic per ingrandire).

Configura la rete e le subnet

L'esempio utilizza una rete VPC in modalità personalizzata denominata lb-network con subnet in due regioni diverse.

Puoi configurare un bilanciatore del carico di rete passthrough esterno globale in modo che abbia endpoint di rete GCE_VM_IP che possono fare riferimento all'interfaccia di rete di una VM il cui tipo di stack può essere solo IPv4 o dual-stack.

La tabella seguente riepiloga la compatibilità tra i tipi di traffico del bilanciatore del carico, le interfacce di rete delle VM di backend e i tipi di stack delle subnet VPC. Assicurati di avere familiarità con i requisiti di compatibilità dell'interfaccia di rete della VM di backend con le subnet VPC descritti nella guida all'architettura del bilanciatore del carico di rete passthrough esterno globale.

Tipo di traffico del bilanciatore del carico Tipo di stack dell'interfaccia di rete della VM di backend Tipo di stack della subnet VPC
Solo traffico IPv4 IPV4_ONLY IPV4_ONLY o IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
Solo traffico IPv6 IPV6_ONLY IPV6_ONLY o IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
Traffico IPv4 e IPv6 IPV4_IPV6 IPV4_IPV6

gcloud

  1. Crea la rete VPC. In questo esempio, la rete VPC si chiama lb-network.

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. All'interno della rete VPC (lb-network), crea subnet in due regioni.

    Crea una subnet denominata lb-subnet-us per gli endpoint di rete nella regione us-west1.

    Per creare una subnet solo IPv4, utilizza il seguente comando:

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV4_ONLY \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

    Per creare una subnet dual-stack, utilizza il seguente comando:

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

    Crea una subnet denominata lb-subnet-eu per gli endpoint di rete nella regione europe-west2.

    Solo per il traffico IPv4, utilizza il seguente comando per creare una subnet solo IPv4:

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV4_ONLY \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

    Per il traffico IPv4 e IPv6, utilizza il seguente comando per creare una subnet dual-stack:

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

Crea regole firewall

Per configurare in modo sicuro l'ambiente di produzione, devi creare due regole firewall separate:

  • Regola firewall per il controllo di integrità, configurata per consentire il traffico in entrata da:

  • Regola firewall per il traffico utente, configurata per consentire il traffico in entrata da:

    • gli intervalli IP di origine client specifici che devono accedere al bilanciatore del carico e
    • il protocollo IP e le porte configurati nelle regole di forwarding

Tieni presente quanto segue:

  • Se la tua applicazione serve tutti gli utenti di internet senza alcuna limitazione, configura gli intervalli IP di origine 0.0.0.0/0 per il traffico IPv4 e ::/0 per il traffico IPv6.

  • Se hai configurato il controllo di integrità per eseguire il probe del protocollo e delle porte IP del bilanciamento del carico, puoi configurare una singola regola firewall unendo le regole firewall per il controllo di integrità e il traffico utente.

gcloud

  • Crea una regola firewall che consenta al traffico TCP da tutti gli intervalli di origine di raggiungere le istanze VM di backend sulla porta 80. Questa porta e questo protocollo vengono utilizzati sia per il bilanciamento del carico che per il controllo di integrità.

    • Per consentire tutto il traffico IPv4, esegui questo comando:

      gcloud compute firewall-rules create firewall-allow-traffic-ipv4 \
          --network=lb-network \
          --target-tags=allow-traffic \
          --allow=tcp:80 \
          --source-ranges=0.0.0.0/0
      
    • Per consentire tutto il traffico IPv6, esegui questo comando:

      gcloud compute firewall-rules create firewall-allow-traffic-ipv6 \
          --network=lb-network \
          --target-tags=allow-traffic \
          --allow=tcp:80 \
          --source-ranges=::/0
      

Crea VM di backend

Per questo esempio di bilanciamento del carico, crea quattro VM come evidenziato nella sezione Panoramica della configurazione.

In questo esempio, l'interfaccia nic0 della VM è associata alla rete VPC lb-network e a una delle subnet, ovvero lb-subnet-us o lb-subnet-eu. L'interfaccia di rete a cui fa riferimento l'endpoint GCE_VM_IP deve trovarsi nella stessa subnet VPC associata al NEG di zona.

La tabella seguente riepiloga la compatibilità tra i tipi di traffico del bilanciatore del carico, le interfacce di rete delle VM di backend e i tipi di stack delle subnet VPC. Assicurati di avere familiarità con i requisiti di compatibilità dell'interfaccia di rete della VM di backend con le subnet VPC descritti nella guida all'architettura del bilanciatore del carico di rete passthrough esterno globale.

Tipo di traffico del bilanciatore del carico Tipo di stack dell'interfaccia di rete della VM di backend Tipo di stack della subnet VPC
Solo traffico IPv4 IPV4_ONLY IPV4_ONLY o IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
Solo traffico IPv6 IPV6_ONLY IPV6_ONLY o IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
Traffico IPv4 e IPv6 IPV4_IPV6 IPV4_IPV6

gcloud

Crea le quattro VM eseguendo il comando gcloud compute instances create quattro volte, utilizzando le seguenti quattro combinazioni per VM_NAME, REGION, ZONE e SUBNET. Lo script Bash è identico per tutte e quattro le VM.

VM_NAME REGION ZONE SUBNET
vm-us-1 us-west1 us-west1-a lb-subnet-us
vm-us-2 us-west1 us-west1-a lb-subnet-us
vm-eu-1 europe-west2 europe-west2-a lb-subnet-eu
vm-eu-2 europe-west2 europe-west2-a lb-subnet-eu

Per creare VM di backend con interfacce di rete solo IPv4, utilizza il seguente comando.

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-traffic \
    --network-interface=network=lb-network,subnet=SUBNET,stack-type=IPV4_ONLY \
    --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

Per creare VM di backend con interfacce di rete dual stack, utilizza il seguente comando.

gcloud compute instances create VM_NAME \
    --zone=ZONE \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --tags=allow-traffic \
    --network-interface=network=lb-network,subnet=SUBNET,stack-type=IPV4_IPV6,ipv6-network-tier=PREMIUM \
    --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

Crea NEG a livello di zona con endpoint GCE_VM_IP

Per questo esempio di bilanciamento del carico, crea due NEG zonali con endpoint GCE_VM_IP.

  • NEG a livello di zona neg-us nella zona us-west1-a. Il NEG zonale è composto da due endpoint di rete:
    • Collega nic0 di vm-us-1 e vm-us-2 al NEG a livello di zona neg-us
  • NEG a livello di zona neg-eu in europe-west2-a. Il NEG zonale è composto da due endpoint di rete:
    • Collega nic0 di vm-eu-1 e vm-eu-2 al NEG a livello di zona neg-eu

Quando crei un nuovo NEG zonale con endpoint GCE_VM_IP, devi associare esplicitamente il NEG a una subnet VPC prima di poter aggiungere endpoint al NEG. Il bilanciatore del carico invia i pacchetti all'interfaccia di rete che si trova nella subnet VPC associata al NEG. In questo esempio, gli endpoint del NEG di zona punteranno a nic0 delle VM.

gcloud

  1. Crea un NEG di zona GCE_VM_IP denominato neg-us nella zona us-west1-a.

    gcloud compute network-endpoint-groups create neg-us \
        --network-endpoint-type=gce-vm-ip \
        --zone=us-west1-a \
        --network=lb-network \
        --subnet=lb-subnet-us
    
  2. Aggiungi endpoint al NEG zonale neg-us.

    gcloud compute network-endpoint-groups update neg-us \
        --zone=us-west1-a \
        --add-endpoint='instance=vm-us-1' \
        --add-endpoint='instance=vm-us-2'
    
  3. Crea un NEG di zona GCE_VM_IP denominato neg-eu nella zona europe-west2-a.

    gcloud compute network-endpoint-groups create neg-eu \
        --network-endpoint-type=gce-vm-ip \
        --zone=europe-west2-a \
        --network=lb-network \
        --subnet=lb-subnet-eu
    
  4. Aggiungi endpoint al NEG zonale neg-eu.

    gcloud compute network-endpoint-groups update neg-eu \
        --zone=europe-west2-a \
        --add-endpoint='instance=vm-eu-1' \
        --add-endpoint='instance=vm-eu-2'
    

Prenota indirizzi IP esterni globali

Un bilanciatore del carico di rete passthrough esterno globale richiede due indirizzi IP esterni globali, uno per ogni gruppo di disponibilità. Questi due indirizzi IP vengono poi collegati alla regola di forwarding del bilanciatore del carico.

Per un bilanciatore del carico di rete passthrough esterno globale, gli indirizzi IP della regola di forwarding sono completamente disaccoppiati dalle subnet VPC. Gli indirizzi IP appartengono a pool di indirizzi IP esterni globali di proprietà di Google o a prefissi delegati pubblici IPv4 esterni globali di gruppi di disponibilità distinti e non sono associati ad alcuna subnet VPC.

Quando configuri una regola di forwarding IPv6, gli indirizzi IP della regola di forwarding vengono allocati come prefissi /96.

gcloud

Per il traffico IPv4:

  1. Prenota il primo indirizzo IP esterno globale denominato lb-ipv4-ag0 nel gruppo di disponibilità 0.

    gcloud beta compute addresses create lb-ipv4-ag0 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \
        --ip-version=IPV4
    
  2. Prenota il secondo indirizzo IP esterno globale lb-ipv4-ag1 nel gruppo di disponibilità 1.

    gcloud beta compute addresses create lb-ipv4-ag1 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \
        --ip-version=IPV4
    

Per il traffico IPv6:

  1. Prenota il primo indirizzo IP esterno globale denominato lb-ipv6-ag0 nel gruppo di disponibilità 0.

    gcloud beta compute addresses create lb-ipv6-ag0 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \
        --ip-version=IPV6
    
  2. Prenota il secondo indirizzo IP esterno globale lb-ipv6-ag1 nel gruppo di disponibilità 1.

    gcloud beta compute addresses create lb-ipv6-ag1 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \
        --ip-version=IPV6
    

Configura il bilanciatore del carico

La configurazione di un bilanciatore del carico di rete passthrough esterno globale prevede la creazione di un controllo di integrità, un servizio di backend e una regola di forwarding.

gcloud

  1. Crea un controllo di integrità TCP configurato per generare probe TCP:80

    gcloud compute health-checks create tcp hc-tcp-80 \
      --global \
      --port=80
    
  2. Crea un servizio di backend globale con lo schema di bilanciamento del carico EXTERNAL_PASSTHROUGH.

    gcloud beta compute backend-services create lb-backend-service \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --health-checks=hc-tcp-80 \
      --global
    
  3. Aggiungi i NEG di zona come backend al servizio di backend.

    Aggiungi il NEG zonale nella zona us-west1-a al servizio di backend.

    gcloud beta compute backend-services add-backend lb-backend-service \
        --network-endpoint-group=neg-us \
        --network-endpoint-group-zone=us-west1-a \
        --balancing-mode=RATE \
        --max-rate-per-endpoint=100000 \
        --global
    

    Aggiungi il NEG zonale nella zona europe-west2-a al servizio di backend.

    gcloud beta compute backend-services add-backend lb-backend-service \
        --network-endpoint-group=neg-eu \
        --network-endpoint-group-zone=europe-west2-a \
        --balancing-mode=RATE \
        --max-rate-per-endpoint=100000 \
        --global
    
  4. Crea una regola di forwarding globale per gestire il traffico TCP:80. Devi creare due regole di forwarding per gestire il traffico IPv4 e IPv6.

    Assicurati che la versione IP della regola di forwarding corrisponda al tipo di stack delle interfacce di rete VM di backend.

    La regola di forwarding fa riferimento agli indirizzi IP di ogni gruppo di disponibilità.

    Per il traffico IPv4:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-ipv4 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=lb-backend-service \
      --global \
      --ip-addresses=lb-ipv4-ag0,lb-ipv4-ag1
    

    Per il traffico IPv6:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-ipv6 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=lb-backend-service \
      --global \
      --ip-addresses=lb-ipv6-ag0,lb-ipv6-ag1
    

testa il bilanciatore del carico

  1. Ottieni gli indirizzi IP prenotati collegati alla regola di forwarding.

      gcloud beta compute forwarding-rules describe lb-forwarding-rule-ipv4 \
          --global
    

    Vengono restituiti due indirizzi IP, uno per ogni gruppo di disponibilità. Questi indirizzi IP sono denominati IP_ADDRESS_AVAILABILITY_GROUP_0 e IP_ADDRESS_AVAILABILITY_GROUP_1.

  2. Inviare traffico a uno dei due indirizzi IP.

      curl http://IP_ADDRESS_AVAILABILITY_GROUP_0
    
      curl http://IP_ADDRESS_AVAILABILITY_GROUP_1
    

Dovresti vedere le risposte delle VM di backend in regioni diverse a seconda della tua posizione e dell'integrità del backend.

Controlla la tabella di routing locale per gli indirizzi IP del bilanciatore del carico

Le tabelle di routing locali delle VM di backend contengono gli indirizzi IP del bilanciatore del carico di rete passthrough esterno globale.

Per controllare le route locali sulla VM di backend, connettiti alla VM di backend utilizzando SSH ed esegui questo comando:

  ip route list table local

L'output è il seguente:

local 10.1.2.5 dev ens4 proto kernel scope host src 10.1.2.5
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 136.124.69.214 dev ens4 proto 66 scope host
local 136.124.83.205 dev ens4 proto 66 scope host

Nell'esempio precedente, 136.124.69.214 e 136.124.83.205 sono gli indirizzi IP assegnati alla regola di forwarding del bilanciatore del carico. Le voci di riga local 136.124.69.214 dev ens4 proto 66 scope host e local 136.124.83.205 dev ens4 proto 66 scope host nella tabella di routing locale della VM consentono ai pacchetti indirizzati agli indirizzi IP del bilanciatore del carico di essere accettati dal backend. L' Cloud de Confiance ambiente guest è responsabile dell'aggiunta di questa voce.

La voce della tabella di routing locale nella VM di backend accetta il pacchetto per la consegna all'host locale, dove lo stack di rete lo consegna all'applicazione in ascolto. I pacchetti di risposta dell'applicazione vengono quindi inviati direttamente al client.

Tieni presente che l'indirizzo IP del bilanciatore del carico non è effettivamente configurato sull'interfaccia di rete della VM. Per verificarlo, esegui questo comando:

  ip addr list

L'output è il seguente. Gli indirizzi IP (136.124.69.214 e 136.124.83.205) vengono visualizzati nella tabella di routing locale, ma non sono configurati nell'interfaccia di rete.

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens4:  mtu 1460 qdisc fq_codel state UP group default qlen 1000
    link/ether 42:01:0a:01:02:0d brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    inet 10.1.2.13/32 metric 100 scope global dynamic ens4
       valid_lft 84283sec preferred_lft 84283sec
    inet6 fe80::4001:aff:fe01:20d/64 scope link
       valid_lft forever preferred_lft forever

Passaggi successivi