我想通过Prometheus自动从Docker中的所有实例化服务中抓取数据。我在一个有两个工人和大约7个服务的集群上这样做。我想要的服务是全球部署的。
我使用dns_sd_config
和tasks.cadvisor
的目标设置了普罗米修斯。这将导致返回单个主机,而它应该是两个服务。
> tasks.cadvisor
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: tasks.cadvisor
Address: 10.0.1.9
在这个例子中,我只能找到一个CAdvisor节点,而实际上只有两个。
但是,当我查找在同一个工作节点上运行两次的服务时,查找会设法找到这两个服务
> tasks.nginx
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: tasks.nginx
Address: 10.0.1.25
Name: tasks.nginx
Address: 10.0.1.20
似乎Docker DNS无法在其自己的工作节点之外进行查找。如何以DNS查找返回所有工作人员的所有服务实例的方式设置Docker?
这是我当前的docker设置:
version: '3'
services:
db:
image: postgres
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
volumes:
- db-data:/var/lib/postgresql/data
backend:
build: reggie-server
image: requinard2/reggie-server
command: python manage.py runserver 0.0.0.0:8000
deploy:
mode: global
environment:
- PRODUCTION=1
depends_on:
- db
nginx:
build: reggie-nginx
image: requinard2/reggie-nginx
deploy:
mode: global
ports:
- "80:80"
- "443:443"
depends_on:
- "backend"
- "prometheus"
- "grafana"
prometheus:
build: reggie-prometheus
image: requinard2/reggie-prometheus
ports:
- "9090:9090"
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
volumes:
- prometheus-data:/prometheus
depends_on:
- backend
- cadvisor
grafana:
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
image: grafana/grafana:5.1.0
environment:
GF_SERVER_ROOT_URL=/grafana:
volumes:
- grafana-data:/var/lib/grafana
depends_on:
- "prometheus"
cadvisor:
image: google/cadvisor:latest
deploy:
mode: global
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
depends_on:
- redis
redis:
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
image: redis:latest
volumes:
backend-code:
db-data:
grafana-data:
prometheus-data:
在摆弄它后,我想到了尝试在与我一直使用的云不同的环境中运行这个特定问题。我使用docker-machine创建了两个本地实例,它立即工作。我开始挖掘一下,事实证明我的防火墙没有正确配置。这使我的节点无法与彼此通信。
所以我打开了以下端口,如here所述:
这完全解决了问题,我的节点现在可以正常交谈!