docker swarm 中的 Prometheus dns 服务发现

Posted

技术标签:

【中文标题】docker swarm 中的 Prometheus dns 服务发现【英文标题】:Prometheus dns service discovery in docker swarm 【发布时间】:2018-07-07 17:08:23 【问题描述】:

我正在为我的服务寻找一些监控和警报解决方案。我发现了以下不错的相关作品。

Prometheus monitoring for docker swarm Monitoring a docker swarm cluster with Prometheus

这两部作品都使用 dns 服务发现来监控服务的多个副本。

我试图重播这些工作,但我发现我只能获得单个后端容器 ip。

# dig A node-exporter

; <<>> DiG 9.10.4-P8 <<>> A node-exporter
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18749
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;node-exporter.         IN  A

;; ANSWER SECTION:
node-exporter.      600 IN  A   10.0.0.42

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Mon Jan 29 02:57:51 UTC 2018
;; MSG SIZE  rcvd: 60

查看服务时发现node-exporter的端点模式是vip。

> docker inspect 242pn4obqsly
...
"Endpoint": 
"Spec": 
    "Mode": "vip"
,
"VirtualIPs": [
    
        "NetworkID": "61fn8hmgwg0n7rhg49ju2fdld",
        "Addr": "10.0.0.3/24"
    
]
...

这意味着当与dns联系时,prometheus只能获得一个delegate service ip。然后内部 lbs 策略会将收入请求路由到不同的后端实例。

那么相关作品是如何成功的呢?

谢谢!

【问题讨论】:

我想我可以指定 dnsrr 端点模式来获得 client-dns 服务发现。但是我在相关作品中没有找到这个设置…… 【参考方案1】:

对于Prometheus DNS 服务发现,您不想通过Virtual IP (VIP) 使用docker swarm 内部负载平衡。

您正在寻找的是按任务服务 DNS。要获取 swarm 中每个服务的 IP 地址,只需将 docker swarm 服务名称的 DNS 前缀 加上 tasks.

例如,在具有 3 个节点的 swarm 中,我得到:

$ nslookup tasks.node-exporter
Server:    127.0.0.11
Address 1: 127.0.0.11

Name:      tasks.node-exporter
Address 1: 10.210.0.x node-exporter.xxx.mynet
Address 2: 10.210.0.y node-exporter.yyy.mynet
Address 3: 10.210.0.z node-exporter.zzz.mynet

但是当我查询不带前缀的服务名称时,我得到一个 IP(将请求负载平衡到每个容器的 VIP):

$ nslookup node-exporter
Server:    127.0.0.11
Address 1: 127.0.0.11

Name:      node-exporter
Address 1: 10.210.0.w ip-x-x-x-x

您可以查看this Q/A on SO,其中显示了在docker swarm 中获取 DNS 解析的 3 种不同方式。基本上,对于docker swarm 中名为myservice 的服务:

myservice 解析为该服务的 Virtual IP (VIP),该服务在内部负载平衡到各个任务 IP 地址。

tasks.myservice 解析为 swarm 中部署的每个容器的每个私有 IP

docker.com 不作为服务名称存在,因此请求被转发到配置的默认 DNS 服务器(您可以自定义)。

注意:容器名称也可以解析,尽管直接解析为它们的 IP 地址。

查看您提供的链接,node-exporter 配置使用task 到达服务的方式:

使用 exporters 服务名称,您可以配置 DNS 发现:

scrape_configs:
- job_name: 'node-exporter'
  dns_sd_configs:
  - names:
    - 'tasks.node-exporter'
    type: 'A'
    port: 9100

希望这会有所帮助!

【讨论】:

非常感谢弗朗索瓦。这确实解决了我的问题。我查看了您的 Q/A,但找不到有关“任务”的 cmets。前缀的东西。你知道我在哪里可以找到这些信息,即一些官方 Docker 参考资料吗?谢谢 嗯...你说得对,我找不到清楚的记录!只有一些github issues 和一些blog articles 谈论这个。这绝对应该有更好的记录! 不客气!我确实向 docker 文档提出了 this issue 嗨 François,这样做会导致 prometheus 使用 ip 作为实例标签。是否可以使用 node-exporter_1、node_exporter_2 之类的东西? @Yannic Klem,你说得对,我对这种行为很好,没有尝试其他任何方法,你能在另一个 SO 线程上提出这个问题吗?

以上是关于docker swarm 中的 Prometheus dns 服务发现的主要内容,如果未能解决你的问题,请参考以下文章

Docker swarm中的LB和服务发现详解

将 Docker 容器部署到 swarm 集群中的多个节点

Docker swarm部署

Docker Swarm 和Swarm mode 是两个概念!

docker swarm 中的 Prometheus dns 服务发现

Docker swarm 模式初体验