Panoramica della gestione del traffico per bilanciatori del carico HTTP(S) interni

Il bilanciamento del carico HTTP(S) interno supporta una funzionalità avanzata di gestione del traffico che ti consente di utilizzare le seguenti funzionalità:
  • Indirizzamento del traffico. Indirizza il traffico in modo intelligente in base a parametri HTTP(S), ad esempio host, percorso, intestazioni e altri parametri di richiesta.
  • Azioni di traffico. Esegui azioni basate sulle richieste e sulle risposte (ad esempio, reindirizzamenti e trasformazioni delle intestazioni).
  • Norme sul traffico. Ottimizzare il comportamento del bilanciamento del carico (ad esempio, algoritmi di bilanciamento del carico avanzati).

Puoi configurare queste funzionalità utilizzando mappe di URL e servizi di backend. Per ulteriori informazioni, consulta i seguenti argomenti:

Esempi di casi d'uso

La gestione del traffico risponde a molti casi d'uso. Questa sezione fornisce alcuni esempi di alto livello.

Indirizzamento del traffico: routing basato su intestazione

L'indirizzamento del traffico consente di indirizzare il traffico alle istanze di servizio in base a parametri HTTP come le intestazioni delle richieste. Ad esempio, se un dispositivo dell'utente è un dispositivo mobile con user-agent:Mobile nell'intestazione della richiesta, il traffico diretto può inviare tale traffico alle istanze di servizio designate per gestire il traffico da dispositivi mobili e inviare traffico che non presenta user-agent:Mobile alle istanze designate per gestire il traffico da altri dispositivi.

Indirizzamento del traffico di Cloud Load Balancing
Figura 1. Indirizzamento del traffico di Cloud Load Balancing.

Azioni di traffico: suddivisione del traffico basata sul peso

Il deployment di una nuova versione di un servizio di produzione esistente comporta in genere qualche rischio. Anche se i test hanno esito positivo, è probabile che tu non voglia sottoporre il 100% degli utenti alla nuova versione immediatamente. Con la gestione del traffico, puoi definire suddivisioni del traffico basate sulla percentuale tra più servizi di backend.

Ad esempio, puoi inviare il 95% del traffico alla versione precedente del tuo servizio e il 5% alla nuova versione del tuo servizio. Dopo aver verificato che la nuova versione di produzione funzioni come previsto, puoi spostare gradualmente le percentuali fino a quando il 100% del traffico raggiunge la nuova versione del servizio. La suddivisione del traffico viene generalmente utilizzata per eseguire il deployment di nuove versioni, test A/B, migrazione dei servizi e processi simili.

Suddivisione del traffico di Cloud Load Balancing
Figura 2. Suddivisione del traffico di Cloud Load Balancing.

Criteri di traffico: mirroring delle richieste

La tua organizzazione potrebbe avere requisiti di conformità specifici che richiedono che venga eseguito il mirroring di tutto il traffico a un servizio aggiuntivo in grado, ad esempio, di registrare i dettagli della richiesta in un database per la riproduzione successiva.

Componenti di gestione del traffico

A livello generale, i bilanciatori del carico forniscono la gestione del traffico sfruttando le mappe degli URL a livello di area geografica e le risorse dei servizi di backend a livello di area geografica.

Puoi configurare le azioni di gestione del traffico e del traffico utilizzando le mappe URL. Le risorse di Google Cloud associate alle mappe URL includono:

  • Regola di route
  • Corrispondenza regola
  • Azione regola

Puoi configurare i criteri di traffico utilizzando i servizi di backend. Le risorse di Google Cloud associate ai servizi di backend includono:

  • Interruttori di sicurezza
  • Criterio del bilanciatore del carico della località
  • Impostazioni del bilanciatore del carico di hash coerenti
  • Rilevamento outlier

Il seguente diagramma mostra le risorse utilizzate per implementare ciascuna funzionalità.

