如何为运行多个 docker 网络的服务配置 "global" Prometheus



我有一个"运行普罗米修斯的网络,然后有多个迷你网络,其中运行不同的微服务。我试图从微服务(在那些多个迷你网络下)中抓取指标,而不将所有迷你网络添加到"全球"中。网络。

我检查了如何在多位置场景中配置普罗米修斯?但我不认为这是适合我的方案。

在Docker Swarm上运行,我们可以利用Docker Swarm的网状网络来实现这一点。

首先,你需要一些东西——一个主普罗米修斯堆栈,它定义一个全局网络,这个普罗米修斯连接到这个网络。

master-prometheus-stack.yml

networks:
prometheus:
name: prometheus
driver: overlay
attachable: true
configs:
prometheus-1:
file: prometheus-master.yml
services:
prometheus:
image: prom/prometheus
networks:
- prometheus
configs:
source: prometheus-1
target: /etc/prometheus/prometheus.yml

这个prometheus实例配置了一个任务:它为子prometheus实例查找dnsrr记录tasks.prometheus.scrape,并从它们的federate入口点抓取所有内容。

prometheus-master.yml

scrape_configs:
- job_name: federate-prometheus
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job=~".*"}'
dns_sd_configs:
- names: [ tasks.prometheus.scrape ]
type: 'A'
port: 9090

然后,这个巧妙计划的下一部分很简单:每个微服务堆栈都部署自己的私有prometheus实例。

stack.yml

networks:
stack:
prometheus_public:
name: prometheus
external: true
services:
other-services:
...
prometheus:
image: prom/prometheus:
networks:
stack:
prometheus_public:
aliases: ["prometheus.scrape"]
configs:
- source: prometheus-1
target: /etc/prometheus/prometheus.yml

这个prometheus实例应该有一个prometheus配置文件,其中包含堆栈中每个微服务所需的所有抓取作业。普罗米修斯实例被附加到微服务网络上,这样它就可以到达所有的微服务来抓取它们。它还连接到公共prometheus网络,将堆栈的其余部分与此连接隔离开来。为了表明它想要被抓取,我们在该网络上添加了一个特定的别名"prometheus.scrape",这确保docker swarm将这个prometheus的ip添加到该网络上的dnsrr记录tasks.prometheus.scrape中。

现在,因为dns_sd_configs是动态探测的,当微服务(每个微服务都有自己的prometheus实例)被部署时,它们会添加自己的"prometheus.scrape"公共网络的别名,主Prometheus实例将发现它们,并从它们的/联邦端点自动合并它们的指标。相反,删除堆栈干净地注销了额外的实例。

分隔作业实际上生成了谨慎的仪表板,可能通过添加额外的标记来标识源堆栈,对于读者来说仍然是一个练习。

最新更新