Exposer des métriques personnalisées pour l'autoscaling

Ce document explique comment envoyer une ou plusieurs métriques d'un pod ou d'une charge de travail à votre autoscaler.

Ces métriques proviennent du service ou de l'application que vous exécutez. Pour obtenir un exemple de métriques exposées, consultez les métriques exposées par le moteur vLLM.

L'autoscaler de charge de travail peut ensuite utiliser ces données pour mettre à l'échelle les charges de travail plus efficacement. Par exemple, vous pouvez utiliser cette fonctionnalité pour surveiller la profondeur de la file d'attente ou les requêtes actives, puis autoriser l'autoscaler à augmenter ou diminuer le nombre de pods. Dans l'exemple vLLM, vllm:gpu_cache_usage_perc est une métrique qui peut être utile pour suivre l'utilisation.

Conditions requises

Voici les exigences concernant les pods :

  • GKE 1.35.1-gke.1396000 ou version ultérieure avec des clusters dans le canal rapide.
  • Utiliser l'autoscaling horizontal des pods avec le profil de performances.

Les exigences concernant les métriques sont les suivantes.

  • Les métriques doivent être accessibles sur un point de terminaison HTTP. Le chemin du point de terminaison est /metrics par défaut.
  • Les métriques doivent être mises en forme conformément à la norme Prometheus.
  • Seules les métriques de jauge sont acceptées.
  • Les noms de libellés dans les sélecteurs de libellés de pod ne doivent pas contenir de caractères spéciaux. Seules les lettres de a à z (minuscules ou majuscules), les chiffres, les tirets et les traits de soulignement sont acceptés.
  • Lorsque vous utilisez le filtrage basé sur les étiquettes de métriques, la clé d'étiquette doit correspondre à l'expression régulière ^[a-zA-Z_][a-zA-Z0-9_]* (commencer par une lettre ou un trait de soulignement, et ne contenir que des lettres, des chiffres ou des traits de soulignement).
  • Vous pouvez exposer jusqu'à 20 métriques uniques par cluster.

Exposer des métriques pour l'autoscaling

  1. Choisissez une métrique à exposer. Vous pouvez choisir n'importe quelle métrique exposée par votre charge de travail et qui répond également aux exigences listées dans la section précédente.

    Si votre charge de travail expose plusieurs métriques portant le même nom, mais avec des libellés différents, ajoutez un filtre de libellé pour vous assurer qu'une seule est sélectionnée.

  2. Ajoutez la ressource personnalisée suivante, en remplaçant les détails spécifiques à votre métrique et à votre pod :

    apiVersion: autoscaling.gke.io/v1beta1
    kind: AutoscalingMetric
    metadata:
      name: NAME
      namespace: NAMESPACE
    spec:
      metrics:
      - pod:
          selector:
            matchLabels:
              APP_LABEL_NAME: APP_LABEL_VALUE
          containers:
          - endpoint:
              port: METRIC_PORT
              path: METRIC_PATH
            metrics:
            - gauge:
                name: METRIC
                prometheusMetricName: METRIC_PROMETHEUS_NAME
    

    Remplacez les éléments suivants pour qu'ils correspondent à votre charge de travail :

    • NAME : nom de l'objet AutoscalingMetric.
    • NAMESPACE : espace de noms dans lequel se trouvent les pods.
    • APP_LABEL_NAME et APP_LABEL_VALUE : nom et valeur du libellé correspondant aux pods qui émettent la métrique.
    • METRIC_PORT : numéro de port.
    • METRIC_PATH : chemin d'accès à la métrique. Vérifiez le chemin d'accès utilisé par votre service ou application. Il s'agit souvent de /metrics.
    • METRIC : nom de la métrique que vous exposez. Le nom doit correspondre à l'expression régulière ^[a-z]([-a-z0-9]*[a-z0-9])? et ne pas dépasser 63 caractères. Cela signifie que le premier caractère doit être une lettre minuscule, et tous les caractères suivants doivent être des tirets, des lettres minuscules ou des chiffres, à l'exception du dernier caractère, qui ne peut pas être un tiret.
    • Facultatif : METRIC_PROMETHEUS_NAME : nom de la métrique Prometheus telle qu'exposée par le pod. Vous pouvez utiliser ce champ pour renommer la métrique, par exemple parce que le nom de la métrique exposée par le pod ne respecte pas les restrictions de nom définies par l'autoscaler.

      Pour en savoir plus sur les restrictions concernant les noms, consultez les limites de l'autoscaling horizontal de pods.

  3. Appliquez le fichier manifeste à l'aide de la commande suivante :

    kubectl apply -f FILE_NAME_AUTOSCALING_METRIC.yaml
    

    Remplacez FILE_NAME_AUTOSCALING_METRIC par le nom du fichier YAML.

    Une fois la ressource personnalisée ajoutée, la métrique est envoyée à l'API Autoscaling. La métrique est lue toutes les quelques secondes et envoyée à l'autoscaler de charge de travail.

  4. Maintenant que vous avez exposé les métriques à l'autoscaler, vous pouvez configurer l'autoscaler de charge de travail pour qu'il les utilise. Pour ce faire, ajoutez la ressource personnalisée suivante :

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: NAME_HPA
      namespace: NAMESPACE
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: DEPLOYMENT
      minReplicas: MIN_REPLICAS
      maxReplicas: MAX_REPLICAS
      metrics:
        - type: Pods
          pods:
            metric:
              name: autoscaling.gke.io|NAME|METRIC
            target:
              type: AverageValue
              averageValue: AVERAGE_VALUE
    

    Remplacez les éléments suivants pour qu'ils correspondent à votre charge de travail :

    • NAME_HPA : nom de l'objet HorizontalPodAutoscaler.
    • NAMESPACE : espace de noms dans lequel se trouvent les pods.
    • DEPLOYMENT : nom du déploiement que vous ciblez.
    • MIN_REPLICAS : nombre minimal d'instances répliquées vers lequel le déploiement peut évoluer.
    • MAX_REPLICAS : nombre maximal de répliques que le déploiement peut atteindre.
    • NAME : nom de l'objet AutoscalingMetric.
    • METRIC : nom de la métrique que vous exposez.
    • AVERAGE_VALUE : valeur moyenne cible pour la métrique. L'autoscaler ajuste le nombre de répliques pour maintenir une valeur de métrique moyenne sur tous les pods.
  5. Appliquez le fichier manifeste à l'aide de la commande suivante :

    kubectl apply -f FILE_NAME_HPA.yaml
    

    Remplacez FILE_NAME_HPA par le nom du fichier YAML.

