Benutzerdefinierte Messwerte für Load Balancer verfügbar machen

In diesem Dokument wird beschrieben, wie Sie einen oder mehrere Messwerte von einem Pod oder einer Arbeitslast an Ihren Load-Balancer senden.

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

Der Load-Balancer kann diese Daten dann mit der auslastungsbasierten Lastverteilung verwenden, um Arbeitslasten effizienter zu verteilen. Mit dieser Funktion können Sie beispielsweise die Regionen mit höherer Arbeitslastnutzung beobachten und den Load-Balancer dann Traffic an die Region mit den verfügbaren Ressourcen weiterleiten lassen. Im vLLM-Beispiel ist ein Messwert, mit dem sich die Auslastung verfolgen lässt, vllm:gpu_cache_usage_perc.

Voraussetzungen

Für die Pods gelten folgende Voraussetzungen:

Für die Messwerte gelten folgende Voraussetzungen:

  • Auf Messwerte muss über einen HTTP-Endpunkt unter den Pods zugegriffen werden können, die von Ihrem Gateway verteilt werden. Der Standardendpunktpfad ist /metrics.
  • Messwerte müssen gemäß dem Prometheus-Standard formatiert sein.
  • Für Load-Balancer gelten Einschränkungen für Messwertnamen. Der Name darf beispielsweise nicht mehr als 64 Zeichen enthalten. Eine vollständige Liste der Einschränkungen finden Sie in der API-Referenz für BackendService unter Details zum Feld backends[].customMetrics[].name.

    Wenn der Messwert Ihres Dienstes diesen Einschränkungen nicht entspricht, können Sie ihn mit dem Feld exportName umbenennen.

  • Es werden nur Messwerte vom Typ „Gauge“ zwischen 0 und 1 unterstützt, wobei 1 einer Auslastung von 100 % entspricht.

  • Labelnamen in Pod-Labelselektoren dürfen keine Sonderzeichen enthalten. Es werden nur Buchstaben von a bis z (Klein- oder Großbuchstaben), Ziffern, Bindestriche und Unterstriche unterstützt.

  • Pro Cluster können maximal 20 eindeutige Messwerte bereitgestellt werden. Für andere Dienste gelten eigene Limits. Informationen finden Sie beispielsweise unter den Limits und Anforderungen für Load-Balancer. Ein Cluster kann mehr als einen Load Balancer verwenden.

Auslastungsbasiertes GKE-Balancing (UBB) basierend auf benutzerdefinierten Messwerten

Mit dem auslastungsbasierten GKE-Balancing (UBB) können Sie den Load-Balancer Traffic basierend auf der Auslastung Ihrer Backend-Pods verteilen lassen. Anstatt sich auf einen generischen Messwert wie die CPU zu verlassen, können Sie UBB so konfigurieren, dass benutzerdefinierte Messwerte verwendet werden, die für die Leistung Ihrer Anwendung relevanter sind.

Wenn Sie UBB mit benutzerdefinierten Messwerten in GKE verwenden, gelten die folgenden Einschränkungen:

  • Nur Gateway API:Sie können UBB mit benutzerdefinierten Messwerten nur mit Diensten verwenden, die Sie mit der Gateway API bereitstellen. GKE verwendet den GKE Gateway Controller, um mit der Gateway API zu interagieren. Die Service API und die Ingress API unterstützen UBB mit benutzerdefinierten Messwerten nicht. Die benutzerdefinierten Messwerte müssen von den Pods stammen, die Mitglieder der Dienste sind.
  • Kein Cloud Service Mesh:Sie können UBB nicht mit benutzerdefinierten Messwerten mit Cloud Service Mesh verwenden.
  • Nicht unterstützte Load-Balancer:Sie können UBB nicht mit benutzerdefinierten Messwerten mit externen Passthrough-Network-Load-Balancern und externen Proxy-Network-Load-Balancern verwenden.

Messwerte für Load-Balancing bereitstellen

  1. Wählen Sie einen Messwert aus, der bereitgestellt werden soll. Sie können einen beliebigen Messwert auswählen, der von Ihrem Server bereitgestellt wird und die im vorherigen Abschnitt aufgeführten Anforderungen erfüllt. In diesem Beispiel wird ein benutzerdefinierter Messwert namens queue_depth_util verwendet.

  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
              loadBalancing:
                enabled: true
    

    Ersetzen Sie Folgendes, um es an Ihre Arbeitslast anzupassen:

    • 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 den Pods entsprechen, 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 dem regulären Ausdruck ^[a-z]([a-z0-9_-]*[a-z0-9])? entsprechen und darf nicht länger als 63 Zeichen sein. Das erste Zeichen muss also ein Kleinbuchstabe und alle folgenden Zeichen müssen Bindestriche, Unterstriche, Kleinbuchstaben oder Ziffern sein, mit Ausnahme des letzten Zeichens, das ein Buchstabe oder eine Ziffer sein muss.
    • Optional: METRIC_PROMETHEUS_NAME: der Prometheus-Messwertname, wie er vom Pod bereitgestellt wird. Mit diesem Feld können Sie den Messwert umbenennen, z. B. weil der vom Pod bereitgestellte Messwertname nicht den vom Load-Balancer festgelegten Namensbeschränkungen entspricht.

      Eine vollständige Liste der Einschränkungen finden Sie in der API-Referenz für BackendService unter Details zum Feld backends[].customMetrics[].name.

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

    kubectl apply -f FILE_NAME.yaml
    

    Ersetzen Sie FILE_NAME durch den Namen der YAML-Datei.

    Wenn Sie die benutzerdefinierte Ressource hinzugefügt haben, wird der Messwert an die Autoscaling API gesendet. Der Messwert wird alle paar Sekunden gelesen und an den Load-Balancer gesendet.

  4. Wenn Sie dieses Signal für das Load-Balancing verwenden möchten, geben Sie eine GCPBackendPolicy an. Beispiel:

    kind: GCPBackendPolicy
    apiVersion: networking.gke.io/v1
    metadata:
      name: my-backend-policy
    spec:
      targetRef:
        group: ""
        kind: Service
        name: store-v1
      default:
        balancingMode: CUSTOM_METRICS
        customMetrics:
        -   name: gke.named_metrics.queue_depth_util
            dryRun: false
    

Beachten Sie, dass die von Prometheus gemeldeten Messwerte einem anderen Namensstandard folgen. Wenn die Messwerte für das Load-Balancing gemeldet werden, fügt der GKE Metrics Agent intern das Präfix gke.named_metrics. hinzu, um die Anforderung der BackendService API zu erfüllen.

Wenn Sie einen zweiten Messwert bereitstellen möchten, führen Sie dieselben Schritte aus, um eine weitere benutzerdefinierte Ressource zu erstellen.

Nachdem Sie die Messwerte für den Load-Balancer bereitgestellt haben, können Sie den Load-Balancer so konfigurieren, dass diese Messwerte verwendet werden. Weitere Informationen finden Sie unter Load-Balancer für die Verwendung benutzerdefinierter Messwerte konfigurieren.

Weitere Informationen zur Verwendung des Load-Balancers finden Sie unter Auslastungsbasiertes Load-Balancing für GKE-Dienste konfigurieren.

Fehlerbehebung bei Messwerten, die für den Load-Balancer bereitgestellt werden

So prüfen Sie, ob die Messwerte korrekt für den Load-Balancer bereitgestellt werden:

Nächste Schritte