Benutzerdefinierte Messwerte für Autoscaling verfügbar machen

In diesem Dokument wird beschrieben, wie Sie einen oder mehrere Messwerte aus einem Pod oder einer Arbeitslast an Ihr Autoscaling senden.

Diese Messwerte stammen aus dem Dienst oder der Anwendung, die Sie ausführen. Ein Beispiel für bereitgestellte Messwerte sind die Messwerte, die von der vLLM Engine bereitgestellt werden.

Das Autoscaling für Arbeitslasten kann diese Daten dann verwenden, um Arbeitslasten effizienter zu skalieren. Sie können diese Funktion beispielsweise verwenden, um die Warteschlangentiefe oder aktive Anfragen zu beobachten und dann dem Autoscaling zu erlauben, die Anzahl der Pods zu erhöhen oder zu verringern. Im vLLM-Beispiel ist ein Messwert, der nützlich sein kann, um die Nutzung zu verfolgen vllm:gpu_cache_usage_perc.

Voraussetzungen

Für die Pods gelten folgende Voraussetzungen:

Für die Messwerte gelten folgende Voraussetzungen:

  • Messwerte müssen über einen HTTP-Endpunkt zugänglich sein. Der Endpunktpfad ist standardmäßig /metrics.
  • Messwerte müssen gemäß dem Prometheus-Standard formatiert sein.
  • Es werden nur Gauge-Messwerte unterstützt.
  • Labelschlüssel in Pod-Labelselektoren dürfen keine Sonderzeichen enthalten. Es werden nur Klein- und Großbuchstaben (a–z), Ziffern, Bindestriche und Unterstriche unterstützt.
  • Wenn Sie nach Messwertlabels filtern, muss der Labelschlüssel mit dem regulären Ausdruck ^[a-zA-Z_][a-zA-Z0-9_]* übereinstimmen. Er muss also mit einem Buchstaben oder einem Unterstrich beginnen und darf nur Buchstaben, Ziffern oder Unterstriche enthalten.
  • Pro Cluster können maximal 20 eindeutige Messwerte bereitgestellt werden.

