docker 群中的 Prometheus dns 服务发现

Prometheus dns service discovery in docker swarm

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

这两个作品都使用 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只能获取一个委托服务ip。那么内层的 lbs 策略会将收入请求路由到不同的后端实例。

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

谢谢!

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

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

例如,在一个有 3 个节点的群中,我得到:

$ 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

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

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

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

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

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

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

Using the exporters service name, you can configure DNS discovery:

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

希望对您有所帮助!