Prometheus Operator: автоматизация мониторинга Kubernetes от А до Я | AdminWiki

Prometheus Operator: автоматизация мониторинга Kubernetes от А до Я

26 июля 2026 8 мин. чтения

Зачем нужен Prometheus Operator и как он упрощает жизнь

Ручная настройка Prometheus в Kubernetes - это постоянная правка ConfigMap, перезагрузка сервера при каждом изменении и риск потерять новые поды из виду. Prometheus Operator заменяет этот процесс декларативным управлением. Вы описываете, какие сервисы мониторить, через стандартные объекты Kubernetes - ServiceMonitor и PodMonitor, а оператор сам находит цели, генерирует конфигурацию и применяет её без перезапуска.

Оператор вводит в кластер набор Custom Resource Definitions (CRD). Основные из них: Prometheus (описывает экземпляр Prometheus), ServiceMonitor (сбор метрик через сервисы), PodMonitor (прямой сбор с подов), PrometheusRule (правила алертинга) и Alertmanager (управление оповещениями). Каждый компонент конфигурируется отдельно, а оператор следит за их согласованностью.

Преимущества такого подхода:

  • Динамическое обнаружение целей. Новый деплоймент с аннотациями prometheus.io/scrape автоматически появляется в списке таргетов.
  • Управление правилами алертинга через Git. PrometheusRule хранится в репозитории, версионируется и применяется через kubectl apply.
  • Масштабирование. Оператор поддерживает шардирование и федерацию Prometheus для кластеров из сотен узлов.
  • Интеграция с Grafana. Источник данных настраивается один раз, дашборды обновляются автоматически.

Если вы уже работали со стеком мониторинга серверов Prometheus и Grafana, то оператор покажется логичным продолжением - он переносит те же принципы в мир оркестрации.

Установка Prometheus Operator в кластер

Для установки нужен работающий кластер Kubernetes (версия 1.24+) и kubectl, настроенный на него. Рекомендуемый способ - Helm-чарт kube-prometheus-stack, который включает сам оператор, Prometheus, Alertmanager и Grafana. Он покрывает 90% сценариев и требует минимум ручной донастройки.

Установка через Helm: быстрый старт

Добавьте репозиторий и установите чарт:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install monitoring prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace \
  --set prometheus.prometheusSpec.retention=15d \
  --set grafana.adminPassword=StrongPass123

Ключевые параметры, которые стоит задать сразу:

  • prometheus.prometheusSpec.retention - срок хранения метрик. По умолчанию 10 дней, для продакшена увеличивают до 15-30 дней.
  • prometheus.prometheusSpec.storageSpec - настройки PersistentVolume. Если не задать, данные потеряются при перезапуске пода.
  • grafana.adminPassword - пароль администратора Grafana. В продакшене используют Sealed Secrets или внешний Secret.
  • alertmanager.alertmanagerSpec.storageSpec - хранилище для Alertmanager, чтобы не терять состояние алертов.

Проверьте результат:

kubectl get pods -n monitoring
# Ожидаемый вывод: prometheus-operator-*, prometheus-*, alertmanager-*, grafana-*

После установки Prometheus доступен через сервис monitoring-prometheus, Grafana - через monitoring-grafana. Для быстрого доступа используйте port-forward:

kubectl port-forward -n monitoring svc/monitoring-grafana 3000:80

Установка из манифестов: полный контроль

Если Helm не подходит, используйте манифесты из репозитория kube-prometheus. Этот репозиторий генерирует полный набор YAML-файлов через jsonnet, но для быстрого старта можно взять готовую сборку:

git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
kubectl apply --server-side -f manifests/setup
kubectl apply -f manifests/

Первый apply создаёт CRD и неймспейсы, второй - все компоненты. Обновление делается повторным применением манифестов. Минус подхода - сложнее управлять параметрами: для изменения retention придётся править StatefulSet Prometheus вручную.

Настройка сбора метрик: ServiceMonitor и PodMonitor

После установки оператора Prometheus уже собирает метрики с компонентов Kubernetes: kubelet, kube-state-metrics, node-exporter. Следующий шаг - добавить свои приложения. Для этого используют ServiceMonitor (основной способ) и PodMonitor (для особых случаев).

