Bilanciamento del carico di rete ponderato per istanza

1. Introduzione

Puoi configurare un bilanciatore del carico di rete per distribuire il traffico tra le istanze di backend del bilanciatore del carico in base ai pesi segnalati da un controllo di integrità HTTP utilizzando il bilanciamento del carico ponderato.

Il bilanciamento del carico ponderato richiede la configurazione di entrambi gli elementi seguenti:

  • Devi impostare il criterio di bilanciamento del carico per le località (localityLbPolicy) del servizio di backend su WEIGHTED_MAGLEV.
  • Devi configurare il servizio di backend con un controllo di integrità HTTP/HTTP2/HTTPS. Le risposte del controllo di integrità HTTP devono contenere un campo di intestazione della risposta HTTP personalizzato X-Load-Balancing-Endpoint-Weight per specificare i pesi con valori interi da 0 a 1000 in rappresentazione decimale per ogni istanza di backend.

Se utilizzi lo stesso gruppo di istanze come backend per più bilanciatori del carico di rete basati su servizi di backend che utilizzano il bilanciamento del carico ponderato, ti consigliamo di utilizzare un percorso di richiesta univoco per ogni controllo di integrità del servizio di backend. Per saperne di più, consulta Criteri di esito positivo per i controlli di integrità HTTP, HTTPS e HTTP/2.

Il controllo di integrità HTTP deve restituire una risposta HTTP 200 (OK) affinché i controlli di integrità vengano superati e l'istanza di backend venga considerata integra. Nelle situazioni in cui tutte le istanze di backend superano i controlli di integrità e restituiscono X-Load-Balancing-Endpoint-Weight con peso zero, il bilanciatore del carico distribuisce le nuove connessioni tra i backend integri, trattandoli con lo stesso peso. Il bilanciatore del carico può anche distribuire nuove connessioni tra i backend non integri. Per maggiori informazioni, consulta la sezione Distribuzione del traffico.

Per esempi di bilanciamento del carico ponderato, vedi Selezione del backend e monitoraggio della connessione.

Il bilanciamento del carico ponderato può essere utilizzato nei seguenti scenari:

  • Se alcune connessioni elaborano più dati di altre o se alcune connessioni durano più a lungo di altre, la distribuzione del carico di backend potrebbe diventare irregolare. Segnalando un peso inferiore per istanza, un'istanza con carico elevato può ridurre la sua quota di nuove connessioni, continuando a gestire quelle esistenti.
  • Se un backend è sovraccarico e l'assegnazione di più connessioni potrebbe interrompere le connessioni esistenti, questi backend si assegnano un peso pari a zero. Se viene segnalato un peso pari a zero, un'istanza di backend interrompe la gestione di nuove connessioni, ma continua a gestire quelle esistenti.
  • Se un backend esaurisce le connessioni esistenti prima della manutenzione, si assegna un peso pari a zero. Se viene segnalato un peso pari a zero, l'istanza di backend interrompe la gestione delle nuove connessioni, ma continua a gestire quelle esistenti.

Cosa imparerai a fare

  • Come configurare un bilanciatore del carico di rete per distribuire il traffico tra le istanze di backend del bilanciatore del carico in base ai pesi segnalati da un controllo di integrità HTTP utilizzando il bilanciamento del carico ponderato.

Configurazione dell'ambiente autonoma

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai già un account Gmail o Google Workspace, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Il nome del progetto è il nome visualizzato per i partecipanti a questo progetto. È una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarlo in qualsiasi momento.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo l'impostazione). La console Cloud genera automaticamente una stringa univoca, di solito non ti interessa di cosa si tratta. Nella maggior parte dei codelab, devi fare riferimento all'ID progetto (in genere è identificato come PROJECT_ID). Se non ti piace l'ID generato, puoi generarne un altro casuale. In alternativa, puoi provare a crearne uno e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà per tutta la durata del progetto.
  • Per tua informazione, esiste un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, devi abilitare la fatturazione in Cloud Console per utilizzare le risorse/API Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Per arrestare le risorse in modo da non incorrere in costi di fatturazione oltre a quelli previsti da questo tutorial, puoi eliminare le risorse che hai creato o l'intero progetto. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Avvia Cloud Shell

Sebbene Google Cloud possa essere gestito da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Nella console Google Cloud, fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra:

55efc1aaa7a4d3ad.png

Bastano pochi istanti per eseguire il provisioning e connettersi all'ambiente. Al termine, dovresti vedere un risultato simile a questo:

7ffe5cbb04455448.png

Questa macchina virtuale è caricata con tutti gli strumenti di sviluppo di cui avrai bisogno. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Tutto il lavoro in questo codelab può essere svolto all'interno di un browser. Non devi installare nulla.

2. Avvia configurazione

Il codelab richiede un singolo progetto.

In questo tutorial, crei un gruppo di istanze con tre istanze VM e assegni pesi a ciascuna istanza. Crea un controllo di integrità HTTP per segnalare i pesi delle istanze di backend. Il bilanciatore del carico di rete ponderato è abilitato sul servizio di backend con la policy di bilanciamento del carico per località WEIGHTED_MAGLEV.

Prima di iniziare

gcloud services enable compute.googleapis.com

Nota:non puoi utilizzare la console Google Cloud per configurare il criterio del bilanciatore del carico locale e assegnare pesi alle istanze VM. Utilizza invece Google Cloud CLI.

Crea rete VPC, subnet e regole firewall

