Docker swarm DNS возвращает службы только в локальном режиме

#docker #docker-swarm #docker-networking #docker-stack

#docker #docker-swarm #docker-сеть #docker-stack

Вопрос:

Я хочу автоматически удалять данные из всех созданных сервисов в моем docker с помощью Prometheus. Я делаю это в кластере с двумя рабочими и примерно 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 возвращал все экземпляры службы для всех рабочих?

Вот моя текущая настройка 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:
  

Ответ №1:

После того, как я повозился с этим, мне пришла в голову мысль попробовать запустить эту конкретную проблему в среде, отличной от используемой мной облачной. Я использовал docker-machine для создания двух локальных экземпляров, и это сработало мгновенно. Я начал немного копаться, и оказалось, что мой брандмауэр не был настроен должным образом. Это делало мои узлы неспособными взаимодействовать друг с другом.

Итак, я открыл следующие порты, как описано здесь:

  • 2377/tcp
  • 7946/tcp amp; udp
  • 4789/udp

Это полностью решило проблему, и теперь мои узлы могут нормально общаться друг с другом!