Prometheus Adapter
Prometheus Adapter — это инструмент, позволяющий использовать метрики из Prometheus для масштабирования приложений в среде Kubernetes на основе динамических метрик. Он выступает связующим звеном между сервером метрик Kubernetes (Metrics API) и Prometheus, преобразуя метрики, собранные Prometheus, в формат, понятный Kubernetes, что обеспечивает автоматическое горизонтальное масштабирование (HPA — Horizontal Pod Autoscaler).
1. Предварительные условия
-
Вы ознакомились со статьёй и создали все необходимые ресурсы.
2. Основные функции и принципы работы:
-
Адаптация метрик: Prometheus Adapter преобразует метрики Prometheus в формат, который может быть использован Kubernetes для принятия решений о масштабировании. Это осуществляется с помощью пользовательских настроек и правил, которые сопоставляют метрики Prometheus с API Kubernetes.
-
Конфигурация: Пользователи могут определить, какие именно метрики из Prometheus будут использоваться для масштабирования и как они должны быть интерпретированы. Это делается через файлы конфигурации YAML, где задаются правила трансформации методов, такие как соотношения, суммирования или модификации метрик.
-
Metrics API: Prometheus Adapter реализует Metrics API, который предоставляет два типа метрик для HPA: Custom Metrics API и External Metrics API.
Custom Metrics API используется для масштабирования на основе метрик, специфичных для кластера Kubernetes, таких как количество запросов на pod.
External Metrics API используется для метрик, которые находятся за пределами кластера, например, количество записей в очереди сообщений. -
Horizontal Pod Autoscalers: С помощью адаптера можно настроить Kubernetes для автоматического изменения количества pod’ов (горизонтального масштабирования) на основе изменяющейся нагрузки, создаваемой приложениями. Метрики, предоставляемые адаптером, помогают HPA более точно определять нагрузки и, соответственно, масштабировать ресурсы.
3. Настройка Prometheus Adapter
По умолчанию Prometheus Adapter настраивается только на метрики CPU и Memory. Для добавления своих метрик выполните следующие шаги:
-
В веб-консоли Nova Container Platform перейдите на вкладку и найдите ресурс Kustomization. Далее перейдите на вкладку Экземпляры и найдите
nova-release-prometheus-adapter-main. -
На вкладке YAML добавьте патч, который будет содержать текущие настройки из ConfigMap
nova-prometheus-adapterв Namespacenova-monitoringи ваши изменения.Пример:
spec: patches: - patch: | - op: replace path: /data/config.yaml value: | rules: - seriesQuery: 'container_cpu_usage_seconds_total{namespace!="",pod!="",container!="POD"}' resources: overrides: namespace: resource: namespace pod: resource: pod name: matches: ".*" as: "cpu_per_5m" metricsQuery: 'sum(irate(<<.Series>>{<<.LabelMatchers>>, container!="POD"}[5m])) by (<<.GroupBy>>)' - seriesQuery: 'container_memory_working_set_bytes{namespace!="",pod!="",container!="POD"}' resources: overrides: namespace: resource: namespace pod: resource: pod name: matches: ".*" as: "memory_per_5m" metricsQuery: 'sum(avg_over_time(<<.Series>>{<<.LabelMatchers>>, container!="POD"}[5m])) by (<<.GroupBy>>)' - seriesQuery: 'kafka_controller_ControllerEventManager_Count{name="EventQueueTimeMs"}' resources: overrides: namespace: resource: namespace pod: resource: pod name: matches: ".*" as: "kafka_controller_ControllerEventManager_Count_EventQueueTimeMs" metricsQuery: 'avg(increase(kafka_controller_ControllerEventManager_Count{name="EventQueueTimeMs"}[5m])) by (namespace, pod)' target: kind: ConfigMap name: nova-prometheus-adapter namespace: nova-monitoring -
Убедитесь, что pod
nova-prometheus-adapterуспешно перезапустился. -
Убедитесь, что следующая команда выводит значение метрики:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/<имя пространства имён>/pods/*/<название метрики из конфига Prometheus Adapter>"Пример:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/test/pods/*/kafka_controller_ControllerEventManager_Count_EventQueueTimeMs" {"kind":"MetricValueList","apiVersion":"custom.metrics.k8s.io/v1beta1","metadata":{},"items":[{"describedObject":{"kind":"Pod","namespace":"test","name":"kafka-0","apiVersion":"/v1"},"metricName":"kafka_controller_ControllerEventManager_Count_EventQueueTimeMs","timestamp":"2024-10-08T12:19:22Z","value":"750","selector":null},{"describedObject":{"kind":"Pod","namespace":"test","name":"kafka-1","apiVersion":"/v1"},"metricName":"kafka_controller_ControllerEventManager_Count_EventQueueTimeMs","timestamp":"2024-10-08T12:19:22Z","value":"750","selector":null}]}
4. Настройка Horizontal Pod Autoscalers
После того как необходимая метрика становится доступной в Prometheus Adapter, можно приступать к настройке Horizontal Pod Autoscalers (HPA) для выбранного ресурса. Ниже приведен пример конфигурации:
kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2
metadata:
name: my-deployment-hpa
namespace: test
spec:
scaleTargetRef:
kind: StatefulSet
name: kafka
apiVersion: apps/v1
minReplicas: 1
maxReplicas: 2
metrics:
- type: Pods
pods:
metric:
name: kafka_controller_ControllerEventManager_Count_EventQueueTimeMs
target:
type: AverageValue
averageValue: '600'