Expor métricas personalizadas para balanceadores de carga

Este documento descreve como enviar uma ou mais métricas de um pod ou carga de trabalho para o balanceador de carga.

Essas métricas vêm do serviço ou aplicativo que você está executando. Por exemplo, consulte as métricas expostas pelo vLLM Engine.

Em seguida, o balanceador de carga pode usar esses dados com o balanceamento de carga com base na utilização para equilibrar as cargas de trabalho com mais eficiência. Por exemplo, é possível usar esse recurso para monitorar as regiões com maior uso de carga de trabalho e, em seguida, permitir que o balanceador de carga redirecione o tráfego para a região com mais recursos disponíveis. No exemplo do vLLM, uma métrica que pode ser útil para acompanhar a utilização é vllm:gpu_cache_usage_perc.

Requisitos

Os requisitos para os pods são os seguintes:

Os requisitos para as métricas são os seguintes:

  • As métricas precisam estar acessíveis em um endpoint HTTP nos pods que estão sendo balanceados por carga pelo gateway. O caminho de endpoint padrão é /metrics.
  • As métricas precisam ser formatadas de acordo com o padrão do Prometheus.
  • Os balanceadores de carga têm restrições quanto aos nomes das métricas. Por exemplo, o nome não pode ter mais de 64 caracteres. Para conferir a lista completa de restrições, consulte os detalhes sobre o campo backends[].customMetrics[].name na referência da API para BackendService.

    Se a métrica do seu serviço não obedecer a essas restrições, renomeie-a usando o campo exportName.

  • Somente métricas de indicador entre 0 e 1 são aceitas, sendo que 1 representa uma utilização de 100%.

  • Os nomes de rótulos nos seletores de rótulos de pods não podem conter caracteres especiais. Somente letras de a a z (minúsculas ou maiúsculas), números, hífens e sublinhados são aceitos.

  • É possível expor no máximo 20 métricas exclusivas por cluster. Outros serviços têm os próprios limites. Por exemplo, consulte os limites e requisitos para balanceadores de carga. Um cluster pode usar mais de um balanceador de carga.

Balanceamento baseado em utilização (UBB, na sigla em inglês) do GKE com base em métricas personalizadas

É possível usar o balanceamento baseado em utilização (UBB, na sigla em inglês) do GKE para permitir que o balanceador de carga distribua o tráfego com base na utilização dos pods de back-end. Em vez de depender de uma métrica genérica, como a CPU, é possível configurar o UBB para usar métricas personalizadas mais relevantes para o desempenho do seu aplicativo.

Ao usar o UBB com métricas personalizadas no GKE, as seguintes limitações se aplicam:

  • Somente API Gateway:só é possível usar o UBB com métricas personalizadas com serviços que você expõe usando a API Gateway. O GKE usa o controlador do GKE Gateway para interagir com a API Gateway. As APIs Service e Ingress não são compatíveis com UBB com métricas personalizadas. As métricas personalizadas precisam ser originadas dos pods que são membros dos serviços.
  • Sem Cloud Service Mesh:não é possível usar o UBB com métricas personalizadas com o Cloud Service Mesh.
  • Balanceadores de carga não compatíveis:não é possível usar UBB com métricas personalizadas com balanceadores de carga de rede de passagem externa e balanceadores de carga de rede de proxy externo.

Expor métricas para balanceamento de carga

  1. Escolha uma métrica para expor. É possível escolher qualquer métrica que o servidor exponha e que também atenda aos requisitos listados na seção anterior. Este exemplo usa uma métrica personalizada chamada queue_depth_util.

  2. Adicione o seguinte recurso personalizado, substituindo os detalhes específicos da sua métrica e do 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
              loadBalancing:
                enabled: true
    

    Substitua o seguinte para corresponder à sua carga de trabalho:

    • NAME: o nome do objeto AutoscalingMetric.
    • NAMESPACE: o namespace em que os pods estão.
    • APP_LABEL_NAME e APP_LABEL_VALUE: o nome e o valor do rótulo correspondentes aos pods que emitem a métrica.
    • METRIC_PORT: o número da porta.
    • METRIC_PATH: o caminho para a métrica. Verifique o caminho usado pelo serviço ou aplicativo. Geralmente, ele é /metrics.
    • METRIC: o nome da métrica que você está expondo. O nome precisa corresponder à expressão regular ^[a-z]([a-z0-9_-]*[a-z0-9])? e ter no máximo 63 caracteres. Isso significa que o primeiro caractere precisa ser uma letra minúscula, e todos os seguintes precisam ser hifens, sublinhados, letras minúsculas ou dígitos, exceto o último, que precisa ser uma letra ou um dígito.
    • Opcional: METRIC_PROMETHEUS_NAME: o nome da métrica do Prometheus, conforme exposto pelo pod. É possível usar esse campo para renomear a métrica, por exemplo, porque o nome exposto pelo pod não está de acordo com as restrições definidas pelo balanceador de carga.

      Para conferir a lista completa de restrições, consulte os detalhes sobre o campo backends[].customMetrics[].name na referência da API para BackendService.

  3. Aplique o manifesto usando o seguinte comando:

    kubectl apply -f FILE_NAME.yaml
    

    Substitua FILE_NAME pelo nome do arquivo YAML.

    Depois de adicionar o recurso personalizado, a métrica é enviada por push para a API de escalonamento automático. A métrica é lida a cada poucos segundos e enviada ao balanceador de carga.

  4. Para usar esse indicador para fins de balanceamento de carga, forneça um GCPBackendPolicy. Exemplo:

    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
    

As métricas informadas pelo Prometheus seguem um padrão de nomenclatura diferente. Quando as métricas são informadas para balanceamento de carga, o agente de métricas do GKE adiciona internamente o prefixo gke.named_metrics. para obedecer ao requisito da API BackendService.

Para expor uma segunda métrica, siga as mesmas etapas para criar outro recurso personalizado.

Agora que você expôs as métricas ao balanceador de carga, é possível configurá-lo para usar essas métricas. Para mais detalhes, consulte Configurar o balanceador de carga para usar métricas personalizadas.

Para mais informações sobre como trabalhar com o balanceador de carga, consulte Configurar o balanceamento de carga baseado em utilização para serviços do GKE.

Resolver problemas de métricas expostas ao balanceador de carga

Para verificar se as métricas estão expostas corretamente ao balanceador de carga, faça o seguinte:

A seguir