Docker 仅 swarm DNS returns 本地模式服务
Docker swarm DNS only returns services on local mode
我想使用 Prometheus 从我的 docker 中的所有实例化服务中自动抓取数据。我在一个有两个工作人员和大约 7 个服务的集群上执行此操作。我要抓取的服务已在全球部署。
我已将 Prometheus 设置为使用 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 无法在其自己的工作节点之外进行查找。如何设置 Docker DNS 查找 returns 所有工作人员的所有服务实例?
这是我当前的 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:
- 2377/tcp
- 7946/tcp&udp
- 4789/udp
这完全解决了问题,我的节点现在可以正确地相互通信了!
我想使用 Prometheus 从我的 docker 中的所有实例化服务中自动抓取数据。我在一个有两个工作人员和大约 7 个服务的集群上执行此操作。我要抓取的服务已在全球部署。
我已将 Prometheus 设置为使用 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 无法在其自己的工作节点之外进行查找。如何设置 Docker DNS 查找 returns 所有工作人员的所有服务实例?
这是我当前的 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:
- 2377/tcp
- 7946/tcp&udp
- 4789/udp
这完全解决了问题,我的节点现在可以正确地相互通信了!