Порт приходит из конфигурации и метаданных discovery, а не определяется сканированием приложения. В обычном Prometheus relabeling выбирает или меняет адрес цели. С Operator поле ServiceMonitor.endpoints[].port ссылается на имя порта Service, а PodMonitor.podMetricsEndpoints[].port — на имя порта контейнера в Pod. Аннотации работают только при настроенной обработке.
Как Prometheus понимал, на какой порт пода нужно идти за метриками?
Откуда берётся адрес сбора метрик: Kubernetes discovery, relabeling и разные поля портов в ServiceMonitor и PodMonitor.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
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/аутентификации — разрешать запрос.