ServiceMonitor: мониторинг через сервисы

ServiceMonitor находит цели через Kubernetes Service. Он смотрит на селектор сервиса, находит поды за ним и добавляет их в список скрапинга. Пример для веб-приложения, которое отдаёт метрики на порту 8080 по пути /metrics:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: my-app
  namespace: production
spec:
  selector:
    matchLabels:
      app: my-web-app
  endpoints:
    - port: metrics
      interval: 30s
      path: /metrics
  namespaceSelector:
    matchNames:
      - production

Разбор полей:

  • selector.matchLabels - метки сервиса, который указывает на поды приложения.
  • endpoints.port - имя порта из спецификации сервиса, не номер.
  • interval - как часто опрашивать. 30 секунд - стандарт для большинства приложений.
  • namespaceSelector - в каких неймспейсах искать сервисы. Если не указать, ищет только в своём.

Проверьте, что цель появилась: откройте Prometheus UI (port-forward на порт 9090), перейдите в Status → Targets и найдите свой сервис. Состояние "UP" означает, что метрики собираются.

PodMonitor: прямой мониторинг подов

PodMonitor нужен, когда сервиса нет - например, для мониторинга etcd, kubelet или собственных операторов, которые не создают Service. Он подключается напрямую к подам по их IP:

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: etcd-monitor
  namespace: kube-system
spec:
  selector:
    matchLabels:
      component: etcd
  podMetricsEndpoints:
    - port: metrics
      interval: 30s

Отличие от ServiceMonitor - поле podMetricsEndpoints вместо endpoints. Всё остальное работает аналогично: оператор находит поды по меткам и добавляет их в конфигурацию Prometheus.

Если вы настраиваете мониторинг для высоконагруженных систем, посмотрите руководство по наблюдаемости для высоконагруженных систем - там разобраны метрики и алерты для production-окружений.

Алертинг с PrometheusRule: как не пропустить проблемы

Сбор метрик без алертов - это как камеры наблюдения без охраны. PrometheusRule описывает правила, по которым Prometheus генерирует алерты и отправляет их в Alertmanager. Правила пишутся на PromQL и группируются по severity.

Создание правил алертинга

Пример PrometheusRule для критичных ситуаций в кластере:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: cluster-critical
  namespace: monitoring
spec:
  groups:
    - name: node.rules
      rules:
        - alert: NodeHighCPU
          expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
          for: 10m
          labels:
            severity: critical
          annotations:
            summary: "Узел {{ $labels.instance }} перегружен по CPU"
            description: "Загрузка CPU выше 90% последние 10 минут."
        - alert: NodeOutOfMemory
          expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
          for: 5m
          labels:
            severity: critical
          annotations:
            summary: "Узел {{ $labels.instance }} исчерпал память"
        - alert: PodCrashLooping
          expr: rate(kube_pod_container_status_restarts_total[15m]) > 0
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "Под {{ $labels.pod }} в цикле перезапуска"

Ключевые элементы:

  • expr - PromQL-выражение. Если возвращает значение, алерт срабатывает.
  • for - сколько времени условие должно выполняться до отправки алерта. Предотвращает ложные срабатывания на кратковременных всплесках.
  • labels.severity - уровень критичности. Используется для маршрутизации в Alertmanager.
  • annotations - описание, которое попадёт в уведомление.

Для диагностики проблем с подами через метрики пригодятся готовые PromQL-запросы из руководства по Kubernetes troubleshooting - там собраны запросы для поиска утечек памяти, перегрузки CPU и сетевых проблем.

Настройка Alertmanager для отправки уведомлений

Alertmanager получает алерты от Prometheus, группирует их и отправляет получателям. Конфигурация задаётся в манифесте Alertmanager или через values.yaml при установке через Helm:

alertmanager:
  config:
    global:
      slack_api_url: 'https://hooks.slack.com/services/YOUR/TOKEN'
    route:
      group_by: ['severity']
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 4h
      receiver: 'slack-critical'
      routes:
        - match:
            severity: critical
          receiver: 'slack-critical'
        - match:
            severity: warning
          receiver: 'slack-warning'
    receivers:
      - name: 'slack-critical'
        slack_configs:
          - channel: '#alerts-critical'
            title: '[CRITICAL] {{ .GroupLabels.severity }}'
            text: '{{ .CommonAnnotations.description }}'
      - name: 'slack-warning'
        slack_configs:
          - channel: '#alerts-warning'

