Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

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. Для добавления своих метрик выполните следующие шаги:

  1. В веб-консоли Nova Container Platform перейдите на вкладку Administration  CustomResourceDefinitions и найдите ресурс Kustomization. Далее перейдите на вкладку Экземпляры и найдите nova-release-prometheus-adapter-main.

  2. На вкладке YAML добавьте патч, который будет содержать текущие настройки из ConfigMap nova-prometheus-adapter в Namespace nova-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
  3. Убедитесь, что pod nova-prometheus-adapter успешно перезапустился.

  4. Убедитесь, что следующая команда выводит значение метрики:

    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'