LINUX.ORG.RU
решено ФорумAdmin

Как общаться с LXC контейнером по имени?

 , ,


0

2

Привет всем!

Разбираюсь с LXC контейнерами. Хочу, чтобы в них жили nginx'ы. Их будет много, они будут появляться и удаляться. Хочется, чтобы с контейнером можно было работать по его имени. Пингануть, например или получить страничку с 80-го порта.
Сейчас «получается» только так:

ping: unknown host containername
Гугл мне подсказывает, что мне надо поставить внутри контейнера mDNS, типа avahi, тогда оно будет доступно по containername.local Но оно не ставится:
Setting up avahi-daemon (0.6.32~rc+dfsg-1ubuntu2) ...
Job for avahi-daemon.service failed because the control process exited with error code. See "systemctl status avahi-daemon.service" and "journalctl -xe" for details.
invoke-rc.d: initscript avahi-daemon, action "start" failed.
dpkg: error processing package avahi-daemon (--configure):
 subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of libnss-mdns:amd64:
 libnss-mdns:amd64 depends on avahi-daemon (>= 0.6.16-1); however:
  Package avahi-daemon is not configured yet.

dpkg: error processing package libnss-mdns:amd64 (--configure):
 dependency problems - leaving unconfigured
Errors were encountered while processing:
 avahi-daemon
 libnss-mdns:amd64
E: Sub-process /usr/bin/dpkg returned an error code (1)
И не очень понятно, почему так.
# systemctl status avahi-daemon.service
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
   Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sat 2016-11-12 21:00:50 UTC; 9min ago
  Process: 342 ExecStart=/usr/sbin/avahi-daemon -s (code=exited, status=255)
 Main PID: 342 (code=exited, status=255)

Nov 12 21:00:50 misterelitru systemd[1]: Starting Avahi mDNS/DNS-SD Stack...
Nov 12 21:00:50 misterelitru avahi-daemon[342]: Found user 'avahi' (UID 109) and group 'avahi' (GID 113).
Nov 12 21:00:50 misterelitru systemd[1]: avahi-daemon.service: Main process exited, code=exited, status=255/n/a
Nov 12 21:00:50 misterelitru systemd[1]: Failed to start Avahi mDNS/DNS-SD Stack.
Nov 12 21:00:50 misterelitru systemd[1]: avahi-daemon.service: Unit entered failed state.
Nov 12 21:00:50 misterelitru systemd[1]: avahi-daemon.service: Failed with result 'exit-code'.
# avahi-daemon 
Found user 'avahi' (UID 109) and group 'avahi' (GID 113).
Successfully dropped root privileges.
chroot.c: fork() failed: Resource temporarily unavailable
failed to start chroot() helper daemon.
Не знаю, к чему тут чрут. Как лучше решить эту задачу?
Ubuntu 16.04
Спасибо!

★★★★

Ответ на: комментарий от ArcFi

Может я не очень точно выразился. Почему не ставится, понятно, я написал почему. Проблема со стартом avahi. Было непонятно, почему оно не стартует. нагуглил, что это баг.

Может быть есть какой вариант обойтись без avahi?

ls-h ★★★★ ()
Ответ на: комментарий от ls-h

По идее каждый контейнер получает адрес по dhcp и может слать в запросе свой хостнейм. Dhcp сервер может при выдаче адреса публиковать записи типа A и PTR в dns. Например, dnsmasq так делает.

iliyap ★★★★★ ()
Ответ на: комментарий от ls-h

Аvahi внутри удалось поставить. Как выяснилось, баг связан с совпадением id пользователя, под которым работает демон, внутри и снаружи. Что, на мой взгляд странно. Я-то думал, что контейнеры на то и контейнеры, что с хостом не пересекаются. Короче говоря, решается это через lxc.id_map параметр, т.е. контейнер должен быть непривилегерованным. Но его установка в контейнере ничего не дала.

ls-h ★★★★ ()
Ответ на: комментарий от iliyap

Например, dnsmasq так делает.

В хостовой системе он стоит. Нужна какая-то особая настройка? Контейнер ip получает.

ls-h ★★★★ ()
Ответ на: комментарий от ls-h

Укажи domain для dnsmasq, все компьютеры на одном виртуальном интерфейсе будут в него входить. А вообще использовать lxc без lxd это извращение, если конечно ты изначально чем-то типо proxmox/openstack не пользуешься и lxc это только часть айсберга.