Messwerte für Autoscaling bereitstellen

  1. Wählen Sie einen Messwert aus, der bereitgestellt werden soll. Sie können einen beliebigen Messwert auswählen, der von Ihrer Arbeitslast bereitgestellt wird und die im vorherigen Abschnitt aufgeführten Anforderungen erfüllt.

    Wenn Ihre Arbeitslast mehrere Messwerte mit demselben Namen, aber unterschiedlichen Labels bereitstellt, fügen Sie einen Labelfilter hinzu, damit nur einer ausgewählt wird.

  2. Fügen Sie die folgende benutzerdefinierte Ressource hinzu und ersetzen Sie die Details, die für Ihren Messwert und Pod spezifisch sind:

    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
    

    Ersetzen Sie Folgendes, damit es Ihrer Arbeitslast entspricht:

    • NAME: Der Name des AutoscalingMetric-Objekts.
    • NAMESPACE: Der Namespace, in dem sich die Pods befinden.
    • APP_LABEL_NAME und APP_LABEL_VALUE: Der Labelname und -wert, die mit den Pods übereinstimmen, die den Messwert ausgeben.
    • METRIC_PORT: Die Portnummer.
    • METRIC_PATH: Der Pfad zum Messwert. Prüfen Sie den Pfad, der von Ihrem Dienst oder Ihrer Anwendung verwendet wird. Dieser Pfad ist oft /metrics.
    • METRIC: Der Name des Messwerts, den Sie bereitstellen. Der Name muss mit dem regulären Ausdruck ^[a-z]([-a-z0-9]*[a-z0-9])? übereinstimmen und darf nicht länger als 63 Zeichen sein. Das bedeutet, dass das erste Zeichen ein Kleinbuchstabe sein muss und alle folgenden Zeichen Bindestriche, Kleinbuchstaben oder Ziffern sein müssen. Das letzte Zeichen darf kein Bindestrich sein.
    • Optional: METRIC_PROMETHEUS_NAME: Der Prometheus-Messwertname, wie er vom Pod bereitgestellt wird. Sie können dieses Feld verwenden, um den Messwert umzubenennen, z. B. weil der vom Pod bereitgestellte Messwertname nicht den vom Autoscaling festgelegten Namensbeschränkungen entspricht.

      Weitere Informationen zu Namensbeschränkungen finden Sie unter Einschränkungen für horizontales Pod-Autoscaling.

  3. Führen Sie den folgenden Befehl aus, um das Manifest anzuwenden:

    kubectl apply -f FILE_NAME_AUTOSCALING_METRIC.yaml
    

    Ersetzen Sie FILE_NAME_AUTOSCALING_METRIC durch den Namen der YAML-Datei.

    Nachdem Sie die benutzerdefinierte Ressource hinzugefügt haben, wird der Messwert an die Autoscaling API gesendet. Der Messwert wird alle paar Sekunden gelesen und an das Autoscaling für Arbeitslasten gesendet.

  4. Nachdem Sie die Messwerte für das Autoscaling bereitgestellt haben, können Sie das Autoscaling für Arbeitslasten so konfigurieren, dass diese Messwerte verwendet werden. Fügen Sie dazu die folgende benutzerdefinierte Ressource hinzu:

    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
    

    Ersetzen Sie Folgendes, damit es Ihrer Arbeitslast entspricht:

    • NAME_HPA: Der Name des HorizontalPodAutoscaler-Objekts.
    • NAMESPACE: Der Namespace, in dem sich die Pods befinden.
    • DEPLOYMENT: Der Name der Bereitstellung, auf die Sie abzielen.
    • MIN_REPLICAS: Die Mindestanzahl von Replikaten, auf die die Bereitstellung skaliert werden kann.
    • MAX_REPLICAS: Die maximale Anzahl von Replikaten, auf die die Bereitstellung skaliert werden kann.
    • NAME: Der Name des AutoscalingMetric-Objekts.
    • METRIC: Der Name des Messwerts, den Sie bereitstellen.
    • AVERAGE_VALUE: Der durchschnittliche Zielwert für den Messwert. Das Autoscaling passt die Anzahl der Replikate an, um einen durchschnittlichen Messwert für alle Pods beizubehalten.
  5. Führen Sie den folgenden Befehl aus, um das Manifest anzuwenden:

    kubectl apply -f FILE_NAME_HPA.yaml
    

    Ersetzen Sie FILE_NAME_HPA durch den Namen der YAML-Datei.

Messwerte mit Messwertlabels filtern

Das Filtern von Messwerten mit Messwertlabels ist in GKE 1.36.0-gke.1759000 oder höher verfügbar.

Messwerte enthalten oft Labels. Labels sind Schlüssel/Wert-Paare, mit denen Sie einem Wert Dimensionen hinzufügen können. Für einen Messwert, der die Anzahl der Anfragen an einen HTTP-Endpunkt nach Methode und Umgebung aufschlüsselt, können beispielsweise Labels verwendet werden, um diesen Kontext anzugeben. Dieses Beispiel könnte so aussehen:

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

Mit Labelfiltern können Sie dafür sorgen, dass Ihre Messwertspezifikation genau mit einem Messwert übereinstimmt. Wenn Sie beispielsweise nur den ersten Messwert im vorherigen Beispiel auswählen möchten, verwenden Sie die folgende Spezifikation für den AutoscalingMetric-Messwert 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

Die Schlüssel der matchLabels-Schlüssel/Wert-Paare müssen mit dem regulären Ausdruck ^[a-zA-Z_][a-zA-Z0-9_]* übereinstimmen. Sie müssen also mit einem Buchstaben oder einem Unterstrich beginnen und dürfen nur Buchstaben, Ziffern oder Unterstriche enthalten.

Fehlerbehebung bei Messwerten, die für das Autoscaling bereitgestellt werden

Sie können den Status der benutzerdefinierten Ressource AutoscalingMetric prüfen, um nach Konfigurationsfehlern zu suchen. Anleitung:

  1. Prüfen Sie die benutzerdefinierte Ressource AutoscalingMetric, indem Sie den folgenden Befehl ausführen:

    kubectl describe autoscalingmetric NAME -n NAMESPACE
    
  2. Im Feld Status finden Sie Informationen zu konfigurierten Messwerten, z. B. Warnungen zu Konfigurationsfehlern und den genauen Namen des Messwerts, wie er im HorizontalPodAutoscaler-Objekt angezeigt werden sollte.

Nächste Schritte