Маршрутизация работает так: алерт с severity=critical попадёт в канал #alerts-critical, с severity=warning - в #alerts-warning. Параметр group_interval (5 минут) означает, что новые алерты в той же группе не отправляются чаще этого интервала - это защита от шторма уведомлений.

Визуализация метрик в Grafana

Grafana из состава kube-prometheus-stack уже подключена к Prometheus как к источнику данных. Если вы устанавливали оператор из манифестов, источник нужно добавить вручную.

Подключение источника данных Prometheus

В интерфейсе Grafana перейдите: Configuration → Data Sources → Add data source → Prometheus. В поле URL укажите внутренний адрес сервиса Prometheus:

http://monitoring-prometheus.monitoring.svc:9090

Нажмите Save & Test. Если соединение установлено, появится зелёная галочка.

Импорт готовых дашбордов для Kubernetes

Самые полезные дашборды для старта:

  • Kubernetes Cluster Monitoring (ID 315) - обзор кластера: загрузка узлов, состояние подов, использование ресурсов.
  • Node Exporter Full (ID 1860) - детальные метрики каждого узла: CPU, память, диск, сеть.
  • Kubernetes Pods (ID 6417) - состояние конкретных подов, рестарты, потребление ресурсов.

Импорт: Dashboards → Import → введите ID → Load → выберите источник Prometheus → Import. Дашборды сразу наполняются данными, если метрики собираются.

Для создания кастомного дашборда под своё приложение начните с панели Graph, выберите метрику через PromQL (например, rate(http_requests_total{app="my-app"}[5m])) и настройте визуализацию. Grafana сохраняет дашборды в JSON, их можно версионировать в Git.

Лучшие практики и типичные ошибки

Хранение метрик и управление ресурсами

Prometheus хранит метрики на диске. По умолчанию retention - 10 дней, для продакшена увеличивайте до 15-30 дней через параметр retention в манифесте Prometheus. Объём хранилища рассчитывайте по формуле: количество метрик × размер одной метрики (~2 байта) × retention в секундах. Для кластера из 10 узлов с 200 тысячами метрик на 15 дней нужно около 50 ГБ.

Обязательно задавайте resource requests и limits:

prometheus:
  prometheusSpec:
    resources:
      requests:
        memory: 2Gi
        cpu: 500m
      limits:
        memory: 4Gi
        cpu: 2000m

Без лимитов Prometheus может занять всю память узла при всплеске метрик. Без requests планировщик Kubernetes может разместить его на перегруженном узле.

Частые проблемы и их решение

ServiceMonitor не видит цели. Проверьте три вещи: совпадают ли метки в селекторе ServiceMonitor с метками сервиса, совпадает ли имя порта в endpoints с именем в спецификации сервиса, и разрешён ли доступ к неймспейсу в namespaceSelector. Откройте лог оператора: kubectl logs -n monitoring deployment/prometheus-operator - там будет ошибка с деталями.

Алерты не срабатывают. Проверьте в Prometheus UI вкладку Alerts - алерт должен быть в состоянии "Pending" или "Firing". Если алерт не появляется, скопируйте выражение из expr в PromQL-редактор и проверьте, возвращает ли оно данные. Если возвращает, но алерта нет - проверьте параметр for, возможно, условие не держится достаточно долго.

Grafana не получает данные. Проверьте соединение с источником данных (Data Sources → Prometheus → Test). Если соединение есть, но графики пустые - проверьте временной диапазон дашборда и селекторы метрик. Часто проблема в том, что метрики есть, но за другой период или с другими метками.

Слишком частый скрапинг. Интервал 5 секунд для 1000 целей создаёт огромную нагрузку. Для большинства приложений достаточно 30-60 секунд. Критичные метрики (например, состояние etcd) опрашивайте чаще, остальные - реже.

Для углублённого изучения полного цикла настройки мониторинга с нуля до продакшена используйте пошаговое руководство по настройке мониторинга и алертинга в Kubernetes - оно охватывает весь стек и содержит проверенные конфигурации.

Поделиться:
Сохранить гайд? В закладки браузера