Expón métricas personalizadas para el ajuste de escala automático

En este documento, se describe cómo enviar una o más métricas de un Pod o una carga de trabajo a tu escalador automático.

Estas métricas provienen del servicio o la aplicación que ejecutas. Para ver un ejemplo de las métricas expuestas, consulta las métricas expuestas por el motor de vLLM.

Luego, el escalador automático de cargas de trabajo puede usar estos datos para escalar las cargas de trabajo de manera más eficiente. Por ejemplo, puedes usar esta función para supervisar la profundidad de la cola o las solicitudes activas y, luego, permitir que el escalador automático aumente o disminuya la cantidad de Pods. En el ejemplo de vLLM, una métrica que podría ser útil para hacer un seguimiento del uso es vllm:gpu_cache_usage_perc.

Requisitos

Los requisitos para los Pods son los siguientes:

Los requisitos para las métricas son los siguientes.

  • Se debe poder acceder a las métricas en un extremo HTTP. La ruta de acceso del extremo es /metrics de forma predeterminada.
  • Las métricas deben tener el formato según el estándar de Prometheus.
  • Solo se admiten las métricas de calibre.
  • Los nombres de las etiquetas en los selectores de etiquetas de Pod no deben contener caracteres especiales. Solo se admiten letras de la A a la Z (mayúsculas o minúsculas), números, guiones y guiones bajos.
  • Cuando se usa el filtrado basado en etiquetas de métricas, la clave de etiqueta debe coincidir con la expresión regular ^[a-zA-Z_][a-zA-Z0-9_]* (comenzar con una letra o un guion bajo, y solo contener letras, números o guiones bajos).
  • Se puede exponer un máximo de 20 métricas únicas por clúster.

Expón métricas para el ajuste de escala automático

  1. Elige una métrica para exponer. Puedes elegir cualquier métrica que exponga tu carga de trabajo y que también cumpla con los requisitos que se indican en la sección anterior.

    Si tu carga de trabajo expone varias métricas con el mismo nombre, pero con diferentes etiquetas, agrega un filtro de etiquetas para asegurarte de que solo se seleccione una.

  2. Agrega el siguiente recurso personalizado y reemplaza los detalles específicos de tu métrica y 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
    

    Reemplaza lo siguiente para que coincida con tu carga de trabajo:

    • NAME: Es el nombre del objeto AutoscalingMetric.
    • NAMESPACE: Es el espacio de nombres en el que se encuentran los Pods.
    • APP_LABEL_NAME y APP_LABEL_VALUE: Son el nombre y el valor de la etiqueta que coinciden con los Pods que emiten la métrica.
    • METRIC_PORT: Es el número de puerto.
    • METRIC_PATH: Es la ruta de acceso a la métrica. Verifica la ruta de acceso que usa tu servicio o aplicación. Esta ruta suele ser /metrics.
    • METRIC: Es el nombre de la métrica que expones. El nombre debe coincidir con la expresión regular ^[a-z]([-a-z0-9]*[a-z0-9])? y tener una longitud de no más de 63 caracteres. Esto significa que el primer carácter debe ser una letra minúscula y todos los caracteres siguientes deben ser guiones, letras minúsculas o dígitos, excepto el último carácter, que no puede ser un guion.
    • Opcional: METRIC_PROMETHEUS_NAME: Es el nombre de la métrica de Prometheus tal como la expone el Pod. Puedes usar este campo para cambiar el nombre de la métrica, por ejemplo, porque el nombre de la métrica que expone el Pod no cumple con las restricciones de nombre establecidas por el escalador automático.

      Para obtener detalles sobre las restricciones de nombres, consulta las limitaciones del ajuste de escala automático horizontal de Pods.

  3. Aplica el manifiesto con el siguiente comando:

    kubectl apply -f FILE_NAME_AUTOSCALING_METRIC.yaml
    

    Reemplaza FILE_NAME_AUTOSCALING_METRIC por el nombre del archivo YAML.

    Cuando agregues el recurso personalizado, la métrica se enviará a la API de ajuste de escala automático. La métrica se lee cada pocos segundos y se envía al escalador automático de cargas de trabajo.

  4. Ahora que expusiste las métricas al escalador automático, puedes configurar el escalador automático de la carga de trabajo para que use estas métricas. Para ello, agrega el siguiente recurso personalizado:

    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
    

    Reemplaza lo siguiente para que coincida con tu carga de trabajo:

    • NAME_HPA: El nombre del objeto HorizontalPodAutoscaler.
    • NAMESPACE: Es el espacio de nombres en el que se encuentran los Pods.
    • DEPLOYMENT: Es el nombre de la implementación a la que segmentas tu anuncio.
    • MIN_REPLICAS: Es la cantidad mínima de réplicas a las que se puede escalar la Deployment.
    • MAX_REPLICAS: Es la cantidad máxima de réplicas a las que se puede escalar la Deployment.
    • NAME: Es el nombre del objeto AutoscalingMetric.
    • METRIC: Es el nombre de la métrica que expones.
    • AVERAGE_VALUE: Es el valor promedio objetivo de la métrica. El escalador automático ajusta la cantidad de réplicas para mantener un valor promedio de la métrica en todos los Pods.
  5. Aplica el manifiesto con el siguiente comando:

    kubectl apply -f FILE_NAME_HPA.yaml
    

    Reemplaza FILE_NAME_HPA por el nombre del archivo YAML.

Cómo filtrar métricas con etiquetas de métricas

El filtrado de métricas con etiquetas de métricas está disponible en GKE 1.36.0-gke.1759000 o versiones posteriores.

Las métricas suelen incluir etiquetas. Las etiquetas son pares clave-valor que te permiten agregar dimensiones a un valor. Por ejemplo, una métrica que cuenta la cantidad de solicitudes a un extremo HTTP segmentado por método y entorno podría usar etiquetas para especificar este contexto. Este ejemplo podría verse de la siguiente manera:

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

Puedes usar filtros de etiquetas para asegurarte de que tu especificación de métrica coincida exactamente con una métrica. Por ejemplo, para seleccionar solo la primera métrica del ejemplo anterior, usa la siguiente especificación para la métrica AutoscalingMetric 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

Las claves de los pares clave-valor de matchLabels deben coincidir con la expresión regular ^[a-zA-Z_][a-zA-Z0-9_]*, es decir, comenzar con una letra o un guion bajo, y solo contener letras, números o guiones bajos.

Soluciona problemas de las métricas expuestas para el ajuste de escala automático

Puedes revisar el estado del recurso personalizado AutoscalingMetric para buscar errores de configuración. Para ello, deberás hacer lo siguiente:

  1. Para inspeccionar el recurso personalizado AutoscalingMetric, ejecuta el siguiente comando:

    kubectl describe autoscalingmetric NAME -n NAMESPACE
    
  2. Consulta el campo Status para obtener información sobre las métricas configuradas, como advertencias sobre errores de configuración y el nombre exacto de la métrica tal como debería aparecer en el objeto HorizontalPodAutoscaler.

¿Qué sigue?