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 la policy 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 request-path 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 sia 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 saperne di più, consulta Distribuzione del traffico.

Per esempi di bilanciamento del carico ponderato, consulta Selezione del backend e monitoraggio delle connessioni.

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

  • Se alcune connessioni elaborano più dati di altre o alcune connessioni durano più di altre, la distribuzione del carico del 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 le connessioni 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. Segnalando un peso pari a zero, un'istanza di backend smette di gestire nuove connessioni, ma continua a gestire quelle esistenti.
  • Se un backend sta svuotando le connessioni esistenti prima della manutenzione, si assegna un peso pari a zero. Segnalando un peso pari a zero, l'istanza di backend smette di gestire 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 autonomo

  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.pnga99b7ace416376c4.pngbd84a6d3004737c5.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; in genere non ti interessa quale sia. Nella maggior parte dei codelab, dovrai 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 utilizzare il tuo e verificare 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. Dopodiché, dovrai abilitare la fatturazione nella console Cloud per utilizzare le risorse/API Cloud. Completare questo codelab non dovrebbe costare molto, se non nulla. Per arrestare le risorse in modo da non incorrere in addebiti oltre questo tutorial, puoi eliminare le risorse create o l'intero progetto. I nuovi utenti di Google Cloud possono beneficiare del programma di 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 visualizzare un risultato simile al seguente:

7ffe5cbb04455448.png

Questa macchina virtuale è dotata di 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 e l'autenticazione della rete. 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 i pesi a ogni istanza. Crei un controllo di integrità HTTP per segnalare i pesi delle istanze di backend. Il bilanciatore del carico di rete ponderato è abilitato nel servizio di backend con la policy di bilanciamento del carico per le località WEIGHTED_MAGLEV.

Prima di iniziare

gcloud services enable compute.googleapis.com

Nota: non puoi utilizzare la console Google Cloud per configurare la policy di bilanciamento del carico per le località e assegnare i 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 gcloud compute networks create comando:
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 gcloud compute networks subnets create comando:

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 consegna 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 i pesi

Crea tre istanze VM e assegna i pesi:

  1. Configura tre istanze VM di backend in modo che restituiscano i pesi nell'intestazione X-Load-Balancing-Endpoint-Weight con le risposte HTTP. Per questo tutorial, configuri un'istanza di backend in modo che segnali un peso pari a zero, una seconda istanza di backend in modo che segnali un peso pari a 100 e una terza istanza di backend in modo che segnali un peso pari a 900. Per creare le istanze, esegui il gcloud compute instances createcomando:
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 le 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 le 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 prenotato `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 del 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