根据 pod 标签动态更新 prometheus scrape 配置

Posted

技术标签:

【中文标题】根据 pod 标签动态更新 prometheus scrape 配置【英文标题】:Dynamically update prometheus scrape config based on pod labels 【发布时间】:2021-01-07 12:07:47 【问题描述】:

我正在尝试加强我的监控,并希望扩大从我们的 Kube 资产中提取到 Prometheus 的指标数量。我们已经有了一个独立的 Prom 实现,它有一个硬编码的配置文件来监控一些裸机服务器,并连接到 cadvisor 以获取通用 Pod 指标。 我想要做的是配置 Kube 以监控来自集群中部署的网络服务器的 apache_exporter 指标,同时在实例扩大时动态添加第二、第三等网络服务器。 我查看了 kube-prometheus 项目,但这似乎更适合没有部署已建立的 Prometheus 的实例。有没有一种简单的方法可以让 prometheus 抓取 Kube API 或 etcd 以提取符合特定条件(即,deploymentType=webserver 之类的标签)的当前 pod 列表并抓取这些 pod 的 apache_exporter 指标,并抓取mysqld_exporter 指标,其中deploymentType=mysql

【问题讨论】:

【参考方案1】:

有一个项目叫kube-prometheus-stack(以前的prometheus-operator):https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack

它有称为ServiceMonitorPodMonitor 的概念:

https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/design.md#servicemonitor https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/design.md#podmonitor

基本上,这是一个将 Prometheus 实例指向抓取目标的选择器。在服务选择器的情况下,它会发现服务背后的所有 pod。对于 pod 选择器,它直接发现 pod。在这两种情况下,Prometheus 抓取配置都会自动更新和重新加载。

例如PodMonitor:

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: example
  namespace: monitoring
spec:
  podMetricsEndpoints:
  - interval: 30s
    path: /metrics
    port: http
  namespaceSelector:
    matchNames:
    - app
  selector:
    matchLabels:
      app.kubernetes.io/name: my-app

请注意,此PodMonitor 对象本身必须由控制器发现。为了实现这一点,你写了一个PodMonitorSelector(link)。这种额外的显式链接是有意完成的 - 这样,如果您的集群上有 2 个 Prometheus 实例(例如 InfraProduct),您可以将哪些 Prometheus 将哪些 Pod 分配到其抓取配置中。

这同样适用于ServiceMonitor

【讨论】:

以上是关于根据 pod 标签动态更新 prometheus scrape 配置的主要内容,如果未能解决你的问题,请参考以下文章

具有动态标签值的 Prometheus 指标

Prometheus 中的 container="POD" 标签是啥,为啥大多数示例都排除了它?

如何基于 Prometheus alert 运行 pod

重新标记配置中的 Prometheus 多源标签

使用 Prometheus Operator 监控自定义 kubernetes pod 指标

prometheus 中 kube_metrics_server_pods_cpu 指标的单位