Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Настройка коллекции метрик Prometheus из кластера Kubernetes описывает, как использовать ConfigMap для настройки срезов метрик Prometheus из целевых объектов по умолчанию в кластере Kubernetes. В этой статье описывается, как использовать пользовательские определения ресурсов (CRD), чтобы создавать задания по сбору данных для дальнейшей настройки и добавления новых целевых объектов.
Пользовательские определения ресурсов (CRD)
Включение управляемой службы Azure Monitor для Prometheus автоматически развертывает пользовательские определения ресурсов (CRD) для мониторов pod и мониторов служб. Эти CRD совпадают с мониторами Pod OSS и мониторами служб OSS для Prometheus, за исключением того, что изменено имя группы. Если в вашем кластере уже существуют CRD Prometheus и пользовательские ресурсы, эти CRD не будут конфликтовать с CRD, созданными дополнением. В то же время управляемая надстройка Prometheus не распознаёт CRD, созданные для OSS Prometheus. Это разделение намеренно выполнено для изоляции заданий парсинга.
Создать Pod или монитор службы
Используйте шаблоны Pod и Service Monitor и следуйте спецификации API для создания пользовательских ресурсов (PodMonitor и Service Monitor). Единственное изменение, необходимое для существующих CR OSS (настраиваемых ресурсов) для интеграции с управляемым Prometheus — изменение группы API на azmonitoring.coreos.com/v1.
Это важно
Не забудьте использовать labelLimit, labelNameLengthLimit и labelValueLengthLimit, указанные в шаблонах, чтобы они не были удалены во время обработки. Дополнительные сведения о разных разделах этого файла см. в разделе Параметры конфигурации сбора данных ниже.
Мониторы pod и сервиса должны выглядеть следующим образом:
Пример монитора pod
# Note the API version is azmonitoring.coreos.com/v1 instead of monitoring.coreos.com/v1
apiVersion: azmonitoring.coreos.com/v1
kind: PodMonitor
# Can be deployed in any namespace
metadata:
name: reference-app
namespace: app-namespace
spec:
labelLimit: 63
labelNameLengthLimit: 511
labelValueLengthLimit: 1023
# The selector specifies which pods to filter for
selector:
# Filter by pod labels
matchLabels:
environment: test
matchExpressions:
- key: app
operator: In
values: [app-frontend, app-backend]
# [Optional] Filter by pod namespace. Required if service is in another namespace.
namespaceSelector:
matchNames: [app-frontend, app-backend]
# [Optional] Labels on the pod with these keys will be added as labels to each metric scraped
podTargetLabels: [app, region, environment]
# Multiple pod endpoints can be specified. Port requires a named port.
podMetricsEndpoints:
- port: metricscs from the exa
Пример монитора служб
# Note the API version is azmonitoring.coreos.com/v1 instead of monitoring.coreos.com/v1
apiVersion: azmonitoring.coreos.com/v1
kind: ServiceMonitor
# Can be deployed in any namespace
metadata:
name: reference-app
namespace: app-namespace
spec:
labelLimit: 63
labelNameLengthLimit: 511
labelValueLengthLimit: 1023
# The selector filters endpoints by service labels.
selector:
matchLabels:
app: reference-app
# Multiple endpoints can be specified. Port requires a named port.
endpoints:
- port: metrics
Разверните Pod или мониторинг службы
Разверните pod или монитор службы, как показано в следующих примерах, используя kubectl apply.
Создание примера приложения
Разверните пример приложения, предоставляющего метрики Prometheus для настройки с использованием мониторинга Pod/Service.
kubectl apply -f https://raw.githubusercontent.com/Azure/prometheus-collector/refs/heads/main/internal/referenceapp/prometheus-reference-app.yaml
Создайте монитор pod и/или монитор службы для сбора метрик
Разверните монитор pod, настроенный для очистки приложения на предыдущем шаге.
Pod монитор
kubectl apply -f https://raw.githubusercontent.com/Azure/prometheus-collector/refs/heads/main/otelcollector/deploy/example-custom-resources/pod-monitor/pod-monitor-reference-app.yaml
Монитор сервисов
kubectl apply -f https://raw.githubusercontent.com/Azure/prometheus-collector/refs/heads/main/otelcollector/deploy/example-custom-resources/service-monitor/service-monitor-reference-app.yaml
Устранение неполадок
При успешном применении мониторов pod или сервисов надстройка должна автоматически начать сбор метрик с целевых объектов. Ознакомьтесь с коллекцией метрик Prometheus в Azure Monitor для общего устранения неполадок с пользовательскими ресурсами, а также для обеспечения отображения целевых объектов в 127.0.0.1/targets.
Очистка параметров конфигурации
В следующих разделах описаны параметры, поддерживаемые в файле конфигурации Prometheus, используемом в CRD. Дополнительные сведения об этих параметрах см. в справочнике по конфигурации Prometheus .
Глобальные параметры
Формат конфигурации для глобальных параметров совпадает с конфигурацией OSS prometheus.
global:
scrape_interval: <duration>
scrape_timeout: <duration>
external_labels:
<labelname1>: <labelvalue>
<labelname2>: <labelvalue>
scrape_configs:
- <job-x>
- <job-y>
Параметры, заданные в глобальном разделе, применяются ко всем заданиям по сбору данных в CRD, но заменяются, если они указаны в отдельных заданиях.
Замечание
Если вы хотите использовать глобальные параметры, которые применяются ко всем заданиям для сбора данных, и даже если у вас есть только пользовательские ресурсы, вам по-прежнему нужно создать ConfigMap только с глобальными параметрами. Параметры для каждого из них в пользовательских ресурсах будут переопределять те, что указаны в глобальном разделе.
Очистка конфигураций
Поддерживаемые методы обнаружения целевых объектов для пользовательских ресурсов в настоящее время являются pod и монитором служб.
Мониторы подов и служб
Целевые объекты, обнаруженные с помощью мониторов pod и служб, имеют разные __meta_* метки в зависимости от используемого монитора. Метки в relabelings разделе можно использовать для фильтрации целевых объектов или замены меток для целевых объектов. Ознакомьтесь с примерами мониторов pod и служб.
Переименования
Раздел relabelings применяется во время обнаружения целевого объекта и применяется к каждому целевому объекту для задания. В следующих примерах показаны способы использования relabelings.
Добавление метки Добавьте новую метку, названную example_label, со значением example_value, для каждой метрики задания. Используйте __address__ в качестве исходной метки только потому, что эта метка всегда существует и добавляет метку для каждого целевого объекта задания.
relabelings:
- sourceLabels: [__address__]
targetLabel: example_label
replacement: 'example_value'
Используйте метки Pod или ServiceMonitor
Целевые объекты, обнаруженные с помощью мониторов pod и служб, имеют разные __meta_* метки в зависимости от используемого монитора. Метки __* удаляются после обнаружения целевых объектов. Чтобы использовать их для фильтрации на уровне метрик, сначала присвойте им имя метки с помощью relabelings. Затем используется metricRelabelings для фильтрации.
# Use the kubernetes namespace as a label called 'kubernetes_namespace'
relabelings:
- sourceLabels: [__meta_kubernetes_namespace]
action: replace
targetLabel: kubernetes_namespace
# Keep only metrics with the kubernetes namespace 'default'
metricRelabelings:
- sourceLabels: [kubernetes_namespace]
action: keep
regex: 'default'
Перемаркировка заданий и экземпляров
Вы можете изменить значения меток job и instance на основе исходной метки, как и значения любой другой метки.
# Replace the job name with the pod label 'k8s app'
relabelings:
- sourceLabels: [__meta_kubernetes_pod_label_k8s_app]
targetLabel: job
# Replace the instance name with the node name. This is helpful to replace a node IP
# and port with a value that is more readable
relabelings:
- sourceLabels: [__meta_kubernetes_node_name]
targetLabel: instance
Замечание
Если у вас есть конфигурации перенастроения, убедитесь, что перенастройка не отфильтровывает целевые объекты, а метки, настроенные правильно, соответствуют целевым объектам.
Переназначения метрик
Изменения метрик применяются после слома и перед приемом. Используйте раздел metricRelabelings для фильтрации метрик после сбора. См. следующие примеры.
Удаление метрик по имени
# Drop the metric named 'example_metric_name'
metricRelabelings:
- sourceLabels: [__name__]
action: drop
regex: 'example_metric_name'
Сохранение только определенных метрик по имени
# Keep only the metric named 'example_metric_name'
metricRelabelings:
- sourceLabels: [__name__]
action: keep
regex: 'example_metric_name'
# Keep only metrics that start with 'example_'
metricRelabelings:
- sourceLabels: [__name__]
action: keep
regex: '(example_.*)'
Фильтрация метрик по меткам
# Keep metrics only where example_label = 'example'
metricRelabelings:
- sourceLabels: [example_label]
action: keep
regex: 'example'
# Keep metrics only if `example_label` equals `value_1` or `value_2`
metricRelabelings:
- sourceLabels: [example_label]
action: keep
regex: '(value_1|value_2)'
# Keep metrics only if `example_label_1 = value_1` and `example_label_2 = value_2`
metricRelabelings:
- sourceLabels: [example_label_1, example_label_2]
separator: ';'
action: keep
regex: 'value_1;value_2'
# Keep metrics only if `example_label` exists as a label
metricRelabelings:
- sourceLabels: [example_label_1]
action: keep
regex: '.+'
Переименование метрик Переименование метрик не поддерживается.
Базовая аутентификация и токены Bearer
Замечание
Начиная с Kubernetes 1.37, Azure Managed Prometheus (или ama-metrics) использует доступ к секретам Kubernetes в пределах пространства имён в конфигурациях PodMonitor и ServiceMonitor. Необходимо настроить доступ к секретам пространства имен, если вы используете Kubernetes 1.37 или более поздней версии, а служба ServiceMonitor или PodMonitor использует basicAuth и любую конфигурацию, которая ссылается на секреты Kubernetes.
Ограниченный доступ к секретам для Pod/ServiceMonitors
Начиная с Kubernetes 1.37, Azure Managed Prometheus (или ama-metrics) будет использовать доступ к секретам Kubernetes в пределах пространства имен в конфигурациях PodMonitor и ServiceMonitor. Ранее компонент ama-metrics имел разрешения на уровне всего кластера для чтения секретов во всех пространствах имен. Это обновление повышает безопасность, требуя явного доступа на уровне пространства имен к секретам, используемым для базовой проверки подлинности
При этом изменении:
- Доступ к секретам ограничен только пространствами имен, которые вы явно настраиваете
- Необходимо предоставить разрешения на управление доступом на основе ролей (RBAC) в каждом пространстве имен, где используются секреты.
Поведение по умолчанию по версии Kubernetes
Версии Kubernetes до версии 1.37
- Доступ к секретам на уровне кластера по-прежнему включен для обратной совместимости
- Выполните действия, описанные здесь , чтобы настроить базовую проверку подлинности для ServiceMonitor и PodMonitor
Kubernetes версии 1.37 и более поздних версий
- Доступ к секретам на уровне кластера удаляется
- По умолчанию ни одно пространство имен не отслеживается на предмет секретов
- Вы должны:
- Настройте разрешенные пространства имен
- Добавьте права RBAC в каждом пространстве имён
Когда необходимо настроить эту настройку
Необходимо настроить доступ к секретам в пределах пространства имён, если вы используете Kubernetes версии 1.37 или более поздней и ваш ServiceMonitor или PodMonitor использует basicAuth и любую конфигурацию, которая ссылается на секреты Kubernetes.
Настроить доступ к секретам для PodMonitor и ServiceMonitor для базовой аутентификации
Выполните следующие действия, чтобы разрешить Azure Managed Prometheus безопасно читать секреты.
Шаг 1. Создание базового секрета проверки подлинности
Создайте секрет в пространстве имен, где выполняется приложение:
apiVersion: v1
kind: Secret
metadata:
name: my-basic-auth
namespace: my-app # <-- your application namespace
type: Opaque
data:
username: <base64-encoded-username>
password: <base64-encoded-password>
Шаг 2. Ссылка на секрет в ServiceMonitor/PodMonitor
Пример ServiceMonitor:
apiVersion: azmonitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-service-monitor
namespace: my-app
spec:
selector:
matchLabels:
app: my-app
endpoints:
- port: metrics
basicAuth:
username:
name: my-basic-auth # Secret name from Step 1
key: username
password:
name: my-basic-auth
key: password
Пример PodMonitor:
apiVersion: azmonitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: my-pod-monitor
namespace: my-app
spec:
selector:
matchLabels:
app: my-app
podMetricsEndpoints:
- port: metrics
basicAuth:
username:
name: my-basic-auth
key: username
password:
name: my-basic-auth
key: password
Шаг 3. Настройка secrets_access_namespaces
Измените ama-metrics-settings-configmap.yaml, чтобы указать пространства имён, в которых хранятся ваши секреты:
kind: ConfigMap
apiVersion: v1
metadata:
name: ama-metrics-settings-configmap
namespace: kube-system
data:
prometheus-collector-settings: |-
cluster_alias = ""
secrets_access_namespaces = "kube-system,my-app"
Замечание
- Используйте список пространств имён, разделённых запятыми
- Включите kube-system, если у вас там тоже есть секретные данные
- Изменения вступают в силу после перезапуска pod ama-metrics
Шаг 4: Создайте RBAC в каждом пространстве имен (Kubernetes >= 1.37)
В Kubernetes >= 1.37 ClusterRole больше не предоставляет доступ ко всем секретам кластера. Необходимо создать Role и RoleBinding в каждом пространстве имен, указанном в secrets_access_namespaces (включая kube-system при необходимости). Примените следующее в каждом пространстве имен. Замените my-app целевое пространство имен:
Создайте роль:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: ama-metrics-secrets-reader
namespace: my-app # <-- repeat for each namespace
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "watch"]
Создайте RoleBinding:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: ama-metrics-secrets-rolebinding
namespace: my-app # <-- repeat for each namespace
subjects:
- kind: ServiceAccount
name: ama-metrics-serviceaccount
namespace: kube-system # <-- SA lives in kube-system
roleRef:
kind: Role
name: ama-metrics-secrets-reader
apiGroup: rbac.authorization.k8s.io
Замечание
Межпространственное примечание: RoleBinding в my-app ссылается на ServiceAccount в kube-system. Это корректная конфигурация Kubernetes RBAC — RoleBinding может ссылаться на субъект из любого пространства имён.
Шаг 5: Проверьте
После перезапуска ama-metrics pod:
- Проверьте журналы целевого распределителя:
SecretsAccessNamespaces from configmap: [kube-system my-app] - Убедитесь, что цели ServiceMonitor/PodMonitor отображаются в списке обнаруженных целей распределителя целей.
- Убедитесь, что результаты сбора метрик включают метрики из эндпоинтов, защищённых базовой аутентификацией.
Пример: несколько пространств имен
Если у вас есть секреты в my-app, backendи monitoring:
Параметр ConfigMap:
secrets_access_namespaces = "kube-system,my-app,backend,monitoring"RBAC (>только для 1.37): Создайте Role + RoleBinding (из шага 4) в каждом из
my-app,backendиmonitoring.
Устранение неполадок
| Симптом | Причина | Исправление |
|---|---|---|
| Целевые объекты ServiceMonitor не обнаружены | Секрет недоступен для чтения целевым распределителем | Убедитесь, что пространство имён указано в secrets_access_namespaces и что Role и RoleBinding существуют |
forbidden: User "system:serviceaccount:kube-system:ama-metrics-serviceaccount" cannot list resource "secrets" в журналах TA |
RBAC отсутствует в пространстве имен | Создайте Role и RoleBinding в этом пространстве имён (Шаг 4) |
| Целевые объекты обнаружены, но сбой сбоем с 401 | Секрет существует, но учетные данные неверны | Убедитесь, что поля секрета data имеют правильные значения в кодировке Base64 |
| Параметр игнорируется после обновления ConfigMap | Pod не перезагрузился | Перезапустите ama-metrics pod, чтобы применить новые значения ConfigMap |
Настройка базовой проверки подлинности для Kubernetes 1.36 и более ранних версий
Целевые объекты очистки с помощью базовых маркеров проверки подлинности или носителя поддерживаются с помощью PodMonitors и ServiceMonitors. Убедитесь, что секрет, содержащий имя пользователя, пароль или токен, находится в том же пространстве имен, что и монитор pod/service. Это поведение аналогично поведению OSS prometheus-operator.
Очистка на основе TLS
Если вы хотите собирать метрики Prometheus с конечной точки HTTPS, в конфигурации Prometheus, PodMonitor или ServiceMonitor для scheme должно быть задано значение https, а также должны быть указаны дополнительные настройки TLS.
Создайте секрет с именем
ama-metrics-mtls-secretв пространстве имёнkube-system. Каждая пара "ключ-значение", указанная в разделе данных секретного объекта, будет подключена в качестве отдельного файла в этом расположении /etc/prometheus/certs с именами файлов, которые совпадают с ключами, указанными в разделе данных. Значения секретов должны быть закодированы в кодировке Base64.Ниже приведен пример YAML секрета:
apiVersion: v1 kind: Secret metadata: name: ama-metrics-mtls-secret namespace: kube-system type: Opaque data: <certfile>: base64_cert_content <keyfile>: base64_key_contentСекрет
ama-metrics-mtls-secretсмонтирован в подыama-metricsпо пути/etc/prometheus/certs/и доступен для средства сбора метрик Prometheus. Ключ будет именем файла. Это значение декодируется из Base64 и добавляется как содержимое файла в контейнере.Укажите файловый путь в конфигурации Prometheus, PodMonitor или ServiceMonitor:
- Используйте следующий пример, чтобы указать параметр конфигурации TLS для PodMonitor или ServiceMonitor:
tlsConfig: ca: secret: key: "<certfile>" name: "ama-metrics-mtls-secret" cert: secret: key: "<certfile>" name: "ama-metrics-mtls-secret" keySecret: key: "<keyfile>" name: "ama-metrics-mtls-secret" insecureSkipVerify: false
Базовая проверка подлинности и TLS
Если вы хотите использовать базовый маркер проверки подлинности или маркер носителя (учетные данные на основе файлов) и параметры проверки подлинности TLS в CRD, убедитесь, что секрет ama-metrics-mtls-secret включает все ключи в разделе данных с соответствующими значениями в кодировке Base64, как показано ниже:
apiVersion: v1
kind: Secret
metadata:
name: ama-metrics-mtls-secret
namespace: kube-system
type: Opaque
data:
certfile: base64_cert_content # used for TLS
keyfile: base64_key_content # used for TLS
password1: base64-encoded-string # used for basic auth
password2: base64-encoded-string # used for basic auth
Замечание
/etc/prometheus/certs/ путь обязателен, но password1 может быть любой строкой и должно соответствовать ключу для данных в секрете, созданном выше. Это связано с тем, что секрет ama-metrics-mtls-secret смонтирован по пути /etc/prometheus/certs/ внутри контейнера.
Значение, закодированное в Base64, автоматически декодируется подами ama-metrics при монтировании секрета как файла. Убедитесь, что имя секрета — ama-metrics-mtls-secret и оно находится в пространстве имен kube-system.
Сначала необходимо создать секрет, а затем создать ConfigMap, PodMonitor или ServiceMonitor в пространстве имен kube-system. Порядок создания секретов имеет значение. Если секрет отсутствует, но существует ConfigMap, PodMonitor или ServiceMonitor, указывающий на секрет, следующая ошибка будет зафиксирована в журналах контейнера ama-metrics prometheus-collector: no file found for cert....
Дополнительные сведения о параметрах конфигурации TLS см. в tls_config .
Следующие шаги
- Дополнительные сведения о сборе метрик Prometheus.