K8S HPA - не удается получить метрики из API внешних метрик

Я пытаюсь получить отставание темы Kafka в Prometheus и, наконец, на APIServer, чтобы использовать внешние метрики HPA для моего приложения.

Я получаю сообщение об ошибке из внешнего API метрик не возвращаются метрики

70m         Warning   FailedGetExternalMetric        horizontalpodautoscaler/kafkademo-hpa   unable to get external metric default/kafka_lag_metric_sm0ke/&LabelSelector{MatchLabels:map[string]string{topic: prices,},MatchExpressions:[]LabelSelectorRequirement{},}: no metrics returned from external metrics API
66m         Warning   FailedComputeMetricsReplicas   horizontalpodautoscaler/kafkademo-hpa   invalid metrics (1 invalid out of 1), first error is: failed to get external metric kafka_lag_metric_sm0ke: unable to get external metric default/kafka_lag_metric_sm0ke/&LabelSelector{MatchLabels:map[string]string{topic: prices,},MatchExpressions:[]LabelSelectorRequirement{},}: no metrics returned from external metrics API

Это происходит хотя при запросе внешнего API я вижу следующий результат:

kubectl get --raw /apis/external.metrics.k8s.io/v1beta1 | jq
{
  "kind": "APIResourceList",
  "apiVersion": "v1",
  "groupVersion": "external.metrics.k8s.io/v1beta1",
  "resources": [
    {
      "name": "kafka_lag_metric_sm0ke",
      "singularName": "",
      "namespaced": true,
      "kind": "ExternalMetricValueList",
      "verbs": [
        "get"
      ]
    }
  ]
}

Вот установка:

  • Кафка: v2.7.0
  • Прометей: v2.26.0
  • Адаптер Prometheus: v0.8.3

Значения адаптера Prometheus

rules:
  external:
  - seriesQuery: 'kafka_consumergroup_group_lag{topic="prices"}'
    resources:
      template: <<.Resource>>
    name:
      as: "kafka_lag_metric_sm0ke"
    metricsQuery: 'avg by (topic) (round(avg_over_time(<<.Series>>{<<.LabelMatchers>>}[1m])))'

HPA

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: kafkademo-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: kafkademo
  minReplicas: 3
  maxReplicas: 12
  metrics:
  - type: External
    external:
      metricName: kafka_lag_metric_sm0ke
      metricSelector:
        matchLabels:
          topic: prices
      targetValue: 5

Информация HPA

kubectl describe hpa kafkademo-hpa 
Name:                                       kafkademo-hpa
Namespace:                                  default
Labels:                                     <none>
Annotations:                                <none>
CreationTimestamp:                          Sat, 17 Apr 2021 20:01:29 +0300
Reference:                                  Deployment/kafkademo
Metrics:                                    ( current / target )
  "kafka_lag_metric_sm0ke" (target value):  <unknown> / 5
Min replicas:                               3
Max replicas:                               12
Deployment pods:                            3 current / 0 desired
Conditions:
  Type           Status  Reason                   Message
  ----           ------  ------                   -------
  AbleToScale    True    SucceededGetScale        the HPA controller was able to get the target's current scale
  ScalingActive  False   FailedGetExternalMetric  the HPA was unable to compute the replica count: unable to get external metric default/kafka_lag_metric_sm0ke/&LabelSelector{MatchLabels:map[string]string{topic: prices,},MatchExpressions:[]LabelSelectorRequirement{},}: no metrics returned from external metrics API
Events:
  Type     Reason                        Age                     From                       Message
  ----     ------                        ----                    ----                       -------
  Warning  FailedComputeMetricsReplicas  70m (x335 over 155m)    horizontal-pod-autoscaler  invalid metrics (1 invalid out of 1), first error is: failed to get external metric kafka_lag_metric_sm0ke: unable to get external metric default/kafka_lag_metric_sm0ke/&LabelSelector{MatchLabels:map[string]string{topic: prices,},MatchExpressions:[]LabelSelectorRequirement{},}: no metrics returned from external metrics API
  Warning  FailedGetExternalMetric       2m30s (x366 over 155m)  horizontal-pod-autoscaler  unable to get external metric default/kafka_lag_metric_sm0ke/&LabelSelector{MatchLabels:map[string]string{topic: prices,},MatchExpressions:[]LabelSelectorRequirement{},}: no metrics returned from external metrics API

- Изменить 1

Когда я запрашиваю пространство имен по умолчанию, я получаю следующее:

kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/default/kafka_lag_metric_sm0ke |jq
{
  "kind": "ExternalMetricValueList",
  "apiVersion": "external.metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": []
}

Я вижу, что поле элементов пусто. Что это значит?

Чего я, кажется, не понимаю, так это цепи событий, происходящих за кулисами.

AFAIK вот что происходит. Это правильно?

  • prometheus-adapter запрашивает Prometheus, выполняет seriesQuery, вычисляет metricsQuery и создает kafka_lag_metric_sm0ke
  • Он регистрирует конечную точку на сервере api для внешних показателей.
  • Сервер API будет периодически обновлять свою статистику на основе этой конечной точки.
  • HPA проверяет kafka_lag_metric_sm0ke с сервера API и выполняет масштабирование в соответствии с предоставленными значениями.

Я также, кажется, не понимаю значения пространств имен во всем этом. Я вижу, что статистика имеет пространство имен. Означает ли это, что на пространство имен будет 1 стат? Как это имеет смысл?


person sm0ke21    schedule 18.04.2021    source источник


Ответы (1)


По давней традиции отвечать на свои вопросы после того, как я их задаю, вот что не так с приведенной выше конфигурацией.

Ошибка кроется в yaml prometheus-adapter:

rules:
  external:
    - seriesQuery: 'kafka_consumergroup_group_lag{topic="prices"}'
      resources:
        template: <<.Resource>>
      name:
        as: "kafka_lag_metric_sm0ke"
      metricsQuery: 'avg by (topic) (round(avg_over_time(<<.Series>>{<<.LabelMatchers>>}[1m])))'

Я удалил <<.LabelMatchers>> и теперь все работает:

kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/default/kafka_lag_metric_sm0ke |jq
{
  "kind": "ExternalMetricValueList",
  "apiVersion": "external.metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": [
    {
      "metricName": "kafka_lag_metric_sm0ke",
  "metricLabels": {
        "topic": "prices"
      },
      "timestamp": "2021-04-21T16:55:18Z",
      "value": "0"
    }
  ]
}

Я до сих пор не уверен, почему это работает. Я знаю, что <<.LabelMatchers>> в этом случае будет заменен чем-то, что не дает правильного запроса, но я не знаю, что это такое.

person sm0ke21    schedule 21.04.2021