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 von dem Dienst oder der Anwendung, die Sie ausführen. Von der vLLM Engine bereitgestellte Messwerte

Der Load-Balancer kann diese Daten dann für das auslastungsbasierte Load-Balancing verwenden, um Arbeitslasten effizienter zu verteilen. Sie können dieses Feature beispielsweise verwenden, um die Regionen mit einer höheren Arbeitslast zu überwachen und den Load Balancer dann den Traffic an die Region mit den verfügbaren Ressourcen umleiten zu lassen. Im vLLM-Beispiel ist vllm:gpu_cache_usage_perc eine Metrik, die sich für die Nachverfolgung der Auslastung eignet.

Voraussetzungen

Für die Pods gelten die folgenden Anforderungen:

Für die Messwerte gelten die folgenden Anforderungen.

  • Messwerte müssen über einen HTTP-Endpunkt in den Pods verfügbar sein, die von Ihrem Gateway per Load-Balancing 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 länger als 64 Zeichen sein. Eine vollständige Liste der Einschränkungen finden Sie in der API-Referenz zu BackendService unter den 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 für Zähler zwischen 0 und 1 unterstützt. Der Wert 1 steht für eine Auslastung von 100%.

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

  • Pro Cluster können maximal 20 eindeutige Messwerte verfügbar gemacht werden. Für andere Dienste gelten eigene Limits. Weitere Informationen finden Sie beispielsweise unter Limits und Anforderungen für Load Balancer. Ein Cluster kann mehrere Load-Balancer verwenden.

GKE Utilization-Based Balancing (UBB) basierend auf benutzerdefinierten Messwerten

Mit der GKE-nutzungsbasierten Lastverteilung (Utilization-Based Balancing, UBB) können Sie den Load Balancer so konfigurieren, dass er Traffic basierend auf der Auslastung Ihrer Backend-Pods verteilt. 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 für Dienste verwenden, die Sie über die Gateway API bereitstellen. GKE verwendet den GKE Gateway Controller, um mit der Gateway API zu interagieren. Die Service- und Ingress-APIs 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 mit benutzerdefinierten Messwerten nicht 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 verfügbar gemacht werden soll. Sie können jeden Messwert auswählen, der von Ihrem Server bereitgestellt wird und die Anforderungen im vorherigen Abschnitt 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 die folgenden Werte durch die Werte für Ihre Arbeitslast:

    • 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 von Ihrem Dienst oder Ihrer Anwendung verwendeten Pfad. 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 maximal 63 Zeichen lang sein. Das erste Zeichen muss ein Kleinbuchstabe sein. 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. Sie können dieses Feld verwenden, um den Messwert umzubenennen, 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 zu BackendService unter den 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.

    Nachdem Sie die benutzerdefinierte Ressource hinzugefügt haben, wird der Messwert an die Autoscaling API übertragen. 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 für Messwerte, die von Prometheus gemeldet werden, ein anderer Namensstandard gilt. Wenn die Messwerte für das Load-Balancing gemeldet werden, wird ihnen vom GKE Metrics Agent intern das Präfix gke.named_metrics. vorangestellt, um die BackendService API-Anforderung zu erfüllen.

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

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

Weitere Informationen zum Arbeiten mit dem Load-Balancer finden Sie unter Auslastungsbasiertes Load-Balancing für GKE-Dienste konfigurieren.

Fehlerbehebung bei Messwerten, die für den Load-Balancer verfügbar gemacht werden

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

Nächste Schritte