如何为prometheus-operator创建ServiceMonitor?

问题描述 投票:0回答:5

最近,prometheus-operator 已升级为稳定版 Helm Chart (https://github.com/helm/charts/tree/master/stable/prometheus-operator)。

我想了解如何在 k8s 集群中添加自定义应用程序以通过 prometheus-operator 进行监控。举个 gitlab runner 的例子,默认情况下提供 9252 上的指标(https://docs.gitlab.com/runner/monitoring/#configuration-of-the-metrics-http-server)。

我有一个基本的 yaml,显然不起作用,但也没有提供任何关于 what 不起作用的反馈:

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

这是普罗米修斯的配置:

> kubectl get prometheus -o yaml

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

所以选择器应该匹配。我所说的“不工作”是指端点不会出现在 prometheus UI 中。

kubernetes coreos kubernetes-helm
5个回答
42
投票

感谢彼得向我展示了这个想法原则上并不完全错误,我找到了缺失的链接。由于

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

很高兴知道:

metrics
targetPort
是在 gitlab runner 图表中定义的。


32
投票

这张图完美展示了Prometheus、ServiceMonitors和Services之间的联系

如果任何匹配不正确,目标将不会显示。

了解更多:https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/troubleshooting.md#troubleshooting-servicemonitor-changes


23
投票

我知道这个问题已经有了答案。但当使用 Helm 的 stable/prometheus-operator 图表在 Kubernetes 中部署 Prometheus 时,我遇到了类似的问题,无法为我的

ServiceMonitor
找到任何活动目标。 事实证明,我的服务暴露了一个我没有明确命名的端口:

  - protocol: TCP
    port: 8080
    targetPort: uwsgi

我可以通过定位

uwsgi
端口在 Ingress 中使用它。但似乎
ServiceMonitor
需要在
Service
中明确命名的端口,即使它与自己的 tagetPort 有相同的名称:

  - name: uwsgi
    protocol: TCP
    port: 8080
    targetPort: uwsgi

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


2
投票

以上解决方案到目前为止都运行良好。

发布标签很重要。没有这个标签,Prom 就无法将应用指标添加到其目标列表中。

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

如果您遇到 Prometheus 显示目标但不显示端点的情况,请查看以下内容:https://github.com/prometheus-operator/prometheus-operator/issues/3053


0
投票

要添加到之前的答案,通过使用

kube-prometheus-stack
helm 图表,无需创建
kind: Prometheus
k8s 模板。

只有

ServiceMonitor
就足够了,有了正确的
port
名称,并且
matchLabels
指的是
Service
labels
ServiceMonitor
本身可以没有
labels

参考:

https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/troubleshooting.md#using-textual-port-number-instead-of-port-name

© www.soinside.com 2019 - 2024. All rights reserved.