Как Prometheus понимал, на какой порт пода нужно идти за метриками?

Откуда берётся адрес сбора метрик: Kubernetes discovery, relabeling и разные поля портов в ServiceMonitor и PodMonitor.

Короткий ответ

Что ответить на собеседовании

Порт приходит из конфигурации и метаданных discovery, а не определяется сканированием приложения. В обычном Prometheus relabeling выбирает или меняет адрес цели. С Operator поле ServiceMonitor.endpoints[].port ссылается на имя порта Service, а PodMonitor.podMetricsEndpoints[].port — на имя порта контейнера в Pod. Аннотации работают только при настроенной обработке.

Подробный разбор

Ответ с пояснениями

Prometheus не угадывает порт по запущенному процессу. Итоговая цель содержит адрес, порт, схему и путь; они определяются конфигурацией сбора и данными service discovery.

Без Operator в scrape_configs можно задать адреса явно либо использовать kubernetes_sd_configs. Например, discovery с role: pod создаёт цели по объявленным портам контейнеров и добавляет метаданные, включая имя порта. Правила relabel_configs оставляют нужные цели и при необходимости изменяют __address__, __scheme__ или __metrics_path__. Аннотации вроде prometheus.io/port — лишь соглашение: они влияют на сбор, только если конфигурация их обрабатывает. Конфигурация Prometheus.

С Prometheus Operator конфигурация обычно генерируется из выбранных ресурсов мониторинга:

  • ServiceMonitor выбирает Service по labels. Его endpoints[].port — имя из Service.spec.ports[].name, не числовой порт и не произвольное имя порта контейнера.
  • PodMonitor выбирает Pod непосредственно, без Service. В podMetricsEndpoints[].port указывают имя объявленного порта контейнера.

Эти поля описаны в справочнике Operator. Например, у Service может быть name: metrics, port: 80, targetPort: 9090. Тогда ServiceMonitor указывает port: metrics; для обычных pod-backed endpoints сбор идёт с соответствующего адреса пода на 9090, а не обязательно через ClusterIP:80.

Важно проверить всю цепочку выбора: нужный Prometheus выбирает ServiceMonitor/PodMonitor, тот выбирает Service или Pod в разрешённых namespaces, затем находится подходящий порт. Пример настройки.

При диагностике смотрят обнаруженные цели, итоговый URL и ошибку последнего scrape. Объявление containerPort само по себе не запускает HTTP-сервер: приложение должно слушать доступный интерфейс, отдавать метрики по нужному пути, а сеть и настройки TLS/аутентификации — разрешать запрос.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку