Kubernetes HPA не масштабируется с помощью настраиваемой метрики с использованием адаптера prometheus на istio

У меня есть два развертывания с v1 и v2 одной и той же службы в istio. Я настроил настраиваемую метрику istio-total-requests для сбора через адаптер prometheus.

Я настроил HPA для масштабирования развертывания v2 и вижу, что целевое значение увеличивается, когда я отправляю запросы, но чего не происходит, так это то, что HPA не масштабирует количество модулей / реплик.

Я запускаю kubernetes v1.19 на minikube v1.13.1 и не могу понять, почему он не масштабируется.

prometheus:
  url: http://prometheus.istio-system.svc.cluster.local
rules:
  default: false
  custom:
# this rule matches cumulative cAdvisor metrics measured in seconds
  - seriesQuery: 'istio_requests_total{kubernetes_namespace!="",kubernetes_pod_name!=""}'
    seriesFilters: []      
    resources:
      # template: <<.Resource>>
      # skip specifying generic resource<->label mappings, and just
      # attach only pod and namespace resources by mapping label names to group-resources
      overrides:
        kubernetes_namespace: {resource: "namespace"}
        kubernetes_pod_name: {resource: "pod"}
    # specify that the `container_` and `_seconds_total` suffixes should be removed.
    # this also introduces an implicit filter on metric family names
    name:
      # we use the value of the capture group implicitly as the API name
      # we could also explicitly write `as: "$1"`
      matches: "^(.*)_total"
      as: "${1}_per_second"
      # matches: ""
      # as: ""
    # specify how to construct a query to fetch samples for a given series
    # This is a Go template where the `.Series` and `.LabelMatchers` string values
    # are available, and the delimiters are `<<` and `>>` to avoid conflicts with
    # the prometheus query language
    metricsQuery: "sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)"

HPA YAML

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: translate-deployment-v2-hpa
spec:
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: istio_requests_per_second
        # selector: {matchLabels: {destination_version: 0.0.2}}
      target:
        type: AverageValue
        averageValue: 10
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: translate-deployment-v2      

Посмотрите, как HPA извлекает и измеряет метрику, но не масштабирует; в окне под ним показано, что адаптер Prometheus успешно запрашивает метрику.

введите описание изображения здесь

Описание HPA

введите описание изображения здесь

И последний вопрос, по которому я не совсем понимаю, - какова цель селектора в приведенном выше определении hpa? Нужно ли выбирать конкретные значения из диапазона данных, который запрашивает Прометей?

Например, я знаю, что поле, которое я запрашиваю, по умолчанию выводится посланником следующим образом:

istio_requests_total{app="istio-ingressgateway",chart="gateways",connection_security_policy="unknown",destination_app="translate-pod",destination_canonical_revision="0.0.1",destination_canonical_service="translate-pod",destination_principal="spiffe://cluster.local/ns/default/sa/default",destination_service="translate-service.default.svc.cluster.local",destination_service_name="translate-service",destination_service_namespace="default",destination_version="0.0.1",destination_workload="translate-deployment",destination_workload_namespace="default",heritage="Tiller",install_operator_istio_io_owning_resource="unknown",instance="172.17.0.5:15020",istio="ingressgateway",istio_io_rev="default",job="kubernetes-pods",kubernetes_namespace="istio-system",kubernetes_pod_name="istio-ingressgateway-6cfd75fc57-flmhp",operator_istio_io_component="IngressGateways",pod_template_hash="6cfd75fc57",release="istio",reporter="source",request_protocol="http",response_code="200",response_flags="-",service_istio_io_canonical_name="istio-ingressgateway",service_istio_io_canonical_revision="latest",source_app="istio-ingressgateway",source_canonical_revision="latest",source_canonical_service="istio-ingressgateway",source_principal="spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",source_version="unknown",source_workload="istio-ingressgateway",source_workload_namespace="istio-system"}

Позволяет ли селектор дополнительно фильтровать данные серии, если не для чего и как вы ее используете?




Ответы (1)


Согласно вашему снимку экрана, HPA работает должным образом, потому что значение вашего показателя ниже порогового значения. Если значение не превышает пороговое значение, HPA не запустит масштабирование. Вместо этого в вашем случае это может вызвать уменьшение масштаба.

В данный момент вы используете метрику istio_requests_per_second. Это рассчитывается из общего количества запросов в секунду. Первый снимок экрана показывает, что среднее значение 200m, которое будет 0.2. Ваш порог равен 10, поэтому HPA определенно не будет увеличиваться в этом случае.

Для селектора это дает вам возможность выбрать целевую метку под метриками. Например, если вы хотите масштабировать экземпляры только по методу GET. В этом случае вы можете определить селектор, соответствующий метке GET метода.

person Ryan Siu    schedule 07.01.2021
comment
Райан, ниже представлен запрос, который отправляется из HPA в Prom: kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/%2A/istio_requests_per_second?labelSelector=app%3Dtranslate- pod% 2Cversion% 3D0.0.2 & metricLabelSelector = version% 3D0.0.2 В этом случае в HPA ive определен селектор с matchLabel, как показано в исходном сообщении. Я вижу, что версия передается в запросе. Когда я запускаю этот запрос вручную, как с этой конечной частью версии = 0.0.2, так и без нее, я получаю тот же ответ, поэтому я не понимаю, какова его цель. - person John; 08.01.2021
comment
Если возможно, не могли бы вы поделиться результатом вашего запроса для обоих вызовов? - person Ryan Siu; 08.01.2021
comment
Я просто опубликую еще один вопрос, поскольку вы решили исходную проблему, и на этом небольшом пространстве слишком много информации для публикации. - person John; 08.01.2021