Использование пользовательских метрик Prometheus в автоскалер k8s - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь выставить пользовательские метрики из приложения k8s для потребления Горизонтальным Pod Autoscaler. Метрики относятся ко всем приложениям, а не к отдельным экземплярам (главным образом, длина рабочей очереди невыполненных работ, одинаковая для всех рабочих экземпляров и из общего бэкэнда), поэтому я разделил приложение на два развертывания: k8worker - это экземпляры "рабочей пчелы" которые должны быть автоматически масштабированы, а k8worker-metrics - это отдельное развертывание для предоставления метрик. Целью разделения является поддержание ограниченного числа экземпляров k8worker-metrics, так что если k8worker масштабируется до 30 экземпляров, Прометей не должен вызывать 30 раз, чтобы получить те же самые метрики. Я намерен оставить количество экземпляров k8worker-metrics равным 2 или 3 (но более одного для обеспечения устойчивости).

Мне не удалось интегрировать метрики в HPA.

Я пытался сначала основывать HPA на основе метрик, извлеченных из модулей k8worker-metrics. Я могу видеть показания метрик, поступающие на custom.metrics.k8s.io:

$ kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq .
{
  "kind": "APIResourceList",
  "apiVersion": "v1",
  "groupVersion": "custom.metrics.k8s.io/v1beta1",
  "resources": [
....
    {
      "name": "pods/k8worker_work_queue_length",
      "singularName": "",
      "namespaced": true,
      "kind": "MetricValueList",
      "verbs": [
        "get"
      ]
    },
....
  ]
}

$ kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/k8worker_work_queue_length" | jq .

{
  "kind": "MetricValueList",
  "apiVersion": "custom.metrics.k8s.io/v1beta1",
  "metadata": {
    "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/%2A/k8worker_work_queue_length"
  },
  "items": [
    {
      "describedObject": {
        "kind": "Pod",
        "namespace": "default",
        "name": "k8worker-metrics-758656df7-x67mh",
        "apiVersion": "/v1"
      },
      "metricName": "k8worker_work_queue_length",
      "timestamp": "2020-03-03T04:06:47Z",
      "value": "8"
    },
    {
      "describedObject": {
        "kind": "Pod",
        "namespace": "default",
        "name": "k8worker-metrics-758656df7-58dxb",
        "apiVersion": "/v1"
      },
      "metricName": "k8worker_work_queue_length",
      "timestamp": "2020-03-03T04:06:47Z",
      "value": "8"
    }
  ]
}

Однако если я объявлю ссылку на метрику в манифесте HPA как

  - type: Object
    object:
      metric:
        name: k8worker_work_queue_length
      describedObject:
        apiVersion: custom.metrics.k8s.io/v1beta1
        kind: Pod
        name: k8worker-metrics
      target:
        type: Value
        value: 4

, то получу сообщение

$ kubectl describe hpa
....
"FailedGetObjectMetric  ... unable to get metric k8worker_work_queue_length: Pod on default k8worker-metrics/unable to fetch metrics from custom metrics API: unable to map kind Pod.custom.metrics.k8s.io to resource: no matches for kind "Pod" in group "custom.metrics.k8s.io"

Я также пытался обернуть модули k8worker-метрики в качестве службы (k8worker-metrics-sv c), надеясь, что смогу ссылаться на него в манифесте HPA как

 - type: Object
   object:
     metric:
       name: k8worker_work_queue_length
     describedObject:
       apiVersion: custom.metrics.k8s.io/v1beta1
       kind: Service
       name: k8worker-metrics-svc
     target:
       type: Value
       value: 4

Но показания службы не отображаются в /apis/custom.metrics.k8s.io:

$ kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq . | grep queue_length
      "name": "namespaces/k8worker_work_queue_length",
      "name": "pods/k8worker_work_queue_length",
      "name": "jobs.batch/k8worker_work_queue_length",

$ kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/services/k8worker-metrics-svc/k8worker_work_queue_length"
Error from server (NotFound): the server could not find the metric k8worker_work_queue_length for services

$ kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq . | grep serv
[empty output]

Даже если служба и ее показания видны в пользовательском интерфейсе Prometheus (для захвата на скриншотах ниже я оставил и стручок, и сервис, помеченные для очистки):

enter image description here

enter image description here

Совет был бы очень признателен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...