Metriche personalizzate per i bilanciatori del carico delle applicazioni

Questa pagina descrive come utilizzare le metriche personalizzate con i bilanciatori del carico delle applicazioni. Le metriche personalizzate ti consentono di configurare il comportamento di distribuzione del traffico del bilanciatore del carico in base a metriche specifiche per i requisiti dell'applicazione o dell'infrastruttura, anziché alle metriche standard di utilizzo o basate sulla frequenza. Google CloudLa definizione di metriche personalizzate per il bilanciatore del carico ti offre la flessibilità di instradare le richieste dell'applicazione alle istanze e agli endpoint di backend più ottimali per il tuo workload.

Per GKE, puoi anche utilizzare metriche personalizzate provenienti dal servizio o dall'applicazione che stai eseguendo. Per maggiori dettagli, vedi Esporre metriche personalizzate.

Il bilanciatore del carico utilizza i valori delle metriche personalizzate per prendere le seguenti decisioni:

  1. Seleziona il gruppo di istanze di macchine virtuali (VM) o il gruppo di endpoint di rete di backend che deve ricevere il traffico.
  2. Seleziona l'istanza VM o l'endpoint che deve ricevere il traffico.
Bilanciamento del carico con metriche personalizzate.
Bilanciamento del carico con metriche personalizzate (fai clic per ingrandire).

Ecco alcuni casi d'uso di esempio per le metriche personalizzate:

  • Massimizza l'utilizzo della capacità di calcolo globale prendendo decisioni di bilanciamento del carico in base a metriche personalizzate più pertinenti per la tua applicazione, anziché ai criteri predefiniti come l'affinità regionale o la latenza di rete.

    Se le tue applicazioni hanno spesso latenze di elaborazione del backend dell'ordine di secondi, puoi utilizzare la capacità di calcolo globale in modo più efficiente bilanciando le richieste in base a metriche personalizzate anziché alla latenza di rete.

  • Massimizza l'efficienza di calcolo prendendo decisioni di bilanciamento del carico in base a combinazioni di metriche uniche per la tua implementazione. Ad esempio, considera uno scenario in cui le tue richieste hanno tempi di elaborazione e requisiti di calcolo molto variabili. In questo scenario, il bilanciamento del carico basato esclusivamente sulla frequenza di richieste al secondo comporta una distribuzione del carico non uniforme. In questo caso, potresti voler definire una metrica personalizzata che bilanci il carico in base a una combinazione sia della frequenza delle richieste sia dell'utilizzo della CPU o della GPU per utilizzare in modo più efficiente la tua flotta di calcolo.

  • Scalare automaticamente i backend in base a metriche personalizzate più pertinenti ai requisiti della tua applicazione. Ad esempio, puoi definire un criterio di scalabilità automatica per scalare automaticamente le istanze di backend quando la metrica personalizzata configurata supera l'80%. Ciò si ottiene utilizzando metriche di scalabilità automatica basate sul traffico (autoscaling.googleapis.com|gclb-capacity-fullness). Per ulteriori informazioni, vedi Scalabilità automatica basata sul traffico del bilanciatore del carico.

Bilanciatori del carico e backend supportati

Le metriche personalizzate sono supportate per i seguenti bilanciatori del carico delle applicazioni:

  • Bilanciatore del carico delle applicazioni esterno globale
  • Bilanciatore del carico delle applicazioni esterno regionale
  • Bilanciatore del carico delle applicazioni interno tra regioni
  • Bilanciatore del carico delle applicazioni interno regionale

Le metriche personalizzate sono supportate con i seguenti tipi di backend:

  • Gruppi di istanze gestite
  • NEG a livello di zona (con endpoint GCE_VM_IP_PORT)
  • NEG di connettività ibrida

Come funzionano le metriche personalizzate