Indirizzamento al traffico di Cloud Load Balancing (fai clic per ingrandire)
Figura 3. Modello dei dati di Cloud Load Balancing (fai clic per ingrandire).

Routing delle richieste ai backend

Nei bilanciatori del carico HTTP(S) interni, il backend per il traffico viene determinato utilizzando un approccio in due fasi:

  • Il bilanciatore del carico seleziona un servizio di backend con backend. I backend possono essere istanze di macchine virtuali (VM) Compute Engine in un gruppo di istanze non gestite, VM di Compute Engine in un gruppo di istanze gestite (MIG) o container in base a un nodo Google Kubernetes Engine (GKE) in un gruppo di endpoint di rete (NEG). Il bilanciatore del carico sceglie un servizio di backend in base alle regole definite in una mappa URL a livello di area geografica.
  • Il servizio di backend seleziona un'istanza di backend in base ai criteri definiti in un servizio di backend a livello di area geografica.

Quando configuri il routing, puoi scegliere tra le seguenti modalità:

  • Regola semplice per host e percorso
  • Regola avanzata per host, percorso e route

Le due modalità si escludono a vicenda. Ogni mappa URL può contenere solo una modalità o l'altra.

Regola semplice per host e percorso

In una semplice regola host e percorso, le mappe URL funzionano come descritto nella panoramica delle mappe URL.

Il seguente diagramma mostra il flusso logico di una semplice regola percorso e host.

Flusso della mappa di URL con una semplice regola host e percorso.
Figura 4. Flusso della mappa URL con una semplice regola host e percorso.

Una richiesta viene valutata inizialmente utilizzando le regole host. L'host è il dominio specificato dalla richiesta. Se la richiesta host corrisponde a una delle voci nel campo hosts, viene utilizzato il matcher percorso associato.

Successivamente, viene valutata la corrispondenza di percorso. Le regole di percorso vengono valutate in base al percorso di corrispondenza più lungo e puoi specificare le regole di percorso in qualsiasi ordine. Una volta trovata la corrispondenza più specifica, la richiesta viene instradata al servizio di backend corrispondente. Se la richiesta non corrisponde, viene utilizzato il servizio di backend predefinito.

Una tipica regola host e percorso potrebbe essere simile alla seguente, dove il traffico video va a video-backend-service e tutto il resto al traffico di web-backend-service.

$ gcloud compute url-maps describe lb-map
defaultService: regions/us-west1/backendServices/web-backend-service
hostRules:
- hosts:
  - '*'
  pathMatcher: pathmap
