避免 Prometheus 调用所有 k8s 服务实例(只有一个,应用范围的指标收集)

Posted

技术标签:

【中文标题】避免 Prometheus 调用所有 k8s 服务实例(只有一个,应用范围的指标收集)【英文标题】:Avoiding Prometheus call all instances of k8s service (only one, app-wide metrics collection) 【发布时间】:2020-06-13 02:46:05 【问题描述】:

我需要从部署了多个实例的 Kubernetes 应用程序中公开 Prometheus 集合的应用程序范围的指标,例如由 Horizo​​ntal Pod Autoscaler 缩放。 出于故障转移目的,Pod 的每个实例都会公开抓取点,但是我不希望 Prometheus 实际调用每个 Pod 实例上的抓取端点,一次只调用一个实例,并且仅在必要时故障转移到另一个实例。

统计信息是应用程序范围的,而不是每个 pod 实例,所有实例端点报告相同的数据,并行调用它们没有任何用处,只会增加后端系统上必须查询统计信息的工作负载.我不希望后端调用 30 次(假设应用程序扩展到 30 个 pod),只要调用一次就足够了。

我希望将抓取端点公开为 k8s 服务(并注释服务以进行抓取)应该可以解决问题。然而,Prometheus 并没有通过服务代理并将请求路由到其中一个 pod,而是直接访问服务背后的实例,以及所有这些实例,而不是一次只访问一个。

有没有办法避免 Prometheus 调用所有实例,而让它只调用一个?

服务定义为:

apiVersion: v1
kind: Service
metadata:
  name: k8worker-msvc
  labels:
    app: k8worker-msvc
  annotations:
    prometheus.io/scrape: 'true'
    prometheus.io/path: '/metrics'
    prometheus.io/port: '3110'
spec:
  selector:
    app: k8worker
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 3110
      targetPort: 3110

如果这是不可能的,除了在应用程序内运行领导选举和报告来自非领导实例的空指标数据之外,我还有什么选择?

感谢您的建议。

【问题讨论】:

【参考方案1】:

这意味着指标来自某种后端数据库,而不是通常的进程内导出器。将指标端点移动到连接到同一数据库的新服务,并且只运行它的一个副本。

【讨论】:

另一种选择是让您的领导者 pod 自己标记,以便您可以将其用于服务中的选择器。但这会导致不同步。

以上是关于避免 Prometheus 调用所有 k8s 服务实例(只有一个,应用范围的指标收集)的主要内容,如果未能解决你的问题,请参考以下文章

k8s 上的 Prometheus 自定义指标服务发现

搭建Prometheus监控k8s服务

无法将 K8s 服务添加为 prometheus 目标

一段时间内 K8s 服务的正常运行时间 - Prometheus?

K8s系列-Prometheus使用邮件告警

使用 Prometheus 在 K8s 服务端点上测量 40 倍和 50 倍的错误?