Prometheus在Docker Swarm中使用DNS服务发现

7

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

这两个作品都使用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的endpoint模式是vip。
> docker inspect 242pn4obqsly
...
"Endpoint": {
"Spec": {
    "Mode": "vip"
},
"VirtualIPs": [
    {
        "NetworkID": "61fn8hmgwg0n7rhg49ju2fdld",
        "Addr": "10.0.0.3/24"
    }
]
...

这意味着当与 DNS 联系时,Prometheus 只能获取单个代理服务 IP。然后内部负载均衡策略将路由收入请求到不同的后端实例。相关的工作是如何成功的呢?谢谢!

我认为我可以指定dnsrr端点模式来获取客户端DNS服务发现。但是我在相关的工作中没有找到这个设置... - He Bai
1个回答

14

对于 Prometheus DNS 服务发现,你不应该使用 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(这个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

您可以查看SO上这个问答,其中展示了在docker swarm中获取DNS解析的3种不同方式。基本上,对于docker swarm中命名为myservice的服务:

  • myservice将解析为该服务的虚拟IP(VIP),该IP内部负载均衡到各个任务IP地址。

  • tasks.myservice将解析为群集中部署的每个容器的私有IP

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

注意: 容器名称也会被解析,直接解析为它们的IP地址。

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

使用导出程序服务名称,您可以配置DNS发现:

scrape_configs:
- job_name: 'node-exporter'
  dns_sd_configs:
  - names:
    - 'tasks.node-exporter'
    type: 'A'
    port: 9100
希望这能帮到你!

非常感谢您,弗朗索瓦。这确实解决了我的问题。我查看了您的问答,但找不到关于“tasks.”前缀的注释。您知道在哪里可以找到相关信息吗?例如一些官方的Docker参考资料?谢谢。 - He Bai
1
嗯... 你说得对,我找不到清晰的文档!只有一些 github问题 和一些 博客文章 谈到了这个问题。这确实应该有更好的文档记录! - François Maturel
不用谢!我已经向Docker文档提出了这个问题。链接 - François Maturel
嗨,弗朗索瓦,这样做会导致Prometheus使用IP作为实例标签。是否可以使用类似node-exporter_1、node_exporter_2之类的东西? - Yannic Bürgmann
@Yannic Klem,你说得对,我对这种行为很满意,也没有尝试其他的方法,你能在另一个SO线程上提出这个问题吗? - François Maturel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接