Per consentire al bilanciatore del carico di prendere decisioni di distribuzione del traffico in base a metriche personalizzate, devi prima determinare quali sono le metriche più pertinenti per la tua applicazione specifica. Una volta individuate le metriche che vuoi utilizzare, configura i backend in modo che inizino a inviare un flusso costante di queste metriche al bilanciatore del carico. Google Cloud consente di segnalare le metriche come parte dell'intestazione di ogni risposta HTTP inviata dai backend al bilanciatore del carico. Queste metriche sono incapsulate in un'intestazione di risposta HTTP personalizzata e devono seguire lo standard Open Request Cost Aggregation (ORCA).

Le metriche possono essere configurate a due livelli:

  • A livello di servizio di backend, per influenzare la selezione del backend (MIG o NEG)
  • A livello di backend, per influenzare la selezione di istanze VM o endpoint

Le sezioni seguenti descrivono il funzionamento delle metriche personalizzate.

Determinare quali metriche personalizzate influenzano le decisioni di bilanciamento del carico

Determinare quali metriche personalizzate influenzano le decisioni di bilanciamento del carico è altamente soggettivo e dipende dalle esigenze delle tue applicazioni. Ad esempio, se le tue applicazioni hanno latenze di elaborazione backend dell'ordine di secondi, potresti voler bilanciare il carico delle richieste in base ad altre metriche personalizzate anziché alle latenze di rete standard.

Dopo aver determinato le metriche da utilizzare, devi anche stabilire la soglia di utilizzo massima per ciascuna metrica. Ad esempio, se vuoi utilizzare l'utilizzo della memoria come metrica, devi anche determinare la soglia massima di utilizzo della memoria per ogni backend.

Ad esempio, se configuri una metrica denominata example-custom-metric, con la soglia di utilizzo massima impostata su 0,8, il bilanciatore del carico regola dinamicamente la distribuzione del traffico tra i backend per mantenere la metrica example-custom-metric segnalata dal backend inferiore a 0,8, per quanto possibile.

Esistono due tipi di metriche personalizzate che puoi utilizzare:

  • Metriche riservate. Esistono cinque nomi di metriche riservati, perché corrispondono a campi predefiniti di primo livello nell'API ORCA.

    • orca.cpu_utilization
    • orca.mem_utilization
    • orca.application_utilization
    • orca.eps
    • orca.rps_fractional

    Le metriche mem_utilization, cpu_utilization e application_utilization prevedono valori compresi nell'intervallo 0.0 - 1.00, ma possono superare 1.00 per scenari in cui l'utilizzo delle risorse supera il budget.

  • Metriche denominate. Queste sono metriche specifiche della tua applicazione che specifichi utilizzando il campo ORCA named_metrics nel seguente formato:

    orca.named_metrics.METRIC_NAME
    

    Tutte le metriche personalizzate definite dall'utente vengono specificate utilizzando questa mappa named_metrics nel formato di coppie nome-valore.

    Le metriche denominate definite per la modalità di bilanciamento CUSTOM_METRICS devono includere valori nell'intervallo 0 - 100. Le metriche denominate definite per il criterio di bilanciamento del carico per le località WEIGHTED_ROUND_ROBIN non hanno un intervallo previsto.

Metriche obbligatorie

Per consentire al bilanciatore del carico di utilizzare metriche personalizzate per la selezione del gruppo di istanze VM di backend o del gruppo di endpoint di rete, devi specificare una o più delle seguenti metriche di utilizzo nel report di carico ORCA inviato al bilanciatore del carico. orca.named_metrics è una mappa delle metriche definite dall'utente sotto forma di coppie nome-valore.

  • orca.cpu_utilization
  • orca.application_utilization
  • orca.mem_utilization
  • orca.named_metrics

Inoltre, per consentire al bilanciatore del carico di utilizzare metriche personalizzate per influenzare ulteriormente la selezione dell'istanza VM o dell'endpoint di backend, devi fornire tutte le seguenti metriche nel report di carico ORCA inviato al bilanciatore del carico. Il bilanciatore del carico utilizza i pesi calcolati da queste metriche segnalate per assegnare il carico ai singoli backend.

  • orca.rps_fractional (richieste al secondo)
  • orca.eps (errori al secondo)
  • una metrica di utilizzo con il seguente ordine di precedenza:
    1. orca.application_utilization
    2. orca.cpu_utilization
    3. metriche definite dall'utente nella mappa orca.named_metrics

