Docker 仅 swarm DNS returns 本地模式服务

Docker swarm DNS only returns services on local mode

我想使用 Prometheus 从我的 docker 中的所有实例化服务中自动抓取数据。我在一个有两个工作人员和大约 7 个服务的集群上执行此操作。我要抓取的服务已在全球部署。

我已将 Prometheus 设置为使用 dns_sd_configtasks.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

这完全解决了问题,我的节点现在可以正确地相互通信了!