Используйте Servicemonitor для проверки служб с помощью внешнего имени хоста

#kubernetes #prometheus-operator #prometheus-blackbox-exporter

#кубернетес #прометей-оператор #прометей-черный ящик-экспортер

Вопрос:

У нас есть настройка с внешним DNS для создания и привязки записей dns на основе служебных аннотаций.

Например, у нас есть служба для диспетчера оповещений, подобная этой:

 apiVersion: v1 kind: Service metadata:  name: prometheus-kube-prometheus-alertmanager  namespace: prometheus  labels: ...  heritage: Helm  prometheus-monitor-https: 'true'  release: prometheus  self-monitor: 'true'  annotations:  external-dns.alpha.kubernetes.io/hostname: alertmanager.ourdomain.com  external-dns.alpha.kubernetes.io/ttl: '60' spec:  ports:  - name: web  protocol: TCP  port: 80  targetPort: 9093  nodePort: 31126  selector:  alertmanager: prometheus-kube-prometheus-alertmanager  app.kubernetes.io/name: alertmanager  type: LoadBalancer  sessionAffinity: None  externalTrafficPolicy: Cluster  

(сокращенно)

Я хочу использовать экспортер черного ящика с данными из аннотаций, поэтому нам не нужно вручную добавлять сюда мониторинг, а скорее полагаться на kubernetes, чтобы предоставить информацию о том, что нужно отслеживать.

Для этого я написал servicemonitor, но он не соответствует службам и вызывает экспортер черных ящиков.

 apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata:  name: blackbox-exporter-monitor-https-external  namespace: prometheus spec:  namespaceSelector:  any: true  selector:  matchLabels:  prometheus-monitor-https: any  targetLabels:  - environment  - instance  endpoints:  - metricRelabelings:  - sourceLabels: [__meta_kubernetes_service_annotation_external_dns_alpha_kubernetes_io_hostname]  targetLabel: __param_target  replacement: "https://$1"  - sourceLabels: [__param_target]  targetLabel: instance  - targetLabel: __param_scheme  replacement: https  - targetLabel: __address__  replacement: prometheus-blackbox-exporter:9115  path: /probe  params:  debug:  - "true"  module:  - "http_2xx"  

Я не понимаю, почему это не должно соответствовать сервису. У вас есть какие-нибудь намеки?

Ответ №1:

У службы есть метка prometheus-monitor-https: 'true' , в то время как у ServiceMonitor есть selector.matchLabels оф prometheus-monitor-https: any .

Если вы измените это так , чтобы selector.matchLabels значение ServiceMonitor было равно prometheus-monitor-https: 'true' , то я думаю, что это должно сработать. Метки соответствия ищут ожидаемые совпадения пары ключ метки, значение.

Также я вижу, что вы написали namespaceSelector это any: true . Приятно знать, что селектор пространств имен работает по-другому. Он ожидает, что метки пространства имен, в котором он должен найти ресурс, будут указаны. В вашем случае он будет искать пространство имен с меткой any: true . Но я думаю, что вы на самом деле хотите выбрать все пространства имен, что равносильно тому, чтобы вообще не указывать выбор пространства имен.

Комментарии:

1. БОЖЕ мой! Проблема заключалась в селекторе пространства имен. Спасибо!