Limiti e requisiti

  • Esiste un limite di due metriche personalizzate per backend. Tuttavia, puoi eseguire dryRun test con un massimo di tre metriche personalizzate.

    Se vengono fornite due metriche, il bilanciatore del carico le tratta in modo indipendente. Ad esempio, se definisci due dimensioni: custom-metric-util1 e custom-metric-util2, il bilanciatore del carico le tratta in modo indipendente. Se un backend viene eseguito a un livello di utilizzo elevato in termini di custom-metric-util1, il bilanciatore del carico evita di inviare traffico a questo backend. In genere, il bilanciatore del carico tenta di mantenere tutti i backend in esecuzione con un livello di utilizzo simile. La pienezza viene calcolata come currentUtilization / maxUtilization. In questo caso, il bilanciatore del carico utilizza il valore di pienezza più alto tra i due riportati dalle due metriche per prendere decisioni di bilanciamento del carico.

  • Esiste un limite di due metriche personalizzate per servizio di backend. Tuttavia, puoi eseguire test dryRun con un massimo di tre metriche personalizzate. Questo limite non include le metriche obbligatorie orca.eps e orca.rps_fractional. Questo limite è indipendente anche dalle metriche configurate a livello di backend.

  • Le metriche riservate e quelle denominate possono essere utilizzate insieme. Ad esempio, sia orca.cpu_utilization = 0.5 sia una metrica personalizzata come orca.named_metrics.queue_depth_util = 0.2 possono essere fornite in un unico report di caricamento.

  • I nomi delle metriche personalizzate non devono contenere informazioni regolamentate, sensibili, identificabili o altre informazioni riservate che non devono essere visualizzate da persone esterne alla tua organizzazione.

Codifiche disponibili per la specifica della metrica personalizzata

  • JSON

    Codifica JSON di esempio di un report sul carico:

    endpoint-load-metrics-json: JSON {"cpu_utilization": 0.3, "mem_utilization": 0.8, "rps_fractional": 10.0, "eps": 1, "named_metrics": {"custom-metric-util": 0.4}}.
    
  • Binary Protobuf

    Per il codice compatibile con Protocol Buffers, si tratta di un protobuf OrcaLoadReport serializzato in formato binario con codifica base64 in endpoint-load-metrics-bin o in endpoint-load-metrics: BIN.

  • HTTP nativo

    Coppie chiave-valore separate da virgole in endpoint-load-metrics. Questa è una rappresentazione testuale semplificata di OrcaLoadReport:

    endpoint-load-metrics: TEXT cpu_utilization=0.3, mem_utilization=0.8, rps_fractional=10.0, eps=1, named_metrics.custom_metric_util=0.4
    
  • gRPC

    La specifica gRPC richiede che le metriche vengano fornite utilizzando i metadati finali con la chiave endpoint-load-metrics-bin.

Configurazione del backend per generare report sulle metriche personalizzate

Dopo aver determinato le metriche che vuoi che utilizzi il bilanciatore del carico, configura i backend per compilare le metriche personalizzate richieste in un report di carico ORCA e segnala i relativi valori in ogni intestazione della risposta HTTP inviata al bilanciatore del carico.

Ad esempio, se hai scelto orca.cpu_utilization come metrica personalizzata per un backend, questo deve segnalare l'utilizzo attuale della CPU al bilanciatore del carico in ogni risposta inviata al bilanciatore del carico. Per istruzioni, vedi la sezione Metriche dei report al bilanciatore del carico in questa pagina.

Configurazione del bilanciatore del carico per supportare le metriche personalizzate

Per consentire al bilanciatore del carico di utilizzare i valori delle metriche personalizzate riportati dai backend per prendere decisioni sulla distribuzione del traffico, devi impostare la modalità di bilanciamento di ogni backend su CUSTOM_METRICS e il criterio di località del bilanciamento del carico del servizio di backend su WEIGHTED_ROUND_ROBIN.

