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

Особенности работы Prometheus в Nova Container Platform

В Nova Container Platform вы можете настроить Prometheus для сбора метрик с определённых pod’ов в Namespace. Для этого используется Prometheus Operator и ServiceMonitor.

ServiceMonitor — это специальный пользовательский ресурс (Custom Resource / CR) в Kubernetes, который используется в связке с Prometheus Operator для автоматизации настройки сбора метрик от сервисов, работающих в Kubernetes.

1. Настройка пространства имён

Чтобы Prometheus Operator начал работать с ServiceMonitor в Namespace, необходимо добавить метку при создании или затем в существующий Namespace:

  labels:
    nova-platform.io/cluster-monitoring: 'true'

Пример:

kind: Namespace
apiVersion: v1
metadata:
  name: test
  labels:
    nova-platform.io/cluster-monitoring: 'true'

2. Создание ServiceMonitor

Далее необходимо содать ServiceMonitor, с которым Prometheus Operator начнет работу.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: example
spec: {}

Пример:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: service-monitor-test
  namespace: test
spec:
  endpoints:
    - interval: 30s
      port: metrics
  namespaceSelector:
    matchNames:
      - test
  selector:
    matchLabels:
      app: test-exporter

Подсказки для настройки ServiceMonitor можно найти в веб-консоли Nova на странице Administration  CustomResourceDefinitions. Найдите ServiceMonitor, перейдите на вкладку Экземпляры и нажмите Создать ServiceMonitor .
Далее следуйте подсказкам на боковой панели. Если боковая панель не отображается, нажмите на Посмотреть боковую панель.

3. Настрока pod’а

Создайте pod, который будет содержать сервис и встроенный экспортер. Pod должен содержать метку, указанную в ServiceMonitor.

Пример:

apiVersion: v1
kind: Service
metadata:
  name: jmx
  namespace: test
  labels:
    app: test-exporter
spec:
  ports:
  - name: metrics
    port: 5556
    targetPort: 5556
  selector:
    app: test-exporter
  type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
  name: kafka
  namespace: test
  labels:
    app: test-exporter
spec:
  ports:
  - name: broker
    port: 9092
    targetPort: 9092
  - name: controller
    port: 9093
    targetPort: 9093
  selector:
    app: test-exporter
  type: ClusterIP
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: test-exporter-config
  namespace: test
  labels:
    app: test-exporter
data:
  jmx-exporter-config.yaml: |
    rules:
    - pattern: ".*"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kafka
  namespace: test
  labels:
    app: test-exporter
spec:
  serviceName: "kafka"
  replicas: 1
  selector:
    matchLabels:
      app: test-exporter
  template:
    metadata:
      labels:
        app: test-exporter
    spec:
      volumes:
      - name: test-config
        configMap:
          name: test-exporter-config
      containers:
      - name: kafka
        image: bitnami/kafka:latest
        ports:
        - containerPort: 9092
        env:
        - name: KAFKA_CFG_NODE_ID
          value: '0'
        - name: KAFKA_CFG_PROCESS_ROLES
          value: 'controller,broker'
        - name: KAFKA_CFG_LISTENERS
          value: 'PLAINTEXT://:9092,CONTROLLER://:9093'
        - name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP
          value: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT'
        - name: KAFKA_CFG_CONTROLLER_QUORUM_VOTERS
          value: '0@kafka:9093'
        - name: KAFKA_CFG_CONTROLLER_LISTENER_NAMES
          value: CONTROLLER
        - name: JMX_PORT
          value: '5555'
        volumeMounts:
        - name: test-config
          mountPath: /config
      - name: test-exporter
        image: bitnami/jmx-exporter:latest
        ports:
        - containerPort: 5556
          name: metrics
        env:
        - name: JMX_EXPORTER_CONFIG
          value: "/config/jmx-exporter-config.yaml"
        volumeMounts:
        - name: test-config
          mountPath: /config

4. Проверка

  1. Откройте веб-консоль Nova Container Platform и проверьте статус pod’а prometheus-main-0 в Namespace nova-monitoring.

  2. Откройте веб-консоль Prometheus и перейдите на вкладку Status  Targets.

  3. Найдите нужный таргет, который будет отображаться в формате serviceMonitor/<имя пространства имён>/<имя ServiceMonitor>/<номер>.

  4. Убедитесь, что Prometheus обнаружил экспортер.

  1. Если вы видите таргет, но не видите экспортера, проверьте метки, указанные в ServiceMonitor и на pod’е с экспортером.

  2. Если вы не видите таргет, проверьте метку в Namespace и убедитесь, что ServiceMonitor создан. Если всё выглядит корректно, возможно, метка была добавлена после создания Namespace, и Prometheus Operator еще не обновил данные — в этом случае необходимо подождать.После обновления информации данные о ServiceMonitor будут записаны в секрет prometheus-main в Namespace nova-monitoring.