如何为 prometheus-operator 创建 ServiceMonitor?

     2023-03-17     53

关键词:

【中文标题】如何为 prometheus-operator 创建 ServiceMonitor?【英文标题】:How to create a ServiceMonitor for prometheus-operator? 【发布时间】:2019-03-30 04:05:02 【问题描述】:

最近,prometheus-operator 被提升为 stable 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,它显然不起作用,但也没有提供任何关于 什么 不起作用的反馈:

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 中。

【问题讨论】:

能否请您发布kubectl get prometheus -o yaml 的输出。您必须在此处指定 serviceMonitorNamespaceSelector: serviceMonitorSelector: (示例将选择所有命名空间中的所有 serviceMonitors)。您的 ServiceMonitor 定义对我来说很好。 改进了 yaml 并在上面添加了 prometheus 配置。 能否请您定义 serviceMonitorSelector: 以排除此选择器无法正常工作。您还可以检查服务的注释。我有一个selector matchLabels: <key>: <value> ,它确实有效。我不确定namespaceSelector: # matchNames: # - default any: true 是否也有效。 基于 prometheus 运算符附带的监视器,我什至可以完全删除 namespaceSelector(尽管我已经尝试了这两种方法)。没有出现在普罗米修斯目标中。是否有任何日志文件可以检查服务监视器在何处被拾取? 头撞墙。看着github.com/coreos/prometheus-operator/blob/…我也需要服务,而不仅仅是服务监视器? 【参考方案1】:

感谢彼得向我展示了原则上的想法并不完全不正确,我找到了缺失的链接。作为servicemonitor 监控服务(哈哈),我错过了创建不属于 gitlab helm chart 的服务的部分。最后,这个 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 图表中定义。

【讨论】:

从 kube-prometheus stack helm 安装 operator 时使用 release: kube-prometheus-stack 标签而不是 release: prometheus【参考方案2】:

我知道这个问题已经得到解答。但是当使用 Helm 的 stable/prometheus-operator 图表部署在 Kubernetes 中的 Prometheus 找不到我的ServiceMonitor 的任何活动目标时,我遇到了类似的问题。 原来我的服务暴露了一个我没有明确命名的端口:

  - protocol: TCP
    port: 8080
    targetPort: uwsgi

我可以通过定位uwsgi 端口在 Ingress 中使用它。但似乎ServiceMonitor 需要在Service 中明确命名端口,即使它与自己的tgetPort 同名:

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

我已经写了一篇关于这个问题的博文here

【讨论】:

感谢您的博文,非常有用 经过一整天的调试,希望我能早点找到这个。很棒的发现。 如果我直接使用一个端口,比如 7896 会怎样?我也觉得还可以 @vrs,我已经尝试过您的修复,但没有奏效。你能帮忙吗? ***.com/questions/60780448/… 感谢您的博客。虽然,现在我对Deployments 上的注释prometheus.io/scrapeprometheus.io/port 的用途感到困惑?【参考方案3】:

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

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

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

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

【讨论】:

这是您从 Prometheus 查找和检查 serviceMonitor 选择器的方法:kubectl -n <your-prometheus-namespace> get prometheus,然后是 kubectl -n <your-prometheus-namespace> get prometheus <resource-name-you-just-found-out> -oyaml 。查找属性serviceMonitorSelector:【参考方案4】:

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

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

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

【讨论】:

CSS/JQuery:如何为表格行创建子菜单,使鼠标从行到菜单保持可见?

】CSS/JQuery:如何为表格行创建子菜单,使鼠标从行到菜单保持可见?【英文标题】:CSS/JQuery:howtocreatesubmenufortablerowthatstaysvisiblemousingfromrowontomenu?【发布时间】:2011-12-1723:16:23【问题描述】:我是一名CSS/JQuery菜鸟,但我已经构建... 查看详情

如何为 Android Studio 编写插件?

】如何为AndroidStudio编写插件?【英文标题】:HowtowriteapluginforAndroidStudio?【发布时间】:2015-04-2703:34:35【问题描述】:我找了资料,可惜资料太少或者很差,有什么文章可以推荐?Eclipse或IntelliJIDEA插件可以在AndroidStudio中工作吗... 查看详情

如何为seaborn histplot绘制奇数个子图

】如何为seabornhistplot绘制奇数个子图【英文标题】:Howtoplotunevennumberofsubplotsforseabornhistplot【发布时间】:2021-05-1007:45:45【问题描述】:我目前有一个包含13列的列表,我正在绘制其分布。我想创建一系列子图,以便这些图占用更... 查看详情

如何为 Python PrettyTable 创建页脚

】如何为PythonPrettyTable创建页脚【英文标题】:HowtoCreateFooterforPythonPrettyTable【发布时间】:2019-10-0215:43:09【问题描述】:我希望在我的PrettyTable中添加一个页脚,总计存储在上面的行中的数据。我在脚本中创建了一个计数,但我... 查看详情

在对话窗口中使用 Glade,如何为按钮添加响应

】在对话窗口中使用Glade,如何为按钮添加响应【英文标题】:WithGladeinadialogwindow,howdoyouaddresponseforbuttons【发布时间】:2016-05-0214:31:17【问题描述】:如何将对话窗口的按钮(例如GtkDialog)与Glade的响应Gtk::ResponseType值联系起来?... 查看详情