Come funzionano le metriche personalizzate con i bilanciatori del carico delle applicazioni.
Come funzionano le metriche personalizzate con i bilanciatori del carico delle applicazioni (fai clic per ingrandire).
  • Modalità di bilanciamento CUSTOM_METRICS. Ciascuno dei tuoi backend in un servizio di backend deve essere configurato per utilizzare la modalità di bilanciamento CUSTOM_METRICS. Quando un backend è configurato con la modalità di bilanciamento CUSTOM_METRICS, il bilanciatore del carico indirizza il traffico ai backend in base alla soglia di utilizzo massima configurata per ogni metrica personalizzata.

    Ogni backend può specificare un insieme diverso di metriche da segnalare. Se per ogni backend sono configurate più metriche personalizzate, il bilanciatore del carico tenta di distribuire il traffico in modo che tutte le metriche rimangano al di sotto dei limiti massimi di utilizzo configurati.

    Il traffico viene bilanciato tra i backend in base all'algoritmo di bilanciamento del carico che scegli. Ad esempio, l'algoritmo WATERFALL_BY_REGION predefinito tenta di mantenere tutti i backend in esecuzione con la stessa pienezza.

  • Policy di bilanciamento del carico per le località WEIGHTED_ROUND_ROBIN. La policy di località di bilanciamento del carico del servizio di backend deve essere impostata su WEIGHTED_ROUND_ROBIN. Con questa configurazione, il bilanciatore del carico utilizza anche le metriche personalizzate per selezionare l'istanza o l'endpoint ottimale all'interno del backend per gestire la richiesta.

Configurare le metriche personalizzate

Per consentire ai bilanciatori del carico delle applicazioni di utilizzare metriche personalizzate:

  1. Determina le metriche personalizzate che vuoi utilizzare.
  2. Configura i backend per segnalare metriche personalizzate al bilanciatore del carico. Devi stabilire un flusso di dati che possa essere inviato al bilanciatore del carico per essere utilizzato per il bilanciamento del carico. Queste metriche devono essere compilate e codificate in un report di carico ORCA e poi inviate al bilanciatore del carico utilizzando le intestazioni della risposta HTTP.
  3. Configura il bilanciatore del carico in modo che utilizzi i valori metrica personalizzata riportati dai backend.

Determinare le metriche personalizzate

Questo passaggio è molto soggettivo e dipende dalle esigenze delle tue applicazioni. Dopo aver determinato le metriche da utilizzare, devi anche stabilire la soglia di utilizzo massima per ciascuna metrica. Ad esempio, se vuoi utilizzare l'utilizzo della memoria come metrica, devi anche determinare la soglia massima di utilizzo della memoria per ogni backend.

Prima di procedere alla configurazione del bilanciamento del carico, assicurati di aver esaminato i tipi di metriche personalizzate a tua disposizione (riservate e denominate) e i requisiti per la selezione delle metriche, descritti nella sezione Come funzionano le metriche personalizzate di questa pagina.

Configura i backend per segnalare le metriche al bilanciatore del carico

Le metriche personalizzate vengono segnalate ai bilanciatori del carico come parte di ogni risposta HTTP dai backend dell'applicazione utilizzando lo standard ORCA.

Quando utilizzi Google Kubernetes Engine, hai anche la possibilità di utilizzare metriche personalizzate per i bilanciatori del carico.

Questa sezione mostra come compilare le metriche personalizzate in un report di carico ORCA e come riportarle in ogni intestazione di risposta HTTP inviata al bilanciatore del carico.

Ad esempio, se utilizzi la codifica del testo HTTP, l'intestazione deve segnalare le metriche nel seguente formato.

endpoint-load-metrics: TEXT BACKEND_METRIC_NAME_1=BACKEND_METRIC_VALUE_1,BACKEND_METRIC_NAME_2=BACKEND_METRIC_VALUE_2

