Configura un bilanciatore del carico di rete con un pool di destinazione

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questa guida fornisce istruzioni per creare una configurazione di base di bilanciamento del carico di rete. L'esempio presuppone che tu abbia più server web su istanze Compute Engine in cui vuoi bilanciare il traffico. Questo scenario imposta una configurazione di bilanciamento del carico di livello 4 per distribuire il traffico HTTP tra le istanze integre. I controlli di integrità HTTP di base sono configurati per garantire che il traffico venga inviato solo alle istanze integre.

Questo esempio bilancia il traffico HTTP, ma puoi utilizzare Network Load Balancing per bilanciare il carico del traffico UDP, TCP e SSL. Prima di iniziare, leggi la panoramica del bilanciamento del carico di rete per informazioni concettuali su Network Load Balancing.

Prima di iniziare

Installa Google Cloud CLI. Per una panoramica completa dello strumento, consulta la guida dello strumento gcloud. Puoi trovare i comandi relativi al bilanciamento del carico nel gruppo di comandi gcloud compute.

Puoi anche ricevere assistenza dettagliata per qualsiasi comando gcloud utilizzando il flag --help:

gcloud compute http-health-checks create --help

Se non hai ancora eseguito Google Cloud CLI, esegui prima gcloud init per eseguire l'autenticazione.

Inoltre, devi creare un indirizzo IP esterno statico per il bilanciatore del carico. Se usi un'immagine fornita da Compute Engine, le istanze di macchine virtuali (VM) vengono configurate automaticamente per gestire questo indirizzo IP. Se utilizzi un'altra immagine, dovrai configurare questo indirizzo come alias su eth0 o come loopback su ogni istanza.

Questa guida presuppone che tu abbia familiarità con bash.

Configurazione delle istanze VM di Compute Engine

Per questo scenario di bilanciamento del carico, creerai tre istanze VM di Compute Engine e vi installerai Apache. Aggiungerai una regola firewall che consenta al traffico HTTP di raggiungere le istanze.

Le istanze che partecipano come VM di backend per bilanciatori del carico di rete devono eseguire l'ambiente guest Linux, l'ambiente guest Windows o altri processi che forniscono funzionalità equivalenti.

Configurazione delle istanze di backend

Console

  1. Vai alla pagina Istanze VM in Google Cloud Console.
    Vai alla pagina Istanze VM
  2. Fai clic su Crea istanza.
  3. Imposta il nome su www1.
  4. Imposta Area geografica su us-central1.
  5. Imposta la Zona su us-central1-b.
  6. In Disco di avvio, l'immagine predefinita del sistema operativo di Debian GNU/Linux 10 (buster) è già selezionata.
  7. Fai clic su Gestione, sicurezza, dischi, networking, single-tenancy per visualizzare le impostazioni avanzate.
    1. Nella scheda Management, inserisci il seguente script nel campo Startup script:
      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html
      
    2. In Networking, compila il campo Tag con network-lb-tag.
    3. Lascia i valori predefiniti per i restanti campi.
    4. Fai clic su Crea.
  8. Crea un'istanza denominata www2 con le stesse impostazioni, ad eccezione del seguente script inserito nel campo Automazione e Script di avvio.
    #! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html
    
  9. Crea un'istanza denominata www3 con le stesse impostazioni, ad eccezione del seguente script inserito nel campo Automazione e Script di avvio.
    #! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html
    

gcloud

I comandi riportati di seguito vengono eseguiti tutti sul tuo sistema locale e assumono un prompt del comando bash.

Per vedere nomi, attributi e stato delle immagini del sistema operativo, utilizza il comando gcloud compute images list.

  1. Creare tre nuove macchine virtuali in una determinata zona e assegnare loro lo stesso tag. In questo esempio la zona viene impostata su us-central1-b. L'impostazione del campo tags consente di fare riferimento a tutte queste istanze contemporaneamente, ad esempio con una regola firewall. Questi comandi installano anche Apache su ogni istanza e assegnano a ogni istanza una home page univoca.

    gcloud compute instances create www1 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www2 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www3 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"

api

Crea l'istanza www1 nella zona us-central1-b con il instances.insert metodo

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances

{
  "canIpForward": false,
  "deletionProtection": false,
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "mode": "READ_WRITE",
      "autoDelete": true,
      "deviceName": "www1",
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20220719",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "sudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo service apache2 restart\necho '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
      }
    ]
  },
  "name": "www1",
  "networkInterfaces": [
    {
      "network": "projects/[PROJECT_ID]/global/networks/default",
      "subnetwork": "projects/[PROJECT_ID]/regions/us-central1/subnetworks/default"
    }
  ],
  "tags": {
    "items": [
      "network-lb-tag"
    ]
  }
}

