Esporre metriche personalizzate per la scalabilità automatica

Questo documento descrive come inviare una o più metriche da un pod o un carico di lavoro al gestore della scalabilità automatica.

Queste metriche provengono dal servizio o dall'applicazione che stai eseguendo. Per un esempio di metriche esposte, consulta le metriche esposte da vLLM Engine.

Il gestore della scalabilità automatica del carico di lavoro può quindi utilizzare questi dati per scalare i carichi di lavoro in modo più efficiente. Ad esempio, puoi utilizzare questa funzionalità per monitorare la profondità della coda o le richieste attive e poi consentire al gestore della scalabilità automatica di aumentare o diminuire il numero di pod. Dall'esempio di vLLM, una metrica che potrebbe essere utile per monitorare l'utilizzo è vllm:gpu_cache_usage_perc.

Requisiti

I requisiti per i pod sono i seguenti:

I requisiti per le metriche sono i seguenti.

  • Le metriche devono essere accessibili su un endpoint HTTP. Il percorso dell'endpoint è /metrics per impostazione predefinita.
  • Le metriche devono essere formattate in base allo standard Prometheus.
  • Sono supportate solo le metriche di tipo misuratore.
  • I nomi delle etichette nei selettori di etichette dei pod non devono contenere caratteri speciali. Sono supportate solo le lettere a-z (minuscole o maiuscole), i numeri, i trattini e i trattini bassi.
  • Quando utilizzi il filtro basato sulle etichette delle metriche, la chiave di etichetta deve corrispondere all'espressione regolare ^[a-zA-Z_][a-zA-Z0-9_]* (inizia con una lettera o un trattino basso e contiene solo lettere, numeri o trattini bassi).
  • È possibile esporre un massimo di 20 metriche univoche per cluster.

Esporre le metriche per la scalabilità automatica

  1. Scegli una metrica da esporre. Puoi scegliere qualsiasi metrica esposta dal tuo carico di lavoro e che soddisfi anche i requisiti elencati nella sezione precedente.

    Se il carico di lavoro espone più metriche con lo stesso nome ma etichette diverse, aggiungi un filtro di etichette per assicurarti che ne venga selezionata una sola.

  2. Aggiungi la seguente risorsa personalizzata, sostituendo i dettagli specifici della metrica e del 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
    

    Sostituisci i seguenti valori in base al tuo carico di lavoro:

    • NAME: il nome dell'oggetto AutoscalingMetric.
    • NAMESPACE: lo spazio dei nomi in cui si trovano i pod.
    • APP_LABEL_NAME e APP_LABEL_VALUE: il nome e il valore dell'etichetta corrispondenti ai pod che emettono la metrica.
    • METRIC_PORT: il numero di porta.
    • METRIC_PATH: il percorso della metrica. Verifica il percorso utilizzato dal tuo servizio o dalla tua applicazione; questo percorso è spesso /metrics.
    • METRIC: il nome della metrica che stai esponendo. Il nome deve corrispondere all'espressione regolare ^[a-z]([-a-z0-9]*[a-z0-9])? e avere una lunghezza massima di 63 caratteri. Ciò significa che il primo carattere deve essere una lettera minuscola e tutti i caratteri successivi devono essere trattini, lettere minuscole o cifre, ad eccezione dell'ultimo carattere, che non può essere un trattino.
    • (Facoltativo) METRIC_PROMETHEUS_NAME: il nome della metrica Prometheus esposta dal pod. Puoi utilizzare questo campo per rinominare la metrica, ad esempio perché il nome della metrica esposta dal pod non è conforme alle limitazioni dei nomi impostate dal gestore della scalabilità automatica.

      Per informazioni dettagliate sulle limitazioni dei nomi, consulta limitazioni per la scalabilità automatica orizzontale dei pod.

  3. Applica il manifest utilizzando il seguente comando:

    kubectl apply -f FILE_NAME_AUTOSCALING_METRIC.yaml
    

    Sostituisci FILE_NAME_AUTOSCALING_METRIC con il nome del file YAML.

    Dopo aver aggiunto la risorsa personalizzata, la metrica viene inviata all'API di scalabilità automatica. La metrica viene letta ogni pochi secondi e inviata al gestore della scalabilità automatica del carico di lavoro.

  4. Ora che hai esposto le metriche al gestore della scalabilità automatica, puoi configurare il gestore della scalabilità automatica del carico di lavoro in modo che utilizzi queste metriche. Per farlo, aggiungi la seguente risorsa personalizzata:

    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
    

    Sostituisci i seguenti valori in base al tuo carico di lavoro:

    • NAME_HPA: il nome dell'oggetto HorizontalPodAutoscaler.
    • NAMESPACE: lo spazio dei nomi in cui si trovano i pod.
    • DEPLOYMENT: il nome del deployment di destinazione.
    • MIN_REPLICAS: il numero minimo di repliche a cui il deployment può essere scalato.
    • MAX_REPLICAS: il numero massimo di repliche a cui il deployment può essere scalato.
    • NAME: il nome dell'oggetto AutoscalingMetric.
    • METRIC: il nome della metrica che stai esponendo.
    • AVERAGE_VALUE: il valore medio target per la metrica. Il gestore della scalabilità automatica regola il numero di repliche per mantenere un valore medio della metrica in tutti i pod.
  5. Applica il manifest utilizzando il seguente comando:

    kubectl apply -f FILE_NAME_HPA.yaml
    

    Sostituisci FILE_NAME_HPA con il nome del file YAML.

Filtrare le metriche utilizzando le etichette delle metriche

Il filtro delle metriche utilizzando le etichette delle metriche è disponibile in GKE 1.36.0-gke.1759000 o versioni successive.

Le metriche spesso includono etichette. Le etichette sono coppie chiave-valore che consentono di aggiungere dimensioni a un valore. Ad esempio, una metrica che conta il numero di richieste a un endpoint HTTP suddivise per metodo e ambiente potrebbe utilizzare le etichette per specificare questo contesto. Questo esempio potrebbe essere simile al seguente:

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

Puoi utilizzare i filtri di etichette per assicurarti che la specifica della metrica corrisponda esattamente a una metrica. Ad esempio, per selezionare solo la prima metrica nell'esempio precedente, utilizza la seguente specifica per la metrica gauge di AutoscalingMetric:

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

Le chiavi delle coppie chiave-valore matchLabels devono corrispondere all'espressione regolare ^[a-zA-Z_][a-zA-Z0-9_]*: ovvero, iniziare con una lettera o un trattino basso e contenere solo lettere, numeri o trattini bassi.

Risolvere i problemi relativi alle metriche esposte per la scalabilità automatica

Puoi esaminare lo stato della risorsa personalizzata AutoscalingMetric per cercare errori di configurazione. Ecco come fare:

  1. Esamina la risorsa personalizzata AutoscalingMetric eseguendo il seguente comando:

    kubectl describe autoscalingmetric NAME -n NAMESPACE
    
  2. Consulta il campo Status per informazioni sulle metriche configurate, ad esempio avvisi relativi a errori di configurazione e il nome esatto della metrica così come dovrebbe apparire nell'oggetto HorizontalPodAutoscaler.

Passaggi successivi