Indipendentemente dal formato di codifica utilizzato, assicurati di rimuovere il prefisso orca. dal nome della metrica quando crei il report di caricamento.

Ecco uno snippet di codice che mostra come aggiungere due metriche personalizzate (customUtilA e customUtilB) alle intestazioni HTTP. Questo snippet di codice mostra sia la codifica del testo HTTP nativa sia la codifica Base64. Tieni presente che questo esempio codifica i valori per customUtilA e customUtilB solo per semplicità. Il bilanciatore del carico riceve i valori delle metriche che hai determinato che influenzano il bilanciamento del carico.

...
type OrcaReportType int

const (
        OrcaText OrcaReportType = iota
        OrcaBin
)

type HttpHeader struct {
        key   string
        value string
}

const (
        customUtilA = 0.2
        customUtilB = 0.4
)

func GetBinOrcaReport() HttpHeader {
        report := &pb.OrcaLoadReport{
                NamedMetrics: map[string]float64{"customUtilA": customUtilA, "customUtilB": customUtilB}}
        out, err := proto.Marshal(report)
        if err != nil {
                log.Fatalf("failed to serialize the ORCA proto: %v", err)
        }
        return HttpHeader{"endpoint-load-metrics-bin", base64.StdEncoding.EncodeToString(out)}
}

func GetHttpOrcaReport() HttpHeader {
        return HttpHeader{
                "endpoint-load-metrics",
                fmt.Sprintf("TEXT named_metrics.customUtilA=%.2f,named_metrics.customUtilB=%.2f",
                        customUtilA, customUtilB)}
}

func GetOrcaReport(t OrcaReportType) HttpHeader {
        switch t {
        case OrcaText:
                return GetHttpOrcaReport()
        case OrcaBin:
                return GetBinOrcaReport()
        default:
                return HttpHeader{"", ""}
        }
}
...

Configura il bilanciatore del carico in modo che utilizzi metriche personalizzate

Affinché il bilanciatore del carico utilizzi queste metriche personalizzate durante la selezione di un backend, devi impostare la modalità di bilanciamento per ogni backend su CUSTOM_METRICS. Inoltre, se vuoi che le metriche personalizzate influiscano anche sulla selezione degli endpoint, imposta il criterio di località di bilanciamento del carico su WEIGHTED_ROUND_ROBIN.