name: lb-map
pathMatchers:
- defaultService: regions/us-west1/backendServices/web-backend-service
  name: pathmap
  pathRules:
  - paths:
    - /video
    - /video/*
    service: regions/us-west1/backendServices/video-backend-service
region: regions/us-west1

Regola avanzata per host, percorso e route

Le regole avanzate per host, percorso e percorso offrono opzioni di configurazione aggiuntive rispetto alle semplici regole relative a host e percorso. Queste opzioni consentono pattern di gestione del traffico più avanzati e modificano anche alcune semantiche. Ad esempio, le regole di route hanno un valore di priorità associato e vengono interpretate in ordine di priorità (anziché utilizzare la semantica "long-path-matches-first").

Come nell'esempio precedente di host e regola di percorso, puoi configurare la gestione avanzata del traffico utilizzando una mappa URL. Ad esempio, la seguente mappa di URL configura il routing in cui il 95% del traffico viene instradato a un servizio di backend, mentre il 5% viene indirizzato a un altro servizio di backend.

$ gcloud compute url-maps describe lb-map

defaultService: regions/us-west1/backendServices/service-a
hostRules:
- hosts:
  - '*'
  pathMatcher: matcher1
name: lb-map
pathMatchers:
- defaultService: regions/us-west1/backendServices/service-a
  name: matcher1
  routeRules:
  - matchRules:
    - prefixMatch: ''
    routeAction:
      weightedBackendServices:
      - backendService: regions/us-west1/backendServices/service-a
        weight: 95
      - backendService: regions/us-west1/backendServices/service-b
        weight: 5
region: regions/us-west1

Regole host

Quando una richiesta raggiunge il bilanciatore del carico, il campo host della richiesta viene valutato in base al valore hostRules definito nella mappa URL. Ogni regola host è composta da un elenco di uno o più host e da un singolo matcher percorso (pathMatcher). Se non viene definito alcun hostRules, la richiesta viene instradata al defaultService.

Per ulteriori informazioni, consulta hostRules[] e defaultService nella documentazione relativa all'API Mappa URL a livello di area geografica.

Matcher percorso

Dopo che una richiesta corrisponde a una regola host, il bilanciatore del carico valuta il matcher percorso corrispondente all'host.

Un matcher percorso è costituito da:

  • Una o più regole del percorso (pathRules) o regole di route (routeRules).
  • Un servizio predefinito (defaultService), che è il servizio di backend predefinito utilizzato quando non esistono altri servizi di backend.

Per ulteriori informazioni, consulta pathMatchers[], pathMatchers[].pathRules[] e pathMatchers[].routeRules[] nella documentazione relativa all'API Mappa URL a livello di area geografica.

Regole percorso

Le regole di percorso (pathRules) specificano uno o più percorsi di URL, come / o /video. In genere le regole dei percorsi sono concepite per il tipo di routing semplice basato su percorso e host descritto in precedenza.

Per saperne di più, consulta pathRules[] nella documentazione relativa all'API della Mappa URL a livello di area geografica.

Regole di route

Una regola di route (routeRules) abbina le informazioni in una richiesta in entrata e prende una decisione di routing in base alla corrispondenza.

Le regole di route possono contenere una serie di regole di corrispondenza (matchRules) e diverse azioni di route (routeAction).

Una regola di corrispondenza valuta la richiesta in entrata in base al percorso della richiesta HTTP(S) e alle intestazioni e ai parametri di ricerca. Le regole di corrispondenza supportano diversi tipi di corrispondenze, ad esempio la corrispondenza del prefisso, e i modificatori (ad es. distinzione in maiuscole/minuscole). Questo ti consente, ad esempio, di inviare richieste HTTP(S) a un insieme di backend in base alla presenza di un'intestazione HTTP definita personalizzata.

Nota: le opzioni di corrispondenza e la semantica variano a seconda della porzione della richiesta di corrispondenza. Per saperne di più, consulta matchRules[] nella documentazione relativa all'API della Mappa URL a livello di area geografica.

Se hai più regole di route, il bilanciatore del carico le esegue in ordine di priorità (in base al campo priority), che consente di specificare una logica personalizzata per la corrispondenza, il routing e altre azioni.

All'interno di una determinata regola di route, quando viene effettuata la prima corrispondenza, il bilanciatore del carico interrompe la valutazione delle regole di corrispondenza e le eventuali regole di corrispondenza rimanenti vengono ignorate.

Google Cloud esegue le seguenti azioni:

  1. Cerca la prima regola di corrispondenza che corrisponde alla richiesta.
  2. Non interrompe più le regole di corrispondenza.
  3. Applica le azioni nelle azioni di route corrispondenti.

Le regole di route hanno diversi componenti, come descritto nella tabella seguente.

Componente regola di route (API field name) Descrizione
Priorità (priority) Un numero compreso tra 0 e 2.147.483.647 (ovvero (2^31)-1) assegnato a una regola di route all'interno di un determinato matcher di percorso.

La priorità determina l'ordine della valutazione della regola di route. La priorità di una regola diminuisce all'aumentare del numero, in modo che una regola con priorità 4 venga valutata prima di una regola con priorità 25. Viene applicata la prima regola che corrisponde alla richiesta.

I numeri prioritari possono avere lacune. Non puoi creare più di una regola con la stessa priorità.
Descrizione (description) Una descrizione facoltativa di massimo 1024 caratteri.
Servizio (service) L'URL completo o parziale della risorsa di servizio di backend a cui viene indirizzato il traffico se viene trovata una corrispondenza con questa regola.
Regole delle corrispondenze (matchRules) Una o più regole valutate in base alla richiesta. Questi matchRules possono corrispondere a tutti o a un sottoinsieme degli attributi HTTP della richiesta, come il percorso, le intestazioni HTTP e i parametri di ricerca (GET).

Nell'ambito di un matchRule, devono essere soddisfatti tutti i criteri corrispondenti per routeActions di routeRule. Se un routeRule ha più matchRules, routeActions di routeRule ha effetto quando una richiesta corrisponde a uno di matchRules di routeRule.
Azione route (routeAction) Consente di specificare le azioni da intraprendere quando vengono soddisfatti i criteri della regola di corrispondenza. Queste azioni includono la suddivisione del traffico, le riscritture di URL, i nuovi tentativi e il mirroring, l'inserimento di errori e i criteri CORS.
Azione di reindirizzamento (urlRedirect) Puoi configurare un'azione per rispondere con un reindirizzamento HTTP quando vengono soddisfatti i criteri della regola di corrispondenza. Questo campo non può essere utilizzato insieme a un'azione di route.
Azione intestazione (headerAction) Puoi configurare le regole di trasformazione delle intestazioni delle richieste e delle risposte quando vengono soddisfatti i criteri all'interno di matchRules.

Per ulteriori informazioni, consulta i seguenti campi nella documentazione relativa all'API Mappa URL a livello di area geografica:

  • routeRules[]
  • routeRules[].priority
  • routeRules[].description
  • routeRules[].service
  • routeRules[].matchRules[]
  • routeRules[].routeAction
  • routeRules[].urlRedirect
  • routeRules[].headerAction

Regole delle corrispondenze

Le regole di corrispondenza (matchRules) soddisfano uno o più attributi di una richiesta ed eseguono le azioni specificate nella regola di route. L'elenco seguente fornisce alcuni esempi di attributi di richiesta che possono essere abbinati utilizzando le regole di corrispondenza:

  • Host: il nome host è la porzione del nome di dominio di un URL; ad esempio, la parte del nome host dell'URL http://example.net/video/hd è example.net. Nella richiesta, il nome host proviene dall'intestazione Host, come mostrato in questo comando curl di esempio, dove 10.1.2.9 è l'indirizzo IP con bilanciamento del carico:

    curl -v http://10.1.2.9/video/hd --header 'Host: example.com'
    
  • I percorsi seguono il nome host, ad esempio /images. La regola può specificare se l'intero percorso o solo la parte iniziale del percorso deve corrispondere.

  • Altri parametri per la richiesta HTTP, come le intestazioni HTTP, che consentono la corrispondenza dei cookie, oltre alla corrispondenza basata sui parametri di ricerca (variabili GET).

Per un elenco completo delle regole di corrispondenza supportate, consulta pathMatchers[].routeRules[].matchRules[] nella documentazione relativa all'API Mappa URL a livello di area geografica.

Azioni route

Le azioni di route sono azioni specifiche quando una regola di route corrisponde agli attributi di una richiesta.

Azione route (API field name) Descrizione
Reindirizzamenti (urlRedirect) Restituisce un codice di risposta 3xx configurabile. Imposta anche l'intestazione della risposta Location con l'URI appropriato, sostituendo l'host e il percorso come specificato nell'azione di reindirizzamento.
Riscrittura URL (urlRewrite) Riscrive la porzione del nome host dell'URL, la parte del percorso dell'URL o entrambe prima di inviare una richiesta al servizio di backend selezionato.
Trasformazioni dell'intestazione (headerAction) Aggiunge o rimuove le intestazioni delle richieste prima di inviare una richiesta al servizio di backend. Può anche aggiungere o rimuovere intestazioni della risposta dopo aver ricevuto una risposta dal servizio di backend.
Mirroring del traffico (requestMirrorPolicy) Oltre a inoltrare la richiesta al servizio di backend selezionato, invia una richiesta identica al servizio di backend mirror configurato su base fire and dimenticare. Il bilanciatore del carico non attende una risposta dal backend a cui invia la richiesta con mirroring.

Mirroring è utile per testare una nuova versione di un servizio di backend. Puoi anche utilizzarlo per eseguire il debug degli errori di produzione su una versione di debug del servizio di backend, anziché sulla versione di produzione.
Suddivisione del traffico ponderata (weightedBackendServices) Consente il traffico di una regola con corrispondenze che può essere distribuita a più servizi di backend, in proporzione al peso definito dall'utente assegnato al singolo servizio di backend.

Questa funzionalità è utile per configurare deployment temporanei o test A/B. Ad esempio, l'azione di route potrebbe essere configurata in modo che il 99% del traffico venga inviato a un servizio che esegue una versione stabile di un'applicazione, mentre l'1% del traffico viene inviato a un servizio separato che esegue una versione più recente dell'applicazione.
Tentativi (retryPolicy) Configura le condizioni in cui i nuovi tentativi non superano le richieste non riuscite, il tempo di attesa prima che si ripeta e il numero massimo di nuovi tentativi consentiti.
Timeout (timeout) Specifica il timeout per il percorso selezionato. Il timeout viene calcolato dal momento in cui viene elaborata la richiesta fino al completamento dell'elaborazione della risposta. Il timeout include tutti i nuovi tentativi.
Iniezione di guasti (faultInjectionPolicy) Introduce errori durante la gestione delle richieste di simulazione di errori, tra cui latenza elevata, sovraccarico del servizio, errori del servizio e partizionamento della rete. Questa funzionalità è utile per testare la resilienza di un servizio e la simulazione di errori.
Iniezione ritardata (faultInjectionPolicy) Presenta ritardi per una parte delle richieste definite dall'utente prima di inviare la richiesta al servizio di backend selezionato.
Interrompi iniezione (faultInjectionPolicy) Risponde direttamente a una parte delle richieste con codici di stato HTTP definiti dall'utente anziché inoltrare tali richieste al servizio di backend.
Criteri di sicurezza (corsPolicy) I criteri CORS (condivisione delle risorse multiorigine) gestiscono le impostazioni per l'applicazione forzata delle richieste CORS.

Puoi specificare una delle seguenti azioni del percorso:

  • Instrada il traffico a un singolo servizio (service).
  • Suddividi traffico tra più servizi (weightedBackendServices weight:x, dove x < 100).
  • Reindirizza URL (urlRedirect).

Inoltre, puoi combinare una qualsiasi delle azioni di percorso menzionate in precedenza con una o più delle seguenti azioni di percorso:

  • Esegui il mirroring del traffico (requestMirrorPolicy).
  • Riscrivi host/percorso dell'URL (urlRewrite).
  • Riprova a inviare le richieste non riuscite (retryPolicy).
  • Imposta timeout (timeout).
  • Introduci errori in una percentuale del traffico (faultInjectionPolicy).
  • Aggiungi criterio CORS (corsPolicy).
  • Manipola le intestazioni della richiesta/risposta (headerAction).

Per ulteriori informazioni sulla configurazione e sulla semantica delle azioni di route, consulta quanto segue nella documentazione relativa all'API mappa a livello di area geografica:

  • urlRedirect
  • urlRewrite
  • headerAction
  • requestMirrorPolicy
  • weightedBackendServices
  • retryPolicy
  • timeout
  • faultInjectionPolicy
  • corsPolicy

Reindirizzamenti da HTTP a HTTPS

Se devi reindirizzare il traffico HTTP a HTTPS, puoi creare due regole di forwarding con un indirizzo IP comune.

Affinché due regole di forwarding possano condividere un indirizzo IP interno comune, devi prenotare l'indirizzo IP e includere il flag --purpose=SHARED_LOADBALANCER_VIP:

gcloud compute addresses create NAME \
    --region=us-west1 \
    --subnet=backend-subnet \
    --purpose=SHARED_LOADBALANCER_VIP
Per un esempio completo, vedi Configurazione del reindirizzamento da HTTP a HTTPS per i bilanciatori del carico HTTP(S) interni.

Criteri di traffico

Utilizzando le risorse del servizio di backend, puoi configurare i criteri del traffico per ottimizzare il bilanciamento del carico all'interno di un gruppo di istanze o di un endpoint di rete (NEG). Questi criteri vengono applicati solo dopo che un servizio di backend è stato selezionato utilizzando la tua mappa URL (come descritto in precedenza).

I criteri di traffico consentono di:

  • Controlla l'algoritmo di bilanciamento del carico tra le istanze all'interno del servizio di backend.
  • Controlla il volume delle connessioni a un servizio upstream.
  • Controlla l'eliminazione degli host in stato non integro da un servizio di backend.
Nel servizio di backend a livello di area geografica sono configurate le seguenti funzionalità dei criteri di traffico.
Criterio di traffico (API field name) Descrizione
Criterio di bilanciamento del carico (LocalityLbPolicy)

Per un servizio di backend, la distribuzione del traffico si basa su una modalità di bilanciamento del carico e un criterio di bilanciamento del carico.

La modalità di bilanciamento determina la ponderazione/frazione del traffico che deve essere inviata a ogni backend (gruppo di istanze o NEG GCE_VM_IP_PORT). Il criterio di bilanciamento del carico (LocalityLbPolicy) determina la modalità di bilanciamento del carico dei backend all'interno o all'interno del gruppo. Quando un servizio di backend riceve traffico, prima lo indirizza a un backend (gruppo di istanze o NEG GCE_VM_IP_PORT) in base alla modalità di bilanciamento del backend. Dopo aver selezionato un backend, il traffico viene distribuito tra istanze o endpoint all'interno di ogni zona in base al criterio di località. Per i gruppi di istanze gestite a livello di area geografica, il criterio di località si applica a ogni zona costituente.

Per le modalità di bilanciamento supportate, consulta la sezione Modalità di bilanciamento.

Per gli algoritmi dei criteri di bilanciamento del carico supportati, consulta localityLbPolicy nella documentazione relativa all'API del servizio di backend a livello di area geografica.

Affinità sessione (consistentHash)

Include affinità basata su cookie HTTP, affinità basata su intestazioni HTTP, affinità indirizzo IP client e affinità cookie generata. Affinità sessione cerca di inviare le richieste di un determinato client allo stesso backend finché il backend è integro e con capacità disponibile.

Per scoprire di più sull'affinità sessione, consulta consistentHash nella documentazione relativa all'API del servizio di backend a livello di area geografica.

Rilevamento outlier (outlierDetection)

Un insieme di criteri che specificano i criteri per l'eliminazione di VM o endpoint in stato non integro nei NEG, insieme a criteri che definiscono quando un backend o un endpoint è considerato sufficientemente integro da ricevere nuovamente il traffico.

Per scoprire di più sull'affinità sessione, consulta outlierDetection nella documentazione relativa all'API del servizio di backend a livello di area geografica.

Interruzione del circuito (circuitBreakers)

Imposta limiti superiori sul volume di connessioni e richieste per connessione a un servizio di backend.

Per ulteriori informazioni sull'affinità sessione, consulta circuitBreakers nella documentazione relativa all'API del servizio di backend a livello di area geografica.

Passaggi successivi