Crea istanze denominate www2 e www3 con le stesse impostazioni, ad eccezione di www1 nei campi deviceName, value e name.

Creazione di una regola firewall per consentire il traffico esterno verso queste istanze VM

Console

  1. Vai alla pagina Firewall in Google Cloud Console.
    Vai alla pagina Firewall
  2. Fai clic su Crea regola firewall.
  3. Inserisci un Nome di www-firewall-network-lb.
  4. Seleziona la Rete a cui si applica la regola firewall (valore predefinito).
  5. In Target, seleziona Tag target specificati.
  6. Nel campo Tag di destinazione, inserisci network-lb-tag.
  7. Imposta il Filtro di origine su Intervalli IPv4.
  8. Imposta gli intervalli IPv4 di origine su 0.0.0.0/0, che consente il traffico da qualsiasi origine.
  9. In Protocolli e porte specificati, fai clic sulla casella di controllo accanto a TCP e inserisci 80.
  10. Fai clic su Crea. La visualizzazione della nuova regola firewall potrebbe richiedere qualche istante. In alternativa, potresti dover fare clic su Aggiorna per visualizzare la regola.

gcloud

gcloud compute firewall-rules create www-firewall-network-lb \
    --target-tags network-lb-tag --allow tcp:80

api

Crea una regola firewall che consenta tutto il traffico all'interno della subnet con il metodo firewalls.insert ****

POST https://compute.googleapis.com/compute/projects/[PROJECT_ID]/global/firewalls

{
  "name": "www-firewall-network-lb",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [
    "network-lb-tag"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    }
  ],
  "sourceRanges": [
    "0.0.0.0/0"
  ]
}

Recupera gli indirizzi IP esterni delle istanze e verifica che siano in esecuzione

Console

  1. Vai alla pagina Istanze VM in Google Cloud Console.
    Vai alla pagina Istanze VM
  2. Visualizza gli indirizzi delle istanze nella colonna IP esterno.
  3. Verifica che le istanze siano in esecuzione cercando un segno di spunta verde a sinistra del nome dell'istanza. Se non vedi un segno di spunta verde, consulta la pagina per la risoluzione dei problemi generali per le istanze.

gcloud

  1. Elenca le tue istanze per recuperare gli indirizzi IP dalla colonna EXTERNAL_IP.

    gcloud compute instances list
    
  2. Verifica che ogni istanza sia in esecuzione.

    Nella riga di comando, esegui curl utilizzando l'indirizzo IP esterno di ogni istanza per confermare che tutte le istanze rispondano.

    curl http://[IP_ADDRESS]
    

api

Ottieni informazioni sull'istanza www1 con il metodo instances.get

Assicurati che il campo status indichi RUNNING e cerca l'indirizzo IP esterno nel campo natIP.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1

{
 "kind": "compute#instance",
 "id": "6734015273571474749",
 "creationTimestamp": "2018-11-09T11:45:23.487-08:00",
 "name": "www1",
 "description": "",
 "tags": {
  "items": [
   "network-lb-tag"
  ],
  "fingerprint": "9GVlO4gPawg="
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
 "status": "RUNNING",
 "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b",
 "canIpForward": false,
 "networkInterfaces": [
  {
   "kind": "compute#networkInterface",
   "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default",
   "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/subnetworks/default",
   "networkIP": "10.128.0.2",
   "name": "nic0",
   "accessConfigs": [
    {
     "kind": "compute#accessConfig",
     "type": "ONE_TO_ONE_NAT",
     "name": "External NAT",
     "natIP": "35.192.37.233",
     "networkTier": "PREMIUM"
    }
   ],
   "fingerprint": "lxD5f5ua_sw="
  }
 ],
 "disks": [
  {
   "kind": "compute#attachedDisk",
   "type": "PERSISTENT",
   "mode": "READ_WRITE",
   "source": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks/www1",
   "deviceName": "www1",
   "index": 0,
   "boot": true,
   "autoDelete": true,
   "licenses": [
    "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-10-buster"
   ],
   "interface": "SCSI",
   "guestOsFeatures": [
    {
     "type": "VIRTIO_SCSI_MULTIQUEUE"
    }
   ]
  }
 ],
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "IyHRmHoJx6E=",
  "items": [
   {
    "key": "startup-script",
    "value": "#! /bin/bash\n sudo apt-get update\n sudo apt-get install apache2 -y\n sudo service apache2 restart\n echo '\u003c!doctype html\u003e\u003chtml\u003e\u003cbody\u003e\u003ch1\u003ewww1\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e' | tee /var/www/html/index.html"
   }
  ]
 },
 "serviceAccounts": [
  {
   "email": "674259759219-compute@developer.gserviceaccount.com",
   "scopes": [
    "https://www.googleapis.com/auth/devstorage.read_only",
    "https://www.googleapis.com/auth/logging.write",
    "https://www.googleapis.com/auth/monitoring.write",
    "https://www.googleapis.com/auth/servicecontrol",
    "https://www.googleapis.com/auth/service.management.readonly",
    "https://www.googleapis.com/auth/trace.append"
   ]
  }
 ],
 "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1",
 "scheduling": {
  "onHostMaintenance": "MIGRATE",
  "automaticRestart": true,
  "preemptible": false
 },
 "cpuPlatform": "Intel Haswell",
 "labelFingerprint": "42WmSpB8rSM=",
 "startRestricted": false,
 "deletionProtection": false
}