如何为 Maven 创建新的打包类型?

】如何为Maven创建新的打包类型?【英文标题】:HowdoIcreateanewpackagingtypeforMaven?【发布时间】:2009-09-1515:00:21【问题描述】:我需要使用Maven创建jar文件,但它们需要安装到具有“foobar”扩展名的存储库中,如果它们可以有自己的... 查看详情

如何为子图有一个共同的图例?

】如何为子图有一个共同的图例?【英文标题】:Howtohaveacommonlegendforsubplots?【发布时间】:2017-05-1804:11:35【问题描述】:我正在尝试创建一个子图。我不希望子图有传说,而是要让人物有一个整体的传说。我读到,可以通过仅... 查看详情

AWS:如何为自定义域名配置 Cloudfront

】AWS:如何为自定义域名配置Cloudfront【英文标题】:AWS:HowtoconfigureCloudfrontforCustomDomainNames【发布时间】:2021-07-2722:21:16【问题描述】:我的设置:API网关-10个API(api1、api2、...),全部映射到一个自定义域名(api.xxx.com)Route53-api.xx... 查看详情

如何为字谜应用程序 (php) 创建子集词?

】如何为字谜应用程序(php)创建子集词?【英文标题】:HowdoIcreatesubsetwordsforananagramapplication(php)?【发布时间】:2010-11-0715:19:19【问题描述】:我创建了一个字谜创建应用程序,通过在我的数据库中创建一个字谜字段,并使用小写... 查看详情

Laravel 4:如何为嵌套资源编写正确的嵌套控制器?

】Laravel4:如何为嵌套资源编写正确的嵌套控制器?【英文标题】:Laravel4:howtowritethecorrectnestedcontrollerfornestedresource?【发布时间】:2013-05-1910:58:43【问题描述】:在Laravel4中,我希望创建一组restful资源如下:http://localhost/posts/1/com... 查看详情

如何为 django 模板中的标签创建动态 id

】如何为django模板中的标签创建动态id【英文标题】:Howtocreatedynamicidsfortagsindjangotemplates【发布时间】:2013-04-0216:48:56【问题描述】:背景:我有一个动态表(因为直到运行时我才知道它的大小/元素),我正在尝试使用javascript... 查看详情

如何为 CitusDB 的 cstore_fdw 添加索引?

】如何为CitusDB的cstore_fdw添加索引?【英文标题】:HowtoaddindextoCitusDB\'scstore_fdw?【发布时间】:2015-01-3120:53:05【问题描述】:我目前正在postgres中构建一个OLAP数据库,并希望比较列存储与行存储数据库的性能。CitusDB开源了它的col... 查看详情

如何为包含所有存储行的现有 SQL Server 表生成 INSERT 脚本?

】如何为包含所有存储行的现有SQLServer表生成INSERT脚本?【英文标题】:HowcanIgenerateanINSERTscriptforanexistingSQLServertablethatincludesallstoredrows?【发布时间】:2011-07-0105:22:09【问题描述】:我正在寻找一种使用SQLManagementStudio2008R2生成“... 查看详情

如何为数组的'n'个维循环?(代码片段)

我正在尝试创建一种方法,该方法将对项目的数量进行总计(为null或其他),然后返回该总和。以下是一些预期的示例输入:arraySum(newint[10]);//10arraySum(newint[2][5]);//10arraySum(newint[5][5][5]);//125问题是,我实际上永远无法知道我正在... 查看详情

您如何为 DSpace 创建一个新的、可搜索的元数据模式?

】您如何为DSpace创建一个新的、可搜索的元数据模式?【英文标题】:Howdoyoumakeanew,searchablemetadataschemaforDSpace?【发布时间】:2016-04-1700:45:17【问题描述】:所以DSpace默认使用都柏林核心,显然您无法触及该架构;因为我正在创建... 查看详情

如何为带有确定/取消按钮的数据绑定 WPF 对话框设计支持数据类型?

】如何为带有确定/取消按钮的数据绑定WPF对话框设计支持数据类型?【英文标题】:HowdoIdesignbackingdatatypesforadataboundWPFdialogwithOk/Cancelbuttons?【发布时间】:2008-12-0704:25:56【问题描述】:我在MicrosoftSqlCE中创建了一个用于保存一些... 查看详情

当.name 属性在设计时未知时,如何为列表框控件的单击事件编程

】当.name属性在设计时未知时,如何为列表框控件的单击事件编程【英文标题】:howtoprogramforaclickeventofalistboxcontrolwhenthe.namepropertyisunknownatdesigntime【发布时间】:2019-06-2612:45:32【问题描述】:我有一个有多种形式的应用程序。在... 查看详情

如何为特定页面创建父组件(以便能够在父级中添加反应上下文)?

】如何为特定页面创建父组件(以便能够在父级中添加反应上下文)?【英文标题】:HowcanIcreateaparentcomponentforspecificpages(tobeabletoaddreactcontextinsideparent)?【发布时间】:2021-11-2311:00:15【问题描述】:我有一组特定的页面将使用特... 查看详情