Почему моему сервисному монитору оператора Prometheus нужна метка «release» для правильной работы?

#prometheus #grafana #prometheus-operator

Вопрос:

Когда я разверну это:

 kind: ServiceMonitor
apiVersion: monitoring.coreos.com/v1
metadata:
  labels:
    app: complaints-monitor
    release: prometheus # <---------
  name: complaints-monitor-svc-monitor
  namespace: default
spec:
  endpoints:
    - path: /metrics
      port: web
  namespaceSelector:
    matchNames:
      - default
  selector:
    matchLabels:
      app: complaints-monitor
 

Моя служба отображается под целями prometheus и работает правильно.

Если вместо этого я применю следующее, цель исчезнет:

 kind: ServiceMonitor
apiVersion: monitoring.coreos.com/v1
metadata:
  labels:
    app: complaints-monitor
  name: complaints-monitor-svc-monitor
  namespace: default
spec:
  endpoints:
    - path: /metrics
      port: web
  namespaceSelector:
    matchNames:
      - default
  selector:
    matchLabels:
      app: complaints-monitor
 

Ответ №1:

Просто выяснил эту проблему после проверки values.yaml kube-prometheus-stack

     ## If true, a nil or {} value for prometheus.prometheusSpec.serviceMonitorSelector will cause the
    ## prometheus resource to be created with selectors based on values in the helm deployment,
    ## which will also match the servicemonitors created
    ##
    serviceMonitorSelectorNilUsesHelmValues: true


    ## ServiceMonitors to be selected for target discovery.
    ## If {}, select all ServiceMonitors
    ##
    serviceMonitorSelector: {}
    ## Example which selects ServiceMonitors with label "prometheus" set to "somelabel"
    # serviceMonitorSelector:
    #   matchLabels:
    #     prometheus: somelabel
 

Когда вы используете helm для установки kube-prometheus-stack , он добавляет метку release: <prometheus-installed-namespace> в ресурс Kubernetes.

Если настройка serviceMonitorSelectorNilUsesHelmValues является true селектором , будет добавлен prometheus.prometheusSpec.serviceMonitorSelector , в вашем случае это release: prometheus так .

Вы сможете увидеть селектор для prometheus, чтобы выбрать serviceMonitor с помощью команды

 kubectl -n <prometheus-installed-namespace> get prometheus -o yaml
 

и искать serviceMonitorSelector .

У вас есть два варианта, чтобы заставить его работать без добавления release ярлыка

  1. Установите serviceMonitorSelectorNilUsesHelmValues значение false , затем prometheus выберет все сервисмОниторы
  2. Или установите serviceMonitorSelector любую метку, которая вам нравится.