#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
Это полностью решило проблему, и теперь мои узлы могут нормально общаться друг с другом!