Métriques personnalisées pour les équilibreurs de charge d'application

Cette page explique comment utiliser des métriques personnalisées avec vos équilibreurs de charge d'application. Les métriques personnalisées vous permettent de configurer le comportement de distribution du trafic de votre équilibreur de charge en fonction de métriques spécifiques à vos exigences d'application ou d'infrastructure, plutôt que des métriques d'utilisation ou basées sur les tarifs standards de Google Cloud. Définir des métriques personnalisées pour votre équilibreur de charge vous permet d'acheminer les requêtes d'application vers les instances et les points de terminaison backend les plus adaptés à votre charge de travail.

L'équilibreur de charge utilise les valeurs des métriques personnalisées pour prendre les décisions suivantes:

  1. Sélectionnez le groupe d'instances de VM backend ou le groupe de points de terminaison du réseau qui doit recevoir le trafic.
  2. Sélectionner l'instance de VM ou le point de terminaison qui doit recevoir le trafic
Équilibrer la charge avec des métriques personnalisées
Équilibrage de charge avec des métriques personnalisées (cliquez pour agrandir).

Voici quelques exemples d'utilisation des métriques personnalisées:

  • Maximisez l'utilisation de votre capacité de calcul globale en prenant des décisions d'équilibrage de charge en fonction des métriques personnalisées les plus pertinentes pour votre application, plutôt que des critères par défaut tels que l'affinité régionale ou la latence réseau.

    Si vos applications présentent souvent des latences de traitement backend de l'ordre de quelques secondes, vous pouvez utiliser votre capacité de calcul globale plus efficacement en équilibrant la charge des requêtes en fonction de métriques personnalisées plutôt que de la latence réseau.

  • Maximisez l'efficacité de calcul en prenant des décisions d'équilibrage de charge en fonction de combinaisons de métriques propres à votre déploiement. Par exemple, imaginons que vos requêtes présentent des temps de traitement et des exigences de calcul très variables. Dans ce scénario, l'équilibrage de charge basé uniquement sur le taux de requêtes par seconde entraînerait une distribution de charge inégale. Dans ce cas, vous pouvez définir une métrique personnalisée qui équilibre la charge en fonction d'une combinaison du débit des requêtes et de l'utilisation du processeur ou du GPU afin d'utiliser votre parc de calcul de manière plus efficace.

  • Autoscale les backends en fonction des métriques personnalisées les plus pertinentes pour les exigences de votre application. Par exemple, vous pouvez définir une règle d'autoscaling pour faire évoluer automatiquement vos instances backend lorsque votre métrique personnalisée configurée dépasse 80%. Pour ce faire, utilisez des métriques d'autoscaling basées sur le trafic (autoscaling.googleapis.com|gclb-capacity-fullness). Pour en savoir plus, consultez la section Autoscaling basé sur le trafic de l'équilibreur de charge.

Équilibreurs de charge et backends compatibles

Les métriques personnalisées sont compatibles avec les équilibreurs de charge d'application suivants:

  • Équilibreur de charge d'application externe global
  • Équilibreur de charge d'application externe régional
  • Équilibreur de charge d'application interne interrégional
  • Équilibreur de charge d'application interne régional

Les métriques personnalisées sont compatibles avec les types de backend suivants:

  • Groupes d'instances gérés
  • NEG zonaux (avec des points de terminaison GCE_VM_IP_PORT)
  • NEG de connectivité hybride

Fonctionnement des métriques personnalisées

Pour permettre à votre équilibreur de charge de prendre des décisions de distribution du trafic en fonction de métriques personnalisées, vous devez d'abord déterminer les métriques les plus pertinentes pour votre application spécifique. Une fois que vous savez quelles métriques vous souhaitez utiliser, vous configurez vos backends pour commencer à signaler un flux régulier de ces métriques à votre équilibreur de charge. Google Cloud vous permet de signaler des métriques dans l'en-tête de chaque réponse HTTP envoyée par les backends à votre équilibreur de charge. Ces métriques sont encapsulées dans un en-tête de réponse HTTP personnalisé et doivent respecter la norme ORCA (Open Request Cost Aggregation).

Les métriques peuvent être configurées à deux niveaux:

  • Au niveau du backend, pour influencer la sélection du backend (MIG ou NEG)
  • Au niveau du service de backend, pour influencer la sélection de l'instance de VM ou du point de terminaison

Les sections suivantes décrivent le fonctionnement des métriques personnalisées.

Déterminer quelles métriques personnalisées doivent influencer les décisions d'équilibrage de charge

Déterminer quelles métriques personnalisées doivent influencer les décisions d'équilibrage de charge est très subjectif et dépend des besoins de vos applications. Par exemple, si vos applications présentent des latences de traitement backend de l'ordre de quelques secondes, vous pouvez envisager d'équilibrer la charge des requêtes en fonction d'autres métriques personnalisées plutôt que des latences réseau standards.

