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

Questa guida fornisce istruzioni per creare una configurazione di un bilanciatore del carico di rete passthrough esterno con backend del pool di destinazione. L'esempio presuppone che tu abbia più server web sulle istanze di Compute Engine su cui vuoi bilanciare il traffico. Questo scenario imposta una configurazione di bilanciamento del carico di livello 4 per distribuire il traffico HTTP nelle istanze integre. I controlli di integrità HTTP di base sono configurati in modo da garantire che il traffico sia inviato solo a istanze integre.

Questo esempio bilancia il carico del traffico HTTP, ma puoi utilizzare bilanciatori del carico di rete passthrough esterni basati su pool di destinazione per bilanciare il carico del traffico TCP, UDP e SSL. Prima di iniziare, consulta la pagina Panoramica del bilanciatore del carico di rete passthrough esterno per informazioni concettuali sui bilanciatori del carico di rete passthrough esterni.

Prima di iniziare

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

Puoi anche ottenere una guida dettagliata per qualsiasi comando gcloud utilizzando il flag --help:

gcloud compute http-health-checks create --help

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

Inoltre, devi creare un indirizzo IP esterno statico per il bilanciatore del carico. Se utilizzi 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 conosca il bash.

Configurazione delle istanze VM di Compute Engine

Per questo scenario di bilanciamento del carico, dovrai creare tre istanze VM di Compute Engine e installare Apache su di esse. Aggiungerai una regola firewall che consente al traffico HTTP di raggiungere le istanze.

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

configura le istanze di backend

Console

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Fai clic su Crea istanza.

  3. Imposta Nome su www1.

  4. Imposta la Regione su us-central1.

  5. Imposta la Zona su us-central1-b.

  6. In Disco di avvio, è già selezionata l'immagine predefinita del sistema operativo Debian GNU/Linux 10 (buster).

  7. Fai clic su Opzioni avanzate.

  8. Fai clic su Networking e configura il seguente campo:

    1. In Tag di rete, inserisci network-lb-tag.
  9. Fai clic su Gestione. Inserisci lo script seguente nel campo 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>www1</h1></body></html>' | tee /var/www/html/index.html
     

    1. Fai clic su Crea.
  10. Crea un'istanza denominata www2 con le stesse impostazioni, ad eccezione del fatto che lo script seguente è inserito nel campo Automazione, 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
     

  11. Crea un'istanza denominata www3 con le stesse impostazioni, ad eccezione del fatto che lo script seguente è inserito nel campo Automazione, 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 seguenti vengono eseguiti tutti sul tuo sistema locale e presuppongono un prompt di comando bash.

Per visualizzare i nomi, gli attributi e lo 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. Questo esempio imposta la zona 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 ciascuna 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 metodo instances.insert

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 le istanze denominate www2 e www3 con le stesse impostazioni, ad eccezione della sostituzione di www1 nei campi deviceName, value e name.

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

Console

  1. Nella console Google Cloud, vai alla pagina Criteri firewall.

    Vai a Criteri firewall

  2. Fai clic su Crea regola firewall.

  3. Inserisci un Nome pari a www-firewall-network-lb.

  4. Seleziona la Rete a cui si applica la regola firewall (Predefinito).

  5. In Destinazioni, seleziona Tag di destinazione specificati.

  6. Nel campo Tag di destinazione, inserisci network-lb-tag.

  7. Imposta Filtro di origine su Intervalli IPv4.

  8. Imposta gli Intervalli IPv4 di origine su 0.0.0.0/0, in modo da consentire il traffico da qualsiasi origine.

  9. In Protocolli e porte specificati, seleziona la casella di controllo TCP e inserisci 80.

  10. Fai clic su Crea. Potrebbe essere necessario attendere un momento prima che nella console venga visualizzata la nuova regola firewall oppure potrebbe essere necessario 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 firewalls.insert metodo ****

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"
  ]
}

Recuperare gli indirizzi IP esterni delle istanze e verificare che siano in esecuzione

Console

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai a 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 Risoluzione dei problemi generali per le istanze.

gcloud

  1. Elenca le tue istanze per estrarne 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

Recupera informazioni sull'istanza www1 con il metodo instances.get 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

Quindi, 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 utilizzi un'immagine fornita da Compute Engine, le istanze vengono configurate automaticamente per gestire questo indirizzo IP. Se utilizzi qualsiasi altra immagine, dovrai configurare questo indirizzo come alias su eth0 o come loopback su ogni istanza.

Console

Non puoi utilizzare la console Google Cloud per creare bilanciatori del carico di rete passthrough esterni basati su pool di destinazione. Utilizza invece gcloud o l'API REST.

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 legacy di controllo di integrità HTTP

    Questo esempio utilizza le impostazioni predefinite per il meccanismo di controllo di integrità, ma puoi anche personalizzare il controllo 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. Usa il controllo di integrità creato nel passaggio precedente per questo pool di destinazione. Per funzionare, i pool di destinazione richiedono un servizio di controllo di integrità.

    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 regione, ma possono essere distribuite in zone diverse nella stessa regione. Ad esempio, puoi avere istanze nella zona us-central1-f e istanze nella zona us-central1-b in un pool di destinazione perché si trovano nella stessa regione, 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 pool di destinazione. Per il campo --address, utilizza l'indirizzo IP numerico o il 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 precedente

    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. Usa il controllo di integrità creato nel passaggio precedente per questo pool di destinazione. Per funzionare, i pool di destinazione richiedono un servizio di controllo di integrità.

    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 tue 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 regione, ma possono essere distribuite in zone diverse nella stessa regione. Ad esempio, puoi avere istanze nella zona us-central1-f e istanze nella zona us-central1-b in un pool di destinazione perché si trovano nella stessa regione, 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 la distribuzione del traffico su diverse istanze.

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

Console

  1. Vai alla scheda Regole di forwarding nella pagina Bilanciamento del carico Avanzate nella console Google Cloud.
    Vai alla scheda Regole di forwarding
  2. Individua www-rule, la regola di forwarding utilizzata dal bilanciatore del carico.
  3. Nella colonna Indirizzo IP per www-rule, prendi nota dell'indirizzo IP esterno elencato.

gcloud

Inserisci il seguente comando 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 con il metodo forwardingRules.get

Cerca il campo IPAddress nell'output.

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

I bilanciatori del carico di rete passthrough esterni non consegnano 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 Google Cloud potrebbe inviare una risposta ICMP anche se sono presenti regole firewall che proibiscono 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 inizialmente la risposta non è andata a buon fine, prima di riprovare potrebbe essere necessario attendere circa 30 secondi prima che la configurazione venga caricata completamente e le istanze siano contrassegnate come integre:

$ while true; do curl -m1 IP_ADDRESS; done

Passaggi successivi