Questa guida fornisce le istruzioni per la creazione di una configurazione di base del bilanciamento del carico di rete. L'esempio presuppone che tu abbia più server web sulle istanze di 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 a istanze integre.
Questo esempio bilancia il traffico HTTP, ma puoi utilizzare Network Load Balancing per bilanciare il carico UDP, TCP e SSL. Prima di iniziare, consulta Panoramica del bilanciamento del carico di rete per informazioni concettuali sul bilanciamento del carico di rete.
Prima di iniziare
Installa l'interfaccia a riga di comando di Google Cloud. 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
.
Per ricevere assistenza dettagliata su qualsiasi comando gcloud
, utilizza il flag --help
:
gcloud compute http-health-checks create --help
Se non hai mai eseguito l'interfaccia a riga di comando di Google Cloud, esegui prima gcloud init
per autenticarti.
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 in ogni istanza.
Questa guida presuppone che tu conosca la bash.
Configurazione delle istanze VM di Compute Engine in corso...
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 i 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
- Vai alla pagina Istanze VM in Google Cloud Console.
Vai alla pagina Istanze VM - Fai clic su Crea istanza.
- Imposta Nome su
www1
. - Imposta Area geografica su us-central1.
- Imposta la Zona su us-central1-b.
- In Disco di avvio, l'immagine predefinita del sistema operativo di
Debian GNU/Linux 9 (stretch)
è già selezionata. - Fai clic su Gestione, sicurezza, dischi, networking, single-tenancy
per visualizzare le impostazioni avanzate.
- Nella scheda Gestione, inserisci il seguente
script 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
- In Networking, compila il campo Tag con
network-lb-tag
. - Lascia i valori predefiniti per gli altri campi.
- Fai clic su Crea.
- Nella scheda Gestione, inserisci il seguente
script nel campo Script di avvio:
- Crea un'istanza denominata
www2
con le stesse impostazioni, tranne per il 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
- Crea un'istanza denominata
www3
con le stesse impostazioni, tranne per il 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 seguenti sono tutti in esecuzione sul tuo sistema locale e presuppongono un prompt dei comandi bash
.
Per visualizzare nomi, attributi e stato delle immagini del sistema operativo, utilizza il comando gcloud compute images list
.
Crea tre nuove macchine virtuali in una determinata zona e assegna lo stesso tag a tutte e tre. In questo esempio la zona viene impostata su us-central1-b. L'impostazione del campo
tags
ti 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-9 \ --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-9 \ --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-9 \ --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 metodowww1
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/eip-images/global/images/debian-9-drawfork-v20181101", "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 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 a queste istanze VM
Console
- Vai alla pagina Firewall in Google Cloud Console.
Vai alla pagina Firewall - Fai clic su Crea regola firewall.
- Inserisci un Nome di
www-firewall-network-lb
. - Seleziona la Rete a cui si applica la regola firewall (Impostazione predefinita).
- In Target, seleziona Tag di destinazione specificati.
- Nel campo Tag di destinazione, inserisci
network-lb-tag
. - Imposta il filtro sorgente su Intervalli IPv4.
- Imposta gli intervalli IPv4 di origine su
0.0.0.0/0
, che consente il traffico da qualsiasi origine. - In Protocolli e porte specificati, fai clic sulla casella di controllo accanto a TCP e inserisci
80
. - Fai clic su Crea. Potrebbe essere necessario qualche minuto prima che la console visualizzi la nuova regola firewall oppure 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" ] }
Recupero degli indirizzi IP esterni delle istanze e verifica che siano in esecuzione
Console
- Vai alla pagina Istanze VM in Google Cloud Console.
Vai alla pagina Istanze VM - Visualizza gli indirizzi delle istanze nella colonna IP esterno.
- Verifica che le istanze siano in esecuzione cercando un segno di spunta verde a sinistra del nome dell'istanza. Se non viene visualizzato un segno di spunta verde, consulta la pagina Risolvere i problemi generali per le istanze.
gcloud
Elenca le tue istanze per recuperare i relativi indirizzi IP dalla colonna
EXTERNAL_IP
.gcloud compute instances list
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 le informazioni sull'istanza www1
con
instances.get
method
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-9-stretch" ], "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 automaticamente configurate per gestire questo indirizzo IP. Se utilizzi un'altra immagine, dovrai configurare questo indirizzo come un alias su eth0 o come loopback in ogni istanza.
Console
- Vai alla pagina Crea un bilanciatore del carico in Google Cloud Console.
Vai alla pagina Crea un bilanciatore del carico In Bilanciamento del carico TCP, fai clic sul pulsante Avvia configurazione.
In Solo per Internet o interno, seleziona Da Internet alle mie VM.
Per Più aree geografiche o una sola area geografica, seleziona Solo area geografica.
In Tipo di backend, seleziona Pool di destinazione o Istanza di destinazione.
Fai clic su Continua.
Configura il backend
- Nella schermata Nuovo bilanciatore del carico TCP, inserisci un Nome
www-network-lb
per il nuovo bilanciatore del carico. - Fai clic su Configurazione backend
- Il Nome del bilanciatore del carico che hai inserito in precedenza viene visualizzato, ma non è modificabile.
- Per Area geografica seleziona
us-central1
. - 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 istanzewww2
ewww3
. In Controllo di integrità, fai clic su Crea un nuovo controllo di integrità o Crea un altro controllo di integrità:
- Inserisci
basic-check
come Nome del controllo di integrità. - Mantieni le impostazioni predefinite.
- Fai clic sul pulsante Salva e continua.
Un cerchio blu con un segno di spunta a sinistra di Configurazione backend indica che la configurazione è stata completata correttamente.
- Inserisci
Configura la regola di forwarding
- Fai clic su Configurazione frontend.
- Inserisci un Nome di
www-rule
. - In IP, fai clic sul menu a discesa e seleziona Crea indirizzo IP.
- Nella schermata Prenota un nuovo indirizzo IP statico, assegna un
Nome di
lb-ip-1
. - Fai clic su Prenota.
- Nella schermata Prenota un nuovo indirizzo IP statico, assegna un
Nome di
- Inserisci una porta
80
. Fai clic sul pulsante Fine.
Un cerchio blu con un segno di spunta a sinistra di Configurazione frontend indica che la configurazione è stata completata correttamente.
Rivedi la configurazione
- Fai clic sul pulsante Rivedi e finalizza per controllare tutte le impostazioni di configurazione per il bilanciatore del carico.
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 del nuovo bilanciatore del carico, vedrai un segno di spunta verde che indica che il nuovo bilanciatore del carico è in stato integro.
gcloud
Crea un indirizzo IP esterno statico per il bilanciatore del carico
gcloud compute addresses create network-lb-ip-1 \ --region us-central1
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 personalizzarlo autonomamente.
gcloud compute http-health-checks create basic-check
Aggiungi un pool di destinazione
Aggiungi un pool di destinazione nella stessa area geografica 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
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 istanze nella zonaus-central1-b
in un pool di destinazione perché si trovano nella stessa area geografica,us-central1
.Aggiungi una regola di forwarding
Aggiungi una regola di forwarding per conto di un indirizzo IP esterno e di un intervallo di porte che punti al pool di destinazione. Per il 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
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" }
Aggiungi un controllo di integrità HTTP precedente
Questo esempio utilizza le impostazioni predefinite per il meccanismo di controllo di integrità, ma puoi anche personalizzarlo da solo.
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks { "name": "basic-check" }
Aggiungere un pool di destinazione
Aggiungi un pool di destinazione nella stessa area geografica 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" ] }
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 la chiamata API per le istanze
www2
ewww3
.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 istanze nella zonaus-central1-b
in un pool di destinazione perché si trovano nella stessa area geografica,us-central1
.Aggiungi una regola di forwarding
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
Una volta configurato il servizio di bilanciamento del carico, 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
Console
- Vai alla scheda Inoltro nella pagina Avanzate del bilanciamento del carico
in Google Cloud Console.
Vai alla scheda Inoltro delle regole - Individua
www-rule
, la regola di forwarding utilizzata dal bilanciatore del carico. - Nella colonna IP Address (Indirizzo IP) per
www-rule
, indica l'indirizzo IP esterno riportato.
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 di www-rule
con 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 supportata 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 Google Cloud potrebbe inviare una risposta ICMP, anche se hai 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 inizialmente la risposta non è andata a buon fine, potrebbe essere necessario attendere circa 30 secondi per il completamento del caricamento della configurazione e il completamento dell'integrità delle istanze prima di riprovare:
$ while true; do curl -m1 IP_ADDRESS; done
Passaggi successivi
- Per informazioni sul funzionamento di Bilanciamento del carico di rete con i pool di destinazione, consulta la panoramica del bilanciamento del carico di rete con il pool di destinazione.
- Per scoprire come funzionano i bilanciatori del carico di rete con i servizi di backend a livello di area geografica anziché con i pool di destinazione, consulta:
- Per informazioni su problemi e soluzioni alternative quando utilizzi il bilanciatore del carico di rete per il traffico UDP, consulta la sezione Come utilizzare UDP con il bilanciamento del carico di rete.
- Pulisci la configurazione del bilanciatore del carico.