Доступно в редакциях: Open/CE, Core, BE, SE, SE+, Ultimate/EE, Certified Core/CSE Lite (1.73), Certified Pro/CSE Pro (1.73)
Стадия жизненного цикла модуля: General Availability
У модуля есть требования для установки
Для мониторинга пользовательских приложений, запущенных в кластере, требуется дополнительная настройка. Этот модуль упрощает процесс настройки, сводя её к указанию для нужного приложения определённого лейбла.
Чтобы организовать сбор метрик с приложений модулем monitoring-custom, необходимо:
-
Поставить лейбл
prometheus.deckhouse.io/custom-targetна Service или под. Значение лейбла определит имя в списке target’ов Prometheus.-
В качестве значения лейбла
prometheus.deckhouse.io/custom-targetрекомендуется использовать название приложения (маленькими буквами, разделитель-), которое позволяет его уникально идентифицировать в кластере.Если приложение ставится в кластер больше одного раза (staging, testing и т. д.) или даже ставится несколько раз в одно пространство имён, достаточно одного общего названия, так как у всех метрик в любом случае будут лейблы
namespace,podи, если доступ осуществляется через Service, лейблservice. Это название, уникально идентифицирующее приложение в кластере, а не его единичную инсталляцию.
-
-
Порту, с которого нужно собирать метрики, указать имя
http-metricsиhttps-metricsдля подключения по HTTP или HTTPS соответственно.Если это невозможно (например, порт уже определен и назван другим именем), необходимо воспользоваться аннотациями:
prometheus.deckhouse.io/port: номер_порта— для указания порта иprometheus.deckhouse.io/tls: "true"— если сбор метрик будет проходить по HTTPS.При указании аннотации на Service в качестве значения порта необходимо использовать
targetPort. То есть тот порт, что открыт и слушается приложением, а не порт Service’а.-
Пример 1:
ports: - name: https-metrics containerPort: 443 -
Пример 2:
annotations: prometheus.deckhouse.io/port: "443" prometheus.deckhouse.io/tls: "true" # Если метрики отдаются по HTTP, эту аннотацию указывать не нужно.
Prometheus не проверяет сертификат HTTPS-таргета: приложения обычно отдают самоподписанный. Сам Prometheus аутентифицируется клиентским сертификатом, выписанным CA платформы kube-rbac-proxy, — см. как обеспечить безопасный доступ к метрикам.
-
-
При использовании service mesh Istio в режиме STRICT mTLS указать для сбора метрик следующую аннотацию у Service или Pod:
prometheus.deckhouse.io/istio-mtls: "true". Важно, что метрики приложения должны экспортироваться по протоколу HTTP без TLS.Аутентификацией на этом пути служит сам сертификат Istio, поэтому мигрировать ничего не нужно. Bearer-токен сюда больше не отправляется — см. что с таргетами, которые скрейпятся через Istio mTLS, если вы использовали этот токен для авторизации.
-
(Необязательно) Укажите дополнительные аннотации для более тонкой настройки:
prometheus.deckhouse.io/path— путь для сбора метрик (по умолчанию:/metrics).prometheus.deckhouse.io/query-param-$name— GET-параметры, будут преобразованы в map вида$name=$value(по умолчанию: ‘’):-
возможно указать несколько таких аннотаций.
Например,
prometheus.deckhouse.io/query-param-foo=barиprometheus.deckhouse.io/query-param-bar=zxcбудут преобразованы в query:http://...?foo=bar&bar=zxc.
-
prometheus.deckhouse.io/allow-unready-pod— разрешает сбор метрик с подов в любом состоянии (по умолчанию метрики собираются только с подов в состоянии Ready). Эта опция полезна в редких случаях. Например, если ваше приложение запускается очень долго (при старте загружаются данные в базу или заполняются кеши), но в процессе запуска уже отдаются полезные метрики, которые помогают следить за запуском приложения.prometheus.deckhouse.io/sample-limit— сколько семплов разрешено собирать с пода (по умолчанию 5000). Значение по умолчанию защищает от ситуации, когда приложение внезапно начинает отдавать слишком большое количество метрик, что может нарушить работу всего мониторинга. Аннотация должна быть размещена на том же ресурсе, на котором расположен лейблprometheus.deckhouse.io/custom-target.
Пример: Service
apiVersion: v1
kind: Service
metadata:
name: my-app
namespace: my-namespace
labels:
prometheus.deckhouse.io/custom-target: my-app
annotations:
prometheus.deckhouse.io/port: "8061" # По умолчанию будет использоваться порт сервиса с именем http-metrics или https-metrics.
prometheus.deckhouse.io/path: "/my_app/metrics" # По умолчанию /metrics.
prometheus.deckhouse.io/query-param-format: "prometheus" # По умолчанию ''.
prometheus.deckhouse.io/allow-unready-pod: "true" # По умолчанию поды НЕ в Ready игнорируются.
prometheus.deckhouse.io/sample-limit: "5000" # По умолчанию принимается не больше 5000 метрик от одного пода.
spec:
ports:
- name: my-app
port: 8060
- name: http-metrics
port: 8061
targetPort: 8061
selector:
app: my-appПример: Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
prometheus.deckhouse.io/custom-target: my-app
annotations:
prometheus.deckhouse.io/sample-limit: "5000" # По умолчанию принимается не больше 5000 метрик от одного пода.
spec:
containers:
- name: my-app
image: my-app:1.7.9
ports:
- name: https-metrics
containerPort: 443Переход HTTPS-таргетов на аутентификацию по сертификату
Раньше Prometheus аутентифицировался на HTTPS-таргетах bearer-токеном. По соображениям безопасности теперь используется клиентский сертификат.
На переходный период Prometheus продолжает отправлять токен рядом с сертификатом, поэтому настроенный по-старому kube-rbac-proxy продолжает работать. Этим управляет параметр sendLegacyBearerToken, по умолчанию true. Пока он включён, срабатывает алерт D8MonitoringCustomLegacyBearerTokenEnabled — напоминание о том, что токен всё ещё отправляется.
Как смигрировать:
-
Добавьте
--client-ca-file=/etc/kube-rbac-proxy/ca.crtв каждыйkube-rbac-proxy, который защищает ваши метрики, и смонтируйте ConfigMapprometheus-custom-scraper-ca.crtв/etc/kube-rbac-proxy. Этот ConfigMap создаётся автоматически в каждом namespace, где есть HTTPS-таргет с лейбломprometheus.deckhouse.io/custom-target; полный манифест — в разделе как обеспечить безопасный доступ к метрикам.Если ваш прокси уже запущен с
--client-ca-file, не заменяйте файл, на который он указывает: флаг принимает связку, поэтому допишите содержимоеprometheus-custom-scraper-ca.crtк тому CA, которому вы уже доверяете. -
Убедитесь, что таргеты остались в состоянии
UPв Prometheus. Больше менять ничего не нужно: сертификат выписан на ту же идентичность, поэтому ранее выданные права продолжают работать. -
Выключите параметр:
kubectl patch moduleconfig monitoring-custom --type merge \ -p '{"spec":{"settings":{"sendLegacyBearerToken":false}}}'Алерт погаснет после переприменения настроек модуля. Если после этого таргет ушёл в
downс ошибкой401, значит егоkube-rbac-proxyне смигрирован: включите параметр обратно, выполните для этого таргета шаг 1 и повторите.