Une fois que vous avez déterminé les métriques que vous souhaitez utiliser, vous devez également déterminer le seuil d'utilisation maximal pour chaque métrique. Par exemple, si vous souhaitez utiliser l'utilisation de la mémoire comme métrique, vous devez également déterminer le seuil d'utilisation maximale de la mémoire pour chaque backend.

Par exemple, si vous configurez une métrique appelée example-custom-metric, avec son seuil d'utilisation maximale défini sur 0,8, l'équilibreur de charge ajuste dynamiquement la distribution du trafic entre les backends pour que la métrique example-custom-metric signalée par le backend soit inférieure à 0,8, dans la mesure du possible.

Vous pouvez utiliser deux types de métriques personnalisées:

  • Métriques réservées Il existe cinq noms de métriques réservés, car ils correspondent à des champs prédéfinis de premier niveau dans l'API ORCA.

    • orca.cpu_utilization
    • orca.mem_utilization
    • orca.application_utilization
    • orca.eps
    • orca.rps_fractional
  • Métriques nommées : métriques propres à votre application que vous spécifiez à l'aide du champ named_metrics ORCA au format suivant :

    orca.named_metrics.METRIC_NAME
    

    Toutes les métriques personnalisées définies par l'utilisateur sont spécifiées à l'aide de ce mappage named_metrics au format paires nom/valeur.

Métriques requises

Pour permettre à votre équilibreur de charge d'utiliser des métriques personnalisées pour la sélection du groupe d'instances de VM backend ou du groupe de points de terminaison réseau, vous devez spécifier au moins l'une des métriques d'utilisation suivantes dans la liste suivante du rapport de charge ORCA envoyé à l'équilibreur de charge:

  • orca.cpu_utilization ou
  • orca.application_utilization ou
  • orca.mem_utilization ou
  • orca.named_metrics, qui est une carte des métriques définies par l'utilisateur sous la forme de paires nom/valeur.

De plus, pour permettre à votre équilibreur de charge d'utiliser des métriques personnalisées pour influencer davantage la sélection de l'instance ou du point de terminaison de la VM de backend, vous devez fournir toutes les métriques suivantes dans le rapport de charge ORCA envoyé à l'équilibreur de charge. L'équilibreur de charge utilise des pondérations calculées à partir de ces métriques pour attribuer la charge à des backends individuels.

  • orca.rps_fractional (requêtes par seconde)
  • orca.eps (erreurs par seconde) et,
  • une métrique d'utilisation avec l'ordre de priorité suivant :
    • orca.application_utilization
    • orca.cpu_utilization
    • métriques définies par l'utilisateur dans la carte orca.named_metrics

Remarques supplémentaires :

  • Chaque backend est limité à deux métriques personnalisées. Toutefois, vous pouvez effectuer des tests dryRun avec un maximum de trois métriques personnalisées.

    Si deux métriques sont fournies, l'équilibreur de charge les traite indépendamment. Par exemple, si vous définissez deux dimensions: custom-metric-util1 et custom-metric-util2, l'équilibreur de charge les traite indépendamment. Si un backend s'exécute à un niveau d'utilisation élevé en termes de custom-metric-util1, l'équilibreur de charge évite d'envoyer du trafic vers ce backend. En général, l'équilibreur de charge tente de maintenir tous les backends en cours d'exécution avec à peu près la même charge. La plénitude est calculée comme currentUtilization / maxUtilization. Dans ce cas, l'équilibreur de charge utilise la valeur de remplissage la plus élevée des deux métriques pour prendre des décisions d'équilibrage de charge.

  • Le nombre de métriques personnalisées est limité à deux par service backend. Toutefois, vous pouvez effectuer des tests dryRun avec un maximum de trois métriques personnalisées. Cette limite n'inclut pas les métriques orca.eps et orca.rps_fractional requises. Cette limite est également indépendante des métriques configurées au niveau du backend.

  • Vous pouvez utiliser à la fois des métriques réservées et des métriques nommées. Par exemple, orca.cpu_utilization = 0.5 et une métrique personnalisée telle que orca.named_metrics.queue_depth_util = 0.2 peuvent être fournies dans un seul rapport de charge.

  • Les noms de métriques personnalisées ne doivent pas contenir d'informations réglementées, sensibles, identifiables ou autres informations confidentielles que quiconque ne faisant pas partie de votre organisation ne doit pas voir.

