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

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

Вот моя текущая настройка докера:

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:

person requinard    schedule 19.03.2019    source источник


Ответы (1)


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

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

  • 2377/TCP
  • 7946/tcp&udp
  • 4789/удп

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

person requinard    schedule 21.03.2019