Crea una rete VPC, una subnet e regole firewall di autorizzazione in entrata per consentire le connessioni alle VM di backend del bilanciatore del carico.

  1. Crea una rete VPC e una subnet. a. Per creare la rete VPC, esegui il comando gcloud compute networks create :.
gcloud compute networks create NETWORK_NAME --subnet-mode custom

b. In questo esempio, l'intervallo di indirizzi IPv4 principale della subnet è 10.10.0.0/24.

Per creare la subnet, esegui il comando gcloud compute networks subnets create :

gcloud compute networks subnets create SUBNET_NAME \
  --network=NETWORK_NAME \
  --range=10.10.0.0/24 \
  --region=us-central1

Sostituisci quanto segue:

  • NETWORK_NAME: il nome della rete VPC da creare.
  • SUBNET_NAME: il nome della subnet da creare.
  1. Crea una regola firewall di autorizzazione in entrata per consentire la distribuzione dei pacchetti inviati alle porte TCP di destinazione 80 e 443 alle VM di backend. In questo esempio, la regola firewall consente le connessioni da qualsiasi indirizzo IP di origine. La regola firewall si applica alle VM con il tag di rete network-lb-tag. Per creare la regola firewall, esegui il comando gcloud compute firewall-rules create:
gcloud compute firewall-rules create FIREWALL_RULE_NAME \
   --direction=INGRESS \
   --priority=1000 \
   --network=NETWORK_NAME \
   --action=ALLOW \
   --rules=tcp:80,tcp:443 \
   --source-ranges=0.0.0.0/0 \
   --target-tags=network-lb-tag

Sostituisci FIREWALL_RULE_NAME con il nome della regola firewall da creare.

Crea istanze VM e assegna pesi

Crea tre istanze VM e assegna i pesi:

  1. Configura tre istanze VM di backend per restituire i pesi nell'intestazione X-Load-Balancing-Endpoint-Weight con le risposte HTTP. Per questo tutorial, configuri una prima istanza di backend per segnalare un peso pari a zero, una seconda istanza di backend per segnalare un peso pari a 100 e una terza istanza di backend per segnalare un peso pari a 900. Per creare le istanze, esegui il comando gcloud compute instances create:
gcloud compute instances create instance-0 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=0,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  vm_hostname="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/name)"
  echo "Page served from: $vm_hostname" | \
  tee /var/www/html/index.html
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-100 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=SUBNET_NAME \
  --metadata=load-balancing-weight=100,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  vm_hostname="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/name)"
  echo "Page served from: $vm_hostname" | \
  tee /var/www/html/index.html
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-900 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=900,startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    lb_weight="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
    echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
    tee /etc/apache2/conf-enabled/headers.conf
    systemctl restart apache2'

Crea un gruppo di istanze

In questo tutorial, fornisci le istruzioni per creare un gruppo di istanze non gestite contenente tutte e tre le istanze VM(instance-0, instance-100, and instance-900).

gcloud compute instance-groups unmanaged create
INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \
  --zone=us-central1-a \
  --instances=instance-0,instance-100,instance-900

Sostituisci INSTANCE_GROUP con il nome del gruppo di istanze da creare.

Crea un controllo di integrità HTTP

In questo tutorial, fornisci istruzioni per creare un controllo di integrità HTTP per leggere la risposta HTTP contenente il peso della VM di backend."

gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

Sostituisci HTTP_HEALTH_CHECK_NAME con il nome del controllo di integrità HTTP da creare.

Crea un servizio di backend

L'esempio seguente fornisce istruzioni per creare un servizio di backend esterno regionale configurato per utilizzare il bilanciamento del carico ponderato.

  1. Crea un servizio di backend con il controllo di integrità HTTP e imposta la policy di bilanciamento del carico per le località su WEIGHTED_MAGLEV.
gcloud compute backend-services create BACKEND_SERVICE_NAME \
  --load-balancing-scheme=external \
  --protocol=tcp \
  --region=us-central1 \
  --health-checks=HTTP_HEALTH_CHECK_NAME \
  --health-checks-region=us-central1 \
  --locality-lb-policy=WEIGHTED_MAGLEV
  • Sostituisci BACKEND_SERVICE_NAME con il nome del servizio di backend da creare.
  1. Aggiungi il gruppo di istanze al servizio di backend.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. Prenota un indirizzo IP esterno regionale per il bilanciatore del carico.
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

Sostituisci ADDRESS_NAME con il nome dell'indirizzo IP da creare. Utilizza il comando compute addresses describe per visualizzare il risultato. Prendi nota dell'indirizzo IP esterno statico prenotato ("IP_ADDRESS'").

gcloud compute addresses describe ADDRESS_NAME
  1. Crea una regola di forwarding utilizzando l'indirizzo IP esterno regionale riservato "IP_ADDRESS". Collega la regola di forwarding al servizio di backend.
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • Sostituisci quanto segue: FORWARDING_RULE: il nome della regola di forwarding da creare. IP_ADDRESS: l'indirizzo IP da assegnare all'istanza. Utilizza l'indirizzo IP esterno statico prenotato, non il nome dell'indirizzo.

Verifica i pesi del backend utilizzando l'API del servizio di backend

Verifica che i pesi di backend vengano segnalati correttamente al controllo di integrità HTTP.

gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

L'output dovrebbe essere simile al seguente:

backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name}
status:
  healthStatus:
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0
    ipAddress: 10.10.0.5
    port: 80
    weight: '0'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100
    ipAddress: 10.10.0.6
    port: 80
    weight: '100'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900
    ipAddress: 10.10.0.7
    port: 80
    weight: '900'
  kind: compute#backendServiceGroupHealth