如何为prometheus-operator创建一个ServiceMonitor?

62

最近,prometheus-operator已经被推广为稳定的helm图表(https://github.com/helm/charts/tree/master/stable/prometheus-operator)。

我想了解如何将自定义应用程序添加到在k8s集群中由prometheus-operator进行监视。如果能提供一个示例,例如默认提供9252指标的gitlab runner(https://docs.gitlab.com/runner/monitoring/#configuration-of-the-metrics-http-server)将不胜感激。

我有一个基本的yaml文件,显然不能正常工作,也没有提供任何关于哪里出问题的反馈:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: gitlab-monitor
  # Change this to the namespace the Prometheus instance is running in
  namespace: default
  labels:
    app: gitlab-runner-gitlab-runner
    release: prometheus
spec:
  selector:
    matchLabels:
      app: gitlab-runner-gitlab-runner
  namespaceSelector:
    # matchNames:
    # - default
    any: true
  endpoints:
  - port: http-metrics
    interval: 15s

这是Prometheus的配置:

> kubectl get prometheus -o yaml

...
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector:
  matchLabels:
    release: prometheus
...

因此,选择器应该匹配。我所说的“不起作用”是指端点未出现在Prometheus UI中。


2
请问您能否提供 kubectl get prometheus -o yaml 的输出结果。在此处,您需要指定 serviceMonitorNamespaceSelector: {}serviceMonitorSelector: {}(例如将选择所有命名空间中的 serviceMonitors)。我认为您的 ServiceMonitor 定义看起来很好。 - Peter Ittner
改进了yaml并添加了Prometheus配置。 - andig
2
请问您能否定义 serviceMonitorSelector: {},以便排除该选择器无法正常工作的可能性。您还可以检查服务的注释。在我的情况下,我有一个选择器 matchLabels: <key>: <value> 它是有效的。我不确定namespaceSelector: # matchNames: # - default any: true ` 是否也有效。 - Peter Ittner
基于 Prometheus Operator 提供的监控器,我甚至可以完全删除 namespaceSelector(尽管我已经尝试了两种方法)。但是在 Prometheus 目标中没有显示。是否有任何日志文件可以检查服务监视器被拾取的位置? - andig
2
撞头撞到墙上。看了一下 https://github.com/coreos/prometheus-operator/blob/f9bc0aa0fd9aa936f500d9d241098863c60d873d/Documentation/user-guides/running-exporters.md 我需要一个服务,而不仅仅是一个服务监视器? - andig
5个回答

42

多亏 Peter 给我指出了这个想法在原则上并不完全不正确,我找到了失踪的链接。作为一个“服务监视器”,servicemonitor 的确监控服务(哈哈),我错过了创建一个不属于 gitlab helm 图表的服务的部分。最后,这个 YAML 对我很有帮助,指标出现在 Prometheus 中:

# Service targeting gitlab instances
apiVersion: v1
kind: Service
metadata:
  name: gitlab-metrics
  labels:
    app: gitlab-runner-gitlab-runner
spec:
  ports:
  - name: metrics # expose metrics port
    port: 9252 # defined in gitlab chart
    targetPort: metrics
    protocol: TCP
  selector:
    app: gitlab-runner-gitlab-runner # target gitlab pods
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: gitlab-metrics-servicemonitor
  # Change this to the namespace the Prometheus instance is running in
  # namespace: default
  labels:
    app: gitlab-runner-gitlab-runner
    release: prometheus
spec:
  selector:
    matchLabels:
      app: gitlab-runner-gitlab-runner # target gitlab service
  endpoints:
  - port: metrics
    interval: 15s
很好知道: metricstargetPort在GitLab Runner图表中定义。

4
在使用 kube-prometheus stack helm 安装 operator 时,请使用 release: kube-prometheus-stack 标签,而不是 release: prometheus - Francisco Cardoso
非常好,但是你的ServiceMonitor gitlab-metrics-servicemonitor应该放在哪个命名空间中? - elmazzun

34

实际上,Prometheus并不从服务中抓取指标。Prometheus会询问服务:“嘿,你的终端点是什么?”然后,Prometheus将单独抓取每个终端点(这与单独抓取每个Pod相同)。这就是为什么通常每个Pod都有一个出口边车,以便可以按Pod报告指标的原因。 - AFP_555
1
我非常喜欢描绘ServiceMonitor概念的图片,每当同事问它是如何工作时,我都会向他们展示这张图片。 - Pavol Krajkovič

23
我知道这个问题已经有答案了。但是当我在Kubernetes上使用Helm的stable/prometheus-operator图表部署Prometheus时,遇到了类似的问题,无法找到任何活动的目标来监控我的ServiceMonitor。 事实证明,我的Service暴露了一个我没有明确命名的端口。
  - protocol: TCP
    port: 8080
    targetPort: uwsgi

我可以在Ingress中使用它,通过定位uwsgi端口。但是似乎ServiceMonitor需要在Service中显式命名端口,即使它与自己的targetPort具有相同的名称。
  - name: uwsgi
    protocol: TCP
    port: 8080
    targetPort: uwsgi

我已经写了一篇关于这个问题的博客文章在这里

1
如果我直接使用端口,比如7896,会怎样呢?我认为也可以。 - 4t8dds
@vrs,我尝试了你的修复方法,但没有起作用。你能帮忙吗?https://stackoverflow.com/questions/60780448/setup-prometheus-operator-to-monitor-net-core-app - ShaneKm
感谢您的博客。不过,现在我对Deployments上的prometheus.io/scrapeprometheus.io/port注释的目的感到困惑了? - cogitoergosum
目的是相同的,应该能够正常工作,但是据我所知,注释被认为是一种已弃用的定位服务的方式。 - Timur Bakeyev

2

目前为止,上述解决方案都很好用。

发布标签非常重要。 如果没有发布标签,Prometheus就无法将应用程序指标添加到其目标列表中。

请确保通过检查Prometheus的ServiceMonitor来添加正确的发布标签。还要确保在元数据和规格部分中将发布标签添加到服务和部署文件中。

如果遇到Prometheus显示目标但不显示端点的情况,请查看此链接:https://github.com/prometheus-operator/prometheus-operator/issues/3053


3
以下是如何查找和检查Prometheus中的serviceMonitor选择器: 运行以下命令: kubectl -n <your-prometheus-namespace> get prometheus 然后运行: kubectl -n <your-prometheus-namespace> get prometheus <resource-name-you-just-found-out> -oyaml 查找属性serviceMonitorSelector: - Francisco Cardoso

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接