DNS для lxc контейнеров в приватной сети

Контейнерная LXC виртуализация прекрасно работает в Ubuntu 12.04, но у неё есть серьезный недостаток: если контейнеру назначен статический IP адрес, через конфигурационный файл, то по имени данный контейнер не ресолвится в DNS даже в частной сети которая создается по умолчанию. Правка файла /etc/hosts  на основной машине ситуацию не исправляет.

Можно конечно поднять отдельный DNS сервер или использовать имеющийся в настоящей локальной сети, но это может быть не применимым или слишком тяжеловесным решением  в некоторых ситуация, например на девелоперской машине.

К счастью, проблема исправляется посредством правки файла /etc/init/lxc-net.conf. Вот последовательность шагов, который позволят вам настроить корректное разрешение DNS имени:

  1. Создайте файл, по формату аналогичный /etc/hosts и заполните его информацией по IP адресам и доменным именам контейнеров. Далее я буду считать что вы сохранили этот файл как /var/lib/lxc/hosts хотя никто не мешает разместить его в другом месте
  2. От имени root'а откройте на редактирование файл /etc/init/lxc-net.conf и найдите строчку в которой производится старт dnsmasq. Её начало выглядит вот так:
    dnsmasq -u lxc-dnsmasq --strict-order...
  3. В конце этой строчки, прямо перед || cleanup добавьте
    --addn-hosts=/var/lib/lxc/hosts
  4. В результате правки вся строка будет выглядеть вот так:
    dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=${varrun}/dnsmasq.pid --conf-file= --listen-address ${LXC_ADDR} --dhcp-range ${LXC_DHCP_RANGE} --dhcp-lease-max=${LXC_DHCP_MAX} --dhcp-no-override --except-interface=lo --interface=${LXC_BRIDGE} --dhcp-option=119,${LXC_DOMAIN_SEARCH} --dhcp-option=6,${LXC_DNS_SERVER} --addn-hosts=/var/lib/lxc/hosts|| cleanup
  5. Сохранив изменения произведите остановку и запуск сервиса lxc-net:
    sudo service lxc-net stop; sudo service lxc-net start
После этого сервис dnsmasq, который используется по умолчанию в качестве dhcp/dns сервера для внутренней сети контейнеров будет смотреть в наш файл когда контейнер будет приходить к нему с запросом разрешения доменного имени.

Если часть ваших контейнеров получает IP адрес через dhcp и вы также хотите предоставить им возможность обращаться к контейнерам со статическими адресами по имени, убедитесь что переменная LXC_DNS_SERVER содержит адрес вашей машины с запущенными lxc контейнерами, а не адрес DNS сервера реальной локальной сети. Эту переменную можно исправить непосредственно в /etc/init/lxc-net, но лучше это сделать в /etc/default/lxc

Данной решение имеет один недостаток: здесь мы правим системный init скрипт, который потенциально может быть обновлен при получении в процессе обновления новой версии пакета lxc. В таком случае придется слить наши локальный правки с изменениями файла из пакета.

Комментариев нет:

Отправить комментарий