I passaggi descritti in questa sezione presuppongono che tu abbia già eseguito il deployment di un bilanciatore del carico con backend NEG di zona. Tuttavia, puoi utilizzare gli stessi flag --custom-metrics mostrati qui per aggiornare qualsiasi backend esistente utilizzando il comando gcloud compute backend-services update.

  1. Puoi impostare la modalità di bilanciamento di un backend su CUSTOM_METRICS quando lo aggiungi al servizio di backend. Utilizzi il flag --custom-metrics per specificare la metrica personalizzata e la soglia da utilizzare per le decisioni di bilanciamento del carico.

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --network-endpoint-group=NEG_NAME \
        --network-endpoint-group-zone=NEG_ZONE \
        [--global | region=REGION] \
        --balancing-mode=CUSTOM_METRICS \
        --custom-metrics='name="BACKEND_METRIC_NAME_1",maxUtilization=MAX_UTILIZATION_FOR_METRIC_1' \
        --custom-metrics='name="BACKEND_METRIC_NAME_2",maxUtilization=MAX_UTILIZATION_FOR_METRIC_2'
    

    Sostituisci quanto segue:

    • BACKEND_SERVICE_NAME: il nome del servizio di backend
    • NEG_NAME: il nome del NEG ibrido o a livello di zona
    • NEG_ZONE: la zona in cui è stato creato il NEG
    • REGION: per i bilanciatori del carico regionali, la regione in cui è stato creato il bilanciatore del carico
    • BACKEND_METRIC_NAME: i nomi delle metrica personalizzata utilizzati qui devono corrispondere a quelli riportati nel report ORCA del backend
    • MAX_UTILIZATION_FOR_METRIC: l'utilizzo massimo che gli algoritmi di bilanciamento del carico devono avere come target per ogni metrica

    Ad esempio, se i tuoi backend segnalano due metriche personalizzate, customUtilA e customUtilB (come illustrato nella sezione Configurare i backend per segnalare le metriche al bilanciatore del carico), utilizza il seguente comando per configurare il bilanciatore del carico in modo che utilizzi queste metriche:

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --network-endpoint-group=NEG_NAME \
        --network-endpoint-group-zone=NEG_ZONE \
        [--global | region=REGION] \
        --balancing-mode=CUSTOM_METRICS \
        --custom-metrics='name="customUtilA",maxUtilization=0.8' \
        --custom-metrics='name="customUtilB",maxUtilization=0.9'
    

    In alternativa, puoi fornire un elenco di metriche personalizzate in un file JSON strutturato:

    {
    "name": "METRIC_NAME_1",
    "maxUtilization": MAX_UTILIZATION_FOR_METRIC_1,
    "dryRun": true
    }
    {
    "name": "METRIC_NAME_2",
    "maxUtilization": MAX_UTILIZATION_FOR_METRIC_2,
    "dryRun": false
    }

    Quindi, allega il file delle metriche in formato JSON al backend nel seguente modo:

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --network-endpoint-group=NEG_NAME \
        --network-endpoint-group-zone=NEG_ZONE \
        [--global | region=REGION] \
        --balancing-mode=CUSTOM_METRICS \
        --custom-metrics-file='BACKEND_METRIC_FILE_NAME'
    

    Se vuoi verificare se le metriche vengono segnalate senza influire sul bilanciatore del carico, puoi impostare il flag dryRun su true durante la configurazione della metrica come segue:

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --network-endpoint-group=NEG_NAME \
        --network-endpoint-group-zone=NEG_ZONE \
        [--global | region=REGION] \
        --balancing-mode=CUSTOM_METRICS \
        --custom-metrics 'name="BACKEND_METRIC_NAME",maxUtilization=MAX_UTILIZATION_FOR_METRIC,dryRun=true'
    

    Quando una metrica è configurata con dryRun impostato su true, la metrica viene segnalata a Monitoring, ma non viene effettivamente utilizzata dal bilanciamento del carico.

    Per invertire questa operazione, aggiorna il servizio di backend con il flag dryRun impostato su false.

    gcloud compute backend-services update-backend BACKEND_SERVICE_NAME \
        --network-endpoint-group=NEG_NAME \
        --network-endpoint-group-zone=NEG_ZONE \
        [--global | region=REGION] \
        --balancing-mode=CUSTOM_METRICS \
        --custom-metrics 'name="BACKEND_METRIC_NAME",maxUtilization=MAX_UTILIZATION_FOR_METRIC_,dryRun=false'
    

    Se tutte le metriche personalizzate sono configurate con dryRun impostato su true, l'impostazione della modalità di bilanciamento su CUSTOM_METRICS o del criterio di bilanciamento del carico per le località su WEIGHTED_ROUND_ROBIN non ha alcun effetto sul bilanciatore del carico.

  2. Per configurare il bilanciatore del carico in modo che utilizzi le metriche personalizzate per influenzare la selezione degli endpoint, imposta il criterio di località del bilanciamento del carico del servizio di backend su WEIGHTED_ROUND_ROBIN.

    Ad esempio, se hai un servizio di backend già configurato con i backend appropriati, configura il criterio di località del bilanciamento del carico nel seguente modo:

    gcloud compute backend-services update BACKEND_SERVICE_NAME \
        [--global | region=REGION] \
        --custom-metrics='name=BACKEND_SERVICE_METRIC_NAME,dryRun=false' \
        --locality-lb-policy=WEIGHTED_ROUND_ROBIN
    

    Come mostrato in precedenza per le metriche a livello di backend, puoi anche fornire un elenco di metriche personalizzate in un file JSON strutturato a livello di servizio di backend. Utilizza il campo --custom-metrics-file per allegare il file delle metriche al servizio di backend.

Passaggi successivi