Ripeti questa chiamata API per www2 e www3.

Configurazione del servizio di bilanciamento del carico

Successivamente, configura il servizio di bilanciamento del carico.

Quando configuri il servizio di bilanciamento del carico, le istanze di macchine virtuali riceveranno i pacchetti destinati all'indirizzo IP esterno statico configurato. Se usi un'immagine fornita da Compute Engine, le tue istanze vengono configurate automaticamente per gestire questo indirizzo IP. Se utilizzi un'altra immagine, devi configurare questo indirizzo come alias su eth0 o come loopback su ogni istanza.

Console

  1. Vai alla pagina Crea un bilanciatore del carico in Google Cloud Console.
    Vai alla pagina Crea un bilanciatore del carico
  2. In Bilanciamento del carico TCP, fai clic sul pulsante Avvia configurazione.

  3. In Solo per Internet o interno, seleziona Da Internet alle mie VM.

  4. In Più aree geografiche o singole aree geografiche, seleziona Solo singola area geografica.

  5. In Tipo di backend, seleziona Pool di destinazione o Istanza di destinazione.

  6. Fai clic su Continua.

Configura il backend

  1. Nella schermata Nuovo bilanciatore del carico TCP, inserisci un Nome di www-network-lb per il nuovo bilanciatore del carico.
  2. Fai clic su Configurazione backend
  3. Il Nome del bilanciatore del carico che hai inserito in precedenza viene visualizzato, ma non è modificabile.
  4. In Area geografica seleziona us-central1.
  5. In Backend, fai clic sulla scheda Seleziona istanze esistenti e fai clic su Aggiungi un'istanza. Inserisci l'istanza www1. Ripeti questo passaggio per le istanze www2 e www3.
  6. In Controllo di integrità, fai clic su Crea un nuovo controllo di integrità o Crea un altro controllo di integrità:

    1. Inserisci basic-check come Nome del controllo di integrità.
    2. Mantieni le impostazioni predefinite.
    3. Fai clic sul pulsante Salva e continua.

    Un cerchio blu con un segno di spunta a sinistra di Configurazione backend indica una configurazione riuscita.

Configura la regola di forwarding

  1. Fai clic su Configurazione frontend.
  2. Inserisci un Nome di www-rule.
  3. In Indirizzo IP, fai clic sul menu a discesa e seleziona Crea indirizzo IP.
    1. Nella schermata Prenota un nuovo indirizzo IP statico, assegna un Nome di lb-ip-1.
    2. Fai clic su Prenota.
  4. Inserisci un Port (Porta) su 80.
  5. Fai clic sul pulsante Fine.

    Un cerchio blu con un segno di spunta a sinistra di Configurazione frontend indica una configurazione riuscita.

Rivedi la configurazione

  1. Fai clic sul pulsante Esamina e finalizza per controllare tutte le impostazioni di configurazione per il bilanciatore del carico.
  2. Se le impostazioni sono corrette, fai clic su Crea. La creazione del bilanciatore del carico richiede alcuni minuti.

    Nella schermata di bilanciamento del carico, nella colonna Backend per il nuovo bilanciatore del carico, vedrai un segno di spunta verde che indica che il nuovo bilanciatore del carico è in stato integro.

gcloud

  1. Crea un indirizzo IP esterno statico per il bilanciatore del carico

    gcloud compute addresses create network-lb-ip-1 \
        --region us-central1
    
  2. Aggiungi una risorsa di controllo di integrità HTTP legacy

    Questo esempio utilizza le impostazioni predefinite per il meccanismo di controllo di integrità, ma puoi anche personalizzarlo autonomamente.

    gcloud compute http-health-checks create basic-check
    
  3. Aggiungi un pool di destinazione

    Aggiungi un pool di destinazione nella stessa regione delle istanze di macchine virtuali. Utilizza il controllo di integrità creato nel passaggio precedente per questo pool di destinazione. I pool di destinazione richiedono un servizio di controllo di integrità per funzionare.

    gcloud compute target-pools create www-pool \
        --region us-central1 --http-health-check basic-check
    
  4. Aggiungi le tue istanze al pool di destinazione

    gcloud compute target-pools add-instances www-pool \
        --instances www1,www2,www3 \
        --instances-zone us-central1-b
    

    Le istanze all'interno di un pool di destinazione devono appartenere alla stessa area geografica, ma possono essere distribuite in zone diverse della stessa area geografica. Ad esempio, puoi avere istanze nella zona us-central1-f e le istanze nella zona us-central1-b in un pool di destinazione perché si trovano nella stessa area geografica, us-central1.

  5. Aggiungi una regola di forwarding

    Aggiungi una regola di forwarding che pubblica per conto di un indirizzo IP esterno e di un intervallo di porte che punta al tuo pool di destinazione. Nel campo --address, utilizza l'indirizzo IP numerico o il suo nome completo.

    gcloud compute forwarding-rules create www-rule \
        --region us-central1 \
        --ports 80 \
        --address network-lb-ip-1 \
        --target-pool www-pool
    

