Настройка DNS для Docker Swarm
У докер сварм кластера есть один важный момент. Если сервиса сервиса не существует, то DNS запрос будет отправлен во внешний интернет. Чтобы это исправить нужно выполнить следующую инструкцию.
Настройка DNS для Docker Swarm
В настройках в файле /etc/docker/daemon.json Docker пропишите:
{
"log-driver": "json-file",
"log-opts": {
"labels":"com.docker.swarm.service.name",
"max-size": "10m",
"max-file": "1"
},
"dns": ["172.17.0.1"]
}
В yaml файле сервиса нужно прописать:
dns:
- 172.18.0.1
Внимание!
ip адреса 172.18.0.1 и 172.17.0.1 не просто так. Выполните команду:
ip a
ip адрес docker0 нужно прописать в файле /etc/docker/daemon.json обычно это 172.17.0.1.
ip адрес docker_gwbridge нужно прописать в yaml файле. Обычно это 172.18.0.1.
Поэтому будьте внимательно, иначе в контейнерах не будет работать DNS
Для тестирования ДНС выполните команду в контейнере:
nslookup ya.ru 172.18.0.1
и проверьте работает ли dnsmasq на ip адресе 172.18.0.1
sudo netstat -anp | grep 53
Если IP адрес docker_gwbridge другой
1) Удалите ноду из swarm
docker swarm leave --force
2) Выполните команду на той же ноде:
docker network rm docker_gwbridge
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_gwbridge
3) Добавьте ноду в swarm
docker swarm join --token TOKEN IP-АДРЕС-ГЛАВНОГО-СЕРВЕРА
Посмотреть токен можно командой, выполнив на leader ноде
docker swarm join-token manager
4) Перезапустите dnsmasq
service dnsmasq restart
Настройка DNS резолвера
Выполните
sudo rm /etc/resolv.conf
sudo nano /etc/resolv.conf
Выполните команду и узнайте на каком порту у вас настроен DNS резолвер. Он должен работать на 53 порту
sudo netstat -anp | grep 53
Укажите следующие настройки
nameserver 127.0.0.53
options edns0 trust-ad
ndots:1
search .
127.0.0.53 - это systemd. Обычно он установлен по умолчанию
127.0.0.1 - это ip адрес dnsmasq. Используйте его если у вас он установлен
Можете установить другой ip адрес днс сервера, которому вы доверяете
Альтернативный способ для облачной ОС
Если это не помогает, то нужно в yaml добавить несколько DNS адресов:
dns:
- 172.18.0.1
- 172.19.0.1
Либо установить модификатор сервиса для облачной ОС:
<?xml version="1.1" encoding="UTF-8" ?>
<modificator>
<uid>org.bayrell.modificator.dns.docker</uid>
<name>DNS docker</name>
<version>1.0</version>
<operations>
<operation type="replace">
<path>/template/yaml/services/*/dns</path>
<value>
<dns array="true">172.18.0.1</dns>
</value>
</operation>
<operation type="add">
<path>/template/yaml/services/*</path>
<value>
<dns array="true">172.19.0.1</dns>
</value>
</operation>
</operations>
</modificator>
Настройка iptables
В /etc/iptables/rules.v4 укажите до строчки -A ALLOW-INPUT -j RETURN
# Разрешаем входящие соединения DNS
-A ALLOW-INPUT -i docker0 -p udp -m udp --dport 53 -j ACCEPT
-A ALLOW-INPUT -i docker0 -p tcp -m tcp --dport 53 -j ACCEPT
-A ALLOW-INPUT -i docker_gwbridge -p udp -m udp --dport 53 -j ACCEPT
-A ALLOW-INPUT -i docker_gwbridge -p tcp -m tcp --dport 53 -j ACCEPT
Установка dnsmasq
На серверах можно обойтись без dnsmasq
apt install dnsmasq
Скопируйте конфиг dnsmasq:
cp /etc/dnsmasq.conf /etc/dnsmasq.conf.example
echo "" > /etc/dnsmasq.conf
Создайте файл /etc/resolv.dnsmasq
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 1.1.1.1
В /etc/dnsmasq.conf пропишите:
port=53
#listen-address=0.0.0.0
no-dhcp-interface=
bind-interfaces
expand-hosts
local-ttl=1
no-negcache
# Настройки DNS по умолчанию
resolv-file=/etc/resolv.dnsmasq
conf-dir=/etc/dnsmasq.d
cache-size=150
max-cache-ttl=600
min-cache-ttl=60
# Одновременный запрос ко всем DNS серверам
# all-servers
# Запрещаем резолвить домены без точки (нужно для Docker Swarm)
domain-needed
# Для отладки
#log-queries
Раскоментируйте строку в файле /etc/default/dnsmasq
IGNORE_RESOLVCONF=yes
Пропишите ip адреса для домена .local в файле /etc/dnsmasq.d/local
address=/.local/127.0.0.1
Выключите резолвер из внешней сети интернет. Создайте файл /etc/dnsmasq.d/disable-external-network
bind-interfaces
except-interface=enp*
except-interface=wlp*
except-interface=wlan*
except-interface=eth*
Создайте файл /etc/NetworkManager/dispatcher.d/99-dnsmasq
#!/bin/bash
if [[ "$1" = "eth0" || "$1" = "enp2s0" || "$1" = "docker0" || "$1" = "docker_gwbridge" ]]; then
if [ "$2" = "up" ]; then
kill -9 `cat /var/run/dnsmasq/dnsmasq.pid`
sleep 1
systemctl start dnsmasq
fi
fi
Удалите файл /etc/resolv.conf и заново его создайте, потому что остается симлинк от днс резолвера systemd, который не дает создать новый файл.
rm -f /etc/resolv.conf
touch /etc/resolv.conf
В /etc/resolv.conf укажите локальный IP адрес
nameserver 127.0.0.1
Отключите резолвер systemd
systemctl stop systemd-resolved
systemctl disable systemd-resolved
systemctl stop resolvconf
systemctl disable resolvconf
Можно также удалить лишние сервисы:
apt-get purge ifupdown resolvconf connman cmst
Перезапустите dnsmasq
systemctl restart dnsmasq