Filtrer les métriques à l'aide d'étiquettes de métriques

Le filtrage des métriques à l'aide de libellés de métriques est disponible sur GKE 1.36.0-gke.1759000 ou version ultérieure.

Les métriques incluent souvent des libellés. Les libellés sont des paires clé/valeur qui vous permettent d'ajouter des dimensions à une valeur. Par exemple, une métrique comptabilisant le nombre de requêtes envoyées à un point de terminaison HTTP segmenté par méthode et environnement peut utiliser des libellés pour spécifier ce contexte. Voici un exemple :

http_requests_total{method="GET", env="prod"} 11111
http_requests_total{method="PUT", env="staging"} 22222

Vous pouvez utiliser des filtres de libellé pour vous assurer que votre spécification de métrique correspond exactement à une métrique. Par exemple, pour ne sélectionner que la première métrique de l'exemple précédent, utilisez la spécification suivante pour la métrique AutoscalingMetric gauge :

apiVersion: autoscaling.gke.io/v1beta1
kind: AutoscalingMetric
metadata:
  name: filter-sample
spec:
  # Several lines are omitted here.
      metrics:
      - gauge:
          name: http_requests_total
          filter:
            matchLabels:
              method: GET
              env: prod

Les clés des paires clé-valeur matchLabels doivent correspondre à l'expression régulière ^[a-zA-Z_][a-zA-Z0-9_]*, c'est-à-dire commencer par une lettre ou un trait de soulignement, et ne contenir que des lettres, des chiffres ou des traits de soulignement.

Résoudre les problèmes liés aux métriques exposées pour l'autoscaling

Vous pouvez examiner l'état de la ressource personnalisée AutoscalingMetric pour rechercher les erreurs de configuration. Pour ce faire :

  1. Inspectez la ressource personnalisée AutoscalingMetric en exécutant la commande suivante :

    kubectl describe autoscalingmetric NAME -n NAMESPACE
    
  2. Consultez le champ Status pour obtenir des informations sur les métriques configurées, telles que les avertissements concernant les erreurs de configuration et le nom exact de la métrique telle qu'elle doit apparaître dans l'objet HorizontalPodAutoscaler.

Étapes suivantes