Docker swarm

时间:2018-01-29 03:19:36

标签: docker dns docker-swarm prometheus service-discovery

我正在寻找一些显示器&我的服务提醒解决方案。我找到了以下很好的相关作品。

这两项工作都使用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策略将收入请求路由到不同的后端实例。

那么相关的工作如何成功?

THX!

1 个答案:

答案 0 :(得分:6)

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

您正在寻找的是每项任务服务DNS。要获取群组中每项服务的IP地址,只需前缀您的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

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

  • myservice解析为该内容负载均衡的服务Virtual IP (VIP)到各个任务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

希望这有帮助!