У докер сварм кластера есть один важный момент. Если сервиса сервиса не существует, то DNS запрос будет отправлен во внешний интернет. Чтобы это исправить нужно выполнить следующую инструкцию.
Настройка DNS для Docker Swarm
В настройках в файле /etc/docker/daemon.json Docker пропишите:
_x000D_{_x000D_ "log-driver": "json-file",_x000D_ "log-opts": {_x000D_ "labels":"com.docker.swarm.service.name",_x000D_ "max-size": "10m",_x000D_ "max-file": "1"_x000D_ },_x000D_ "dns": ["172.17.0.1"]_x000D_}В yaml файле сервиса нужно прописать:
_x000D_dns:_x000D_ - 172.18.0.1Внимание!
ip адреса 172.18.0.1 и 172.17.0.1 не просто так. Выполните команду:
_x000D_ip aip адрес docker0 нужно прописать в файле /etc/docker/daemon.json обычно это 172.17.0.1 .
ip адрес docker_gwbridge нужно прописать в yaml файле. Обычно это 172.18.0.1 .
Поэтому будьте внимательно, иначе в контейнерах не будет работать DNS
Для тестирования ДНС выполните команду в контейнере:
_x000D_nslookup ya.ru 172.18.0.1и проверьте работает ли dnsmasq на ip адресе 172.18.0.1
_x000D_sudo netstat -anp | grep 53Если IP адрес docker_gwbridge другой
1) Удалите ноду из swarm
_x000D_docker swarm leave --force2) Выполните команду на той же ноде:
_x000D_docker network rm docker_gwbridge_x000D_docker network create --subnet=172.18.0.0/16 -o com.docker.network.bridge.enable_icc=false -o com.docker.network.bridge.name=docker_gwbridge docker_gwbridge3) Добавьте ноду в swarm
_x000D_docker swarm join --token TOKEN IP-АДРЕС-ГЛАВНОГО-СЕРВЕРАПосмотреть токен можно командой, выполнив на leader ноде
_x000D_docker swarm join-token manager4) Перезапустите dnsmasq
_x000D_service dnsmasq restartНастройка DNS резолвера
Выполните
_x000D_sudo rm /etc/resolv.conf_x000D_sudo nano /etc/resolv.confВыполните команду и узнайте на каком порту у вас настроен DNS резолвер. Он должен работать на 53 порту
_x000D_sudo netstat -anp | grep 53Укажите следующие настройки
_x000D_nameserver 127.0.0.53_x000D_options edns0 trust-ad_x000D_ndots:1_x000D_search .127.0.0.53 — это systemd. Обычно он установлен по умолчанию
127.0.0.1 — это ip адрес dnsmasq. Используйте его если у вас он установлен
Можете установить другой ip адрес днс сервера, которому вы доверяете
Альтернативный способ для облачной ОС
Если это не помогает, то нужно в yaml добавить несколько DNS адресов:
_x000D_dns:_x000D_ - 172.18.0.1_x000D_ - 172.19.0.1Либо установить модификатор сервиса для облачной ОС:
_x000D_<?xml version="1.1" encoding="UTF-8" ?>_x000D_<modificator>_x000D_ <uid>org.bayrell.modificator.dns.docker</uid>_x000D_ <name>DNS docker</name>_x000D_ <version>1.0</version>_x000D_ <operations>_x000D_ <operation type="replace">_x000D_ <path>/template/yaml/services/*/dns</path>_x000D_ <value>_x000D_ <dns array="true">172.18.0.1</dns>_x000D_ </value>_x000D_ </operation>_x000D_ <operation type="add">_x000D_ <path>/template/yaml/services/*</path>_x000D_ <value>_x000D_ <dns array="true">172.19.0.1</dns>_x000D_ </value>_x000D_ </operation>_x000D_ </operations>_x000D_</modificator>Настройка iptables
В /etc/iptables/rules.v4 укажите до строчки -A ALLOW-INPUT -j RETURN
_x000D_# Разрешаем входящие соединения DNS_x000D_-A ALLOW-INPUT -i docker0 -p udp -m udp --dport 53 -j ACCEPT_x000D_-A ALLOW-INPUT -i docker0 -p tcp -m tcp --dport 53 -j ACCEPT_x000D_-A ALLOW-INPUT -i docker_gwbridge -p udp -m udp --dport 53 -j ACCEPT_x000D_-A ALLOW-INPUT -i docker_gwbridge -p tcp -m tcp --dport 53 -j ACCEPTУстановка dnsmasq
На серверах можно обойтись без dnsmasq
_x000D_apt install dnsmasq_x000D_Скопируйте конфиг dnsmasq:
_x000D_cp /etc/dnsmasq.conf /etc/dnsmasq.conf.example_x000D_echo "" > /etc/dnsmasq.confСоздайте файл /etc/resolv.dnsmasq
_x000D_nameserver 8.8.8.8_x000D_nameserver 8.8.4.4_x000D_nameserver 1.1.1.1В /etc/dnsmasq.conf пропишите:
_x000D_port=53_x000D_#listen-address=0.0.0.0_x000D_no-dhcp-interface=_x000D_bind-interfaces_x000D_expand-hosts_x000D_local-ttl=1_x000D_no-negcache_x000D__x000D_# Настройки DNS по умолчанию_x000D_resolv-file=/etc/resolv.dnsmasq_x000D__x000D_conf-dir=/etc/dnsmasq.d_x000D_cache-size=150_x000D_max-cache-ttl=600_x000D_min-cache-ttl=60_x000D__x000D_# Одновременный запрос ко всем DNS серверам_x000D_# all-servers_x000D__x000D_# Запрещаем резолвить домены без точки (нужно для Docker Swarm)_x000D_domain-needed_x000D__x000D_# Для отладки_x000D_#log-queriesРаскоментируйте строку в файле /etc/default/dnsmasq
_x000D_IGNORE_RESOLVCONF=yesПропишите ip адреса для домена .local в файле /etc/dnsmasq.d/local
_x000D_address=/.local/127.0.0.1Выключите резолвер из внешней сети интернет. Создайте файл /etc/dnsmasq.d/disable-external-network
_x000D_bind-interfaces_x000D_except-interface=enp*_x000D_except-interface=wlp*_x000D_except-interface=wlan*_x000D_except-interface=eth*Создайте файл /etc/NetworkManager/dispatcher.d/99-dnsmasq
_x000D_#!/bin/bash_x000D__x000D_if [[ "$1" = "eth0" || "$1" = "enp2s0" || "$1" = "docker0" || "$1" = "docker_gwbridge" ]]; then_x000D_ if [ "$2" = "up" ]; then_x000D_ kill -9 `cat /var/run/dnsmasq/dnsmasq.pid`_x000D_ sleep 1_x000D_ systemctl start dnsmasq_x000D_ fi_x000D_fiУдалите файл /etc/resolv.conf и заново его создайте, потому что остается симлинк от днс резолвера systemd, который не дает создать новый файл.
_x000D_rm -f /etc/resolv.conf_x000D_touch /etc/resolv.confВ /etc/resolv.conf укажите локальный IP адрес
_x000D_nameserver 127.0.0.1Отключите резолвер systemd
_x000D_systemctl stop systemd-resolved_x000D_systemctl disable systemd-resolved_x000D_systemctl stop resolvconf_x000D_systemctl disable resolvconfМожно также удалить лишние сервисы:
_x000D_apt-get purge ifupdown resolvconf connman cmstПерезапустите dnsmasq
_x000D_systemctl restart dnsmasq