api

  1. Crea un indirizzo IP esterno statico per il bilanciatore del carico

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. Aggiungi un controllo di integrità HTTP legacy

    Questo esempio utilizza le impostazioni predefinite per il meccanismo di controllo di integrità, ma puoi anche personalizzarlo autonomamente.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks
    {
      "name": "basic-check"
    }
    
  3. Aggiungi un pool di destinazione

    Aggiungi un pool di destinazione nella stessa regione delle istanze di macchine virtuali. Utilizza il controllo di integrità creato nel passaggio precedente per questo pool di destinazione. I pool di destinazione richiedono un servizio di controllo di integrità per funzionare.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools
    {
      "name": "www-pool",
      "healthChecks": [
        "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/basic-check"
      ]
    }
    
  4. Aggiungi le istanze al pool di destinazione

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance
    {
      "instances": [
        {
          "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1"
        }
      ]
    }
    

    Ripeti questa chiamata API per le istanze www2 e www3.

    Le istanze all'interno di un pool di destinazione devono appartenere alla stessa area geografica, ma possono essere distribuite in zone diverse della stessa area geografica. Ad esempio, puoi avere istanze nella zona us-central1-f e le istanze nella zona us-central1-b in un pool di destinazione perché si trovano nella stessa area geografica, us-central1.

  5. Aggiungi una regola di inoltro

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules
    {
      "name": "www-rule",
      "portRange": "80",
      "loadBalancingScheme": "EXTERNAL",
      "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb"
    }
    

Invio del traffico alle istanze

Ora che il servizio di bilanciamento del carico è configurato, puoi iniziare a inviare traffico alla regola di forwarding e osservare che il traffico sia distribuito in istanze diverse.

Ricerca dell'indirizzo IP esterno della regola di forwarding in corso

Console

  1. Vai alla scheda Regole di forwarding nella pagina Bilanciamento del carico avanzato di Google Cloud Console.
    Vai alla scheda Regole di forwarding
  2. Individua www-rule, la regola di forwarding utilizzata dal bilanciatore del carico.
  3. Nella colonna Indirizzo IP di www-rule, indica l'indirizzo IP esterno elencato.

gcloud

Inserisci il comando seguente per visualizzare l'indirizzo IP esterno della regola di forwarding www-rule utilizzata dal bilanciatore del carico.

gcloud compute forwarding-rules describe www-rule --region us-central1

api

Visualizza l'indirizzo IP esterno della regola di forwarding www-rule utilizzando il forwardingRules.get metodo

Nell'output, cerca il campo IPAddress.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule
{
  "kind": "compute#forwardingRule",
  "id": "5133886346582800002",
  "creationTimestamp": "2018-11-09T14:21:33.574-08:00",
  "name": "www-rule",
  "description": "",
  "region": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1",
  "IPAddress": "35.232.228.9",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule",
  "loadBalancingScheme": "EXTERNAL",
  "networkTier": "PREMIUM"
}

ICMP non supportato per le istanze di backend

Il bilanciamento del carico di rete non fornisce pacchetti ICMP alle istanze di backend. Se invii un pacchetto ICMP, ad esempio con ping o traceroute, la risposta non proviene dalle istanze di backend del bilanciatore del carico.

L'infrastruttura di Google Cloud potrebbe inviare una risposta ICMP, anche se disponi di regole firewall che vietano il traffico ICMP sulle istanze di backend del bilanciatore del carico. Questo comportamento non può essere modificato.

Utilizzo del comando curl per accedere all'indirizzo IP esterno

La risposta del comando curl si alterna in modo casuale tra le tre istanze. Se la risposta iniziale non va a buon fine, potrebbe essere necessario attendere circa 30 secondi per il caricamento completo della configurazione e l'integrità delle istanze prima di riprovare:

$ while true; do curl -m1 IP_ADDRESS; done

Passaggi successivi