anonymous_sama ★★★★★ ()
Ответ на: комментарий от anonymous_sama

Укажи domain для dnsmasq, все компьютеры на одном виртуальном интерфейсе будут в него входить.

А можно чуть подробнее? Добавил в /etc/dnsmasq.d/lxc строчку «domain=home.lan» и убрал «except-interface=lxcbr0». Не помогло.

ls-h ★★★★ ()
Ответ на: комментарий от ls-h

А можно чуть подробнее?

sort -k4 /var/lib/*/dnsmasq.leases
grep -Erv '^(#|$)' /etc/dnsmasq* | grep 'domain'
grep -E '^(domain|search)' /etc/resolv.conf


Ещё зависит от того, как прописаны dhcp-host в dnsmasq.

ArcFi ()
Ответ на: комментарий от ls-h

dnsmasq это dhcp-сервер, dns-сервер и dns forwarder в одном флаконе. Надо чтобы твой резольвер посылал запросы именно dnsmasq-у, а не куда-то ещё. А dnsmasq будет тогда отвечать на эти запросы, либо из зоны, которую он сам обслуживает, либо форвардингом на upstream recursive dns server. Вобщем убедись, что в твоем /etc/resolv.conf на хосте указан адрес именно dnsmasq-а, обычно это 127.0.0.1.

iliyap ★★★★★ ()
Последнее исправление: iliyap (всего исправлений: 1)
Ответ на: комментарий от iliyap

Вобщем убедись, что в твоем /etc/resolv.conf на хосте указан адрес именно dnsmasq-а, обычно это 127.0.0.1.

Указан 127.0.1.1, но, думаю, это значения не имеет, т.к. на нём и висит dnsmasq. А вообще у меня их два (по дефолтным настройкам).

nobody    3812  3800  0 11:13 ?        00:00:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/var/run/NetworkManager/dnsmasq.pid --listen-address=127.0.1.1 --cache-size=0 --conf-file=/dev/null --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d
lxc-dns+  4159     1  0 11:13 ?        00:00:00 dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/run/lxc/dnsmasq.pid --listen-address 10.0.3.1 --dhcp-range 10.0.3.2,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative

Может быть в этом и проблема? Один раздаёт адреса контейнерам, а другой про это не в курсе. Или так и должно быть? Какому из них надо прописать локальный домен?

ls-h ★★★★ ()
Ответ на: комментарий от ls-h

А вообще у меня их два

И ни один из них не решает поставленную задачу.

Один раздаёт адреса контейнерам, а другой про это не в курсе.

Именно.
А второй вообще запущен через NetworkManager с прибитым гвоздями набором опций, которые вообще не факт, что получится поменять.

ArcFi ()

Проблема решена. И так, чтобы был доступ к контейнерам по имени, а не только по IP адресам, нужно:

1. В /etc/default/lxc-net раскомментировать #LXC_DOMAIN=«lxc»
2. Добавить строчку server=/lxc/10.0.3.1 в конфиг dnsmasq.
Я добавил это в /etc/dnsmasq.d/lxc и сделал с него симлинк в /etc/NetworkManager/dnsmasq.d/lxc. Не уверен, что это стопроцентно правильное решение, но НетворкМанагер запуская dnsmasq ссылается на конфиг по последнему пути, однако там было пусто, а по первому пути уже было до меня что-то написано. Я решил, что это одно и тоже и симлинкнул.
3. Выполнить service network-manager restart и service lxc-net restart

Теперь контейнеры доступны по containername.lxc.
Всем спасибо!

ls-h ★★★★ ()
Ответ на: комментарий от ls-h

P.S.: Никакую аваху внутрь контейнеров ставить не нужно.

ls-h ★★★★ ()
Последнее исправление: ls-h (всего исправлений: 1)
Ответ на: комментарий от ls-h

Решил поделиться

Так же проблема. Debian 9, lxc, lxc-net, dnsmasq-base

Мне помогло следующее:

1. В /etc/default/lxc-net добавил LXC_DOMAIN=«lxc»

2. echo 'nameserver 10.0.3.1' >> /etc/resolv.conf

IP взял тут: ps ax | grep dnsmasq (--listen-address 10.0.3.1)

3. systemctl restart networking.service

В конфиг dnsmasq ничего не добавлял.

sMax ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.