Encodages disponibles pour la spécification de métrique personnalisée

  • JSON

    Exemple d'encodage JSON d'un rapport de charge:

    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}}.
    
  • Protobuf binaire

    Pour le code compatible avec Protocol Buffers, il s'agit d'un protobuf OrcaLoadReport encodé en base64 sérialisé de manière binaire dans endpoint-load-metrics-bin ou endpoint-load-metrics: BIN.

  • HTTP natif

    Paires clé-valeur séparées par une virgule dans endpoint-load-metrics. Voici une représentation textuelle aplatie de l'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 spécification gRPC exige que les métriques soient fournies à l'aide de métadonnées finales à l'aide de la clé endpoint-load-metrics-bin.

Configuration du backend pour générer des rapports sur les métriques personnalisées

Une fois que vous avez déterminé les métriques que vous souhaitez que l'équilibreur de charge utilise, vous configurez vos backends pour compiler les métriques personnalisées requises dans un rapport de charge ORCA et indiquez leurs valeurs dans chaque en-tête de réponse HTTP envoyé à l'équilibreur de charge.

Par exemple, si vous avez choisi orca.cpu_utilization comme métrique personnalisée pour un backend, ce backend doit signaler l'utilisation actuelle du processeur à l'équilibreur de charge dans chaque paquet envoyé à l'équilibreur de charge. Pour obtenir des instructions, consultez la section Envoyer des métriques à l'équilibreur de charge sur cette page.

Configuration de l'équilibreur de charge pour prendre en charge les métriques personnalisées

Pour permettre à l'équilibreur de charge d'utiliser les valeurs de métriques personnalisées signalées par les backends pour prendre des décisions de distribution du trafic, vous devez définir le mode d'équilibrage de charge de chaque backend sur CUSTOM_METRICS et la règle de localité d'équilibrage de charge du service de backend sur WEIGHTED_ROUND_ROBIN.

Fonctionnement des métriques personnalisées avec les équilibreurs de charge d'application
Fonctionnement des métriques personnalisées avec les équilibreurs de charge d'application (cliquez pour agrandir).
  • Mode d'équilibrage CUSTOM_METRICS Chacun de vos backends dans un service de backend doit être configuré pour utiliser le mode d'équilibrage CUSTOM_METRICS. Lorsqu'un backend est configuré avec le mode d'équilibrage CUSTOM_METRICS, l'équilibreur de charge redirige le trafic vers les backends en fonction du seuil d'utilisation maximal configuré pour chaque métrique personnalisée.

    Chaque backend peut spécifier un ensemble de métriques à inclure dans les rapports. Si plusieurs métriques personnalisées sont configurées par backend, l'équilibreur de charge tente de distribuer le trafic de sorte que toutes les métriques restent en dessous des limites d'utilisation maximales configurées.

    Le trafic est équilibré entre les backends en fonction de l'algorithme d'équilibrage de charge que vous choisissez. Par exemple, l'algorithme WATERFALL_BY_REGION par défaut essaie de maintenir tous les backends en cours d'exécution avec le même niveau d'occupation.

  • Règle d'équilibrage de charge de la localité WEIGHTED_ROUND_ROBIN La règle d'équilibrage de charge de la localité du service de backend doit être définie sur WEIGHTED_ROUND_ROBIN. Avec cette configuration, l'équilibreur de charge utilise également les métriques personnalisées pour sélectionner l'instance ou le point de terminaison optimal dans le backend pour traiter la requête.

Configurer des métriques personnalisées

Pour permettre à vos équilibreurs de charge d'application de prendre des décisions d'équilibrage de charge en fonction de métriques personnalisées, procédez comme suit:

  1. Déterminez les métriques personnalisées que vous souhaitez utiliser.
  2. Configurez les backends pour qu'ils transmettent des métriques personnalisées à l'équilibreur de charge. Vous devez établir un flux de données pouvant être envoyé à l'équilibreur de charge pour être utilisé pour les décisions d'équilibrage de charge. Ces métriques doivent être compilées et encodées dans un rapport de charge ORCA, puis transmises à l'équilibreur de charge à l'aide d'en-têtes de réponse HTTP.
  3. Configurez l'équilibreur de charge pour qu'il utilise les valeurs de métrique personnalisées générées par les backends.

Déterminer les métriques personnalisées

Cette étape est très subjective et dépend des besoins de vos propres applications. Une fois que vous avez déterminé les métriques que vous souhaitez utiliser, vous devez également déterminer le seuil d'utilisation maximal pour chaque métrique. Par exemple, si vous souhaitez utiliser l'utilisation de la mémoire comme métrique, vous devez également déterminer le seuil d'utilisation maximale de la mémoire pour chaque backend.

Avant de configurer l'équilibreur de charge, assurez-vous d'avoir consulté les types de métriques personnalisées disponibles (réservés et nommés) et les exigences de sélection des métriques dans la section Fonctionnement des métriques personnalisées.

Configurer les backends pour envoyer des métriques à l'équilibreur de charge

Les métriques personnalisées sont signalées aux équilibreurs de charge dans chaque réponse HTTP de vos backends d'application à l'aide de la norme ORCA. Cette section explique comment compiler les métriques personnalisées dans un rapport de charge ORCA et les enregistrer dans chaque en-tête de réponse HTTP envoyé à l'équilibreur de charge.

Par exemple, si vous utilisez l'encodage de texte HTTP, l'en-tête doit indiquer les métriques au format suivant.

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

Quel que soit le format d'encodage utilisé, veillez à supprimer le préfixe orca. du nom de la métrique lorsque vous créez le rapport sur la charge.

Voici un extrait de code qui montre comment ajouter deux métriques personnalisées (customUtilA et customUtilB) à vos en-têtes HTTP. Cet extrait de code montre à la fois l'encodage de texte HTTP natif et l'encodage base64. Notez que cet exemple code en dur les valeurs de customUtilA et customUtilB uniquement pour plus de simplicité. Votre équilibreur de charge doit recevoir les valeurs des métriques que vous avez déterminées pour influencer l'équilibrage de charge.

...
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{"", ""}
        }
}
...

Configurer l'équilibreur de charge pour utiliser des métriques personnalisées

Pour que l'équilibreur de charge utilise ces métriques personnalisées lors de la sélection d'un backend, vous devez définir le mode d'équilibrage de chaque backend sur CUSTOM_METRICS. De plus, si vous souhaitez que les métriques personnalisées influencent également la sélection des points de terminaison, définissez la règle d'équilibrage de charge de la localité sur WEIGHTED_ROUND_ROBIN.

Les étapes décrites dans cette section supposent que vous avez déjà déployé un équilibreur de charge avec des backends de NEG zonaux. Toutefois, vous pouvez utiliser les mêmes options --custom-metrics présentées ici pour mettre à jour n'importe quel backend existant à l'aide de la commande gcloud compute backend-services update.

  1. Vous pouvez définir le mode d'équilibrage d'un backend sur CUSTOM_METRICS lorsque vous ajoutez le backend au service de backend. Vous utilisez l'indicateur --custom-metrics pour spécifier votre métrique personnalisée et le seuil à utiliser pour les décisions d'équilibrage de charge.

    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'
    

    Remplacez les éléments suivants :

    • BACKEND_METRIC_NAME: les noms de métriques personnalisées utilisés ici doivent correspondre aux noms de métriques personnalisées signalés par le rapport ORCA du backend.
    • MAX_UTILIZATION_FOR_METRIC: utilisation maximale que les algorithmes d'équilibrage de charge doivent cibler pour chaque métrique.

    Par exemple, si vos backends génèrent deux métriques personnalisées, customUtilA et customUtilB (comme indiqué dans la section Configurer les backends pour générer des métriques à l'équilibreur de charge), vous devez utiliser la commande suivante pour configurer votre équilibreur de charge afin qu'il utilise ces métriques:

    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'
    

    Vous pouvez également fournir une liste de métriques personnalisées dans un fichier JSON structuré:

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

    Ensuite, joignez le fichier de métriques au format JSON au backend comme suit:

    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'
    

    Si vous souhaitez tester si les métriques sont signalées sans affecter réellement l'équilibreur de charge, vous pouvez définir l'indicateur dryRun sur true lors de la configuration de la métrique comme suit:

    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'
    

    Lorsqu'une métrique est configurée avec dryRun défini sur true, la métrique est signalée à Monitoring, mais elle n'est pas réellement utilisée par l'équilibreur de charge.

    Pour inverser ce processus, mettez à jour le service de backend avec l'indicateur dryRun défini sur 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'
    

    Si toutes vos métriques personnalisées sont configurées avec dryRun défini sur true, définir le mode d'équilibrage sur CUSTOM_METRICS ou la règle d'équilibrage de charge de localité sur WEIGHTED_ROUND_ROBIN n'aura aucun effet sur l'équilibreur de charge.

  2. Pour configurer l'équilibreur de charge afin qu'il utilise les métriques personnalisées pour influencer la sélection des points de terminaison, définissez la règle d'équilibrage de charge de la localité du service de backend sur WEIGHTED_ROUND_ROBIN.

    Par exemple, si vous disposez d'un service de backend déjà configuré avec les backends appropriés, vous configurez la règle d'équilibrage de charge en localité comme suit:

    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
    

    Comme indiqué précédemment pour les métriques au niveau du backend, vous pouvez également fournir une liste de métriques personnalisées dans un fichier JSON structuré au niveau du service backend. Utilisez le champ --custom-metrics-file pour associer le fichier de métriques au service de backend.

Étape suivante