Стефан Грабер (Stéphane Graber) опубликовал вторую статью, которая не входит в основной цикл из 12 постов про LXD. В данной статье рассмотрены серьёзные улучшения по настройке сети. Теперь легко и просто можно создавать даже сложные сетевые конфигурации, которые потребуются пользователям LXD.
С появлением LXD 2.0 в Ubuntu 16.04 настройка сети стала удивительно простой. Можно использовать lxdbr0, который вам создал и настроил lxd init
или использовать существующий физический интерфейс для контейнеров.
В целом всё работает, но немного смущал тот факт, что настройка моста lxdbr0, для примера, осуществлялась за пределами LXD. Эти скрипты поддерживали только один мост и никогда к ним не было API, что делает их удалённое конфигурирование не простым.
Но это всё в прошлом. LXD 2.3 приносит API для управления сетевыми настройками и продвинутые инструменты командной строки. Данная статья призвана раскрыть эти новые возможности.
Сейчас свежеустановленный LXD 2.3 поставляется без каких-либо сетевых настроек вообще. lxd init
предложит вам настроить и поднять интерфейс, чтобы все новые контейнеры использовали его по умолчанию. Но для обучения мы всё будем делать сами руками, чтобы увидеть происходящее.
Создаём новую сеть со случайной IPv4 и IPv6 подсетью и включённым NAT.
lxc network create testbr0
Network testbr0 created
Посмотрим конфиг lxc network show testbr0
name: testbr0 config: ipv4.address: 10.150.19.1/24 ipv4.nat: "true" ipv6.address: fd42:474b:622d:259d::1/64 ipv6.nat: "true" managed: true type: bridge usedby: []
Если вас не устраивает подсеть, которую выдали автоматически, то можно указать её явно.
lxc network create testbr0 ipv6.address=none ipv4.address=10.0.3.1/24 ipv4.nat=true
Network testbr0 created
Смотрим результат lxc network show testbr0
name: testbr0 config: ipv4.address: 10.0.3.1/24 ipv4.nat: "true" ipv6.address: none managed: true type: bridge usedby: []
Сеть создана и настроена, но толку от неё нет, пока её не станут использовать контейнеры. Если вновь созданную сеть вы захотите закрепить для всех контейнеров, то командуйте:
lxc network attach-profile testbr0 default eth0
Представим, что уже существует контейнер и мы хотим созданную сеть прикрепить к нему.
lxc network attach my-container default eth0
Предположим, что мы хотим классический bridge превратить в OVS bridge, так как мы установили программный openvswitch. Нужно просто сменить свойство "драйвер" - lxc network set testbr0 bridge.driver openvswitch
Если нужно сменить сразу много свойств, то лучше вызвать lxc network edit
и в текстовом редакторе интерактивно всё поменять.
Одна из возможностей позволяет легко и просто управлять DHCP арендой. Всё что нам нужно это сетевоё устройство контейнера и правильно выставленное свойство.
# lxc init ubuntu:16.04 c1
Creating c1
# lxc network attach testbr0 c1 eth0
# lxc config device set c1 eth0 ipv4.address 10.0.3.123
# lxc start c1
# lxc list c1
+------+---------+-------------------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+---------+-------------------+------+------------+-----------+ | c1 | RUNNING | 10.0.3.123 (eth0) | | PERSISTENT | 0 | +------+---------+-------------------+------+------------+-----------+
То же самое и для IPv6, только свойство ipv6.address.
Если вы хотите предотвратить смену MAC или перенаправление (forwarding) трафика на любой другой MAC, то можно включить технологию port security.
lxc config device set c1 eth0 security.mac_filtering true
LXD запускает DNS сервер для моста (bridge). Через свойство dns.domain можно указать домен. Доступно 3 режима работы (свойство dns.mode):
По умолчанию используется режим managed, так как он безопасен, удобен и позволяет сделать DNS запись для контейнера, но не даёт подделать данные записи, посылая новые-фейковые через DHCP.
LXD поддерживает подключение к другим хостам, используя туннели GRE или VXLAN. Сеть LXD может иметь множество туннелей, которые прикреплены к нему, что облегчает объединение множества хостов. Туннели удобны при использовании в процессах разработки, тестирования и демонстрации. На производстве предпочитают VLAN для сегментации сети.
Предположим, у нас есть testbr0 на хосте по имени edfu и мы хотим запускать (spawn) контейнеры, используя это на хосте djanet. Самый простой способ реализовать это через multicast VXLAN. Этот тип туннеля работает только если оба хоста находятся в одном и том же физическом сегменте сети.
root@edfu:~# lxc network create testbr0 tunnel.lan.protocol=vxlan
Network testbr0 created
root@edfu:~# lxc network attach-profile testbr0 default eth0
Мы определили testbr0 мост на хосте edfu и подняли multicast VXLAN туннель для других хостов. В данном случае edfu будет выступать в роли некоего роутера, обеспечивая других DHCP, DNS. Другие хосты будут просто перенаправлять трафик через туннель.
root@djanet:~# lxc network create testbr0 ipv4.address=none ipv6.address=none tunnel.lan.protocol=vxlan
Network testbr0 created
root@djanet:~# lxc network attach-profile testbr0 default eth0
Теперь можно запускать контейнеры на любом хосте и видеть как они получают IP из единого пула и взаимодействуют с друг другом напрямую через туннель. Как было сказано ранее, мы используем multicast, что не очень хорошо работает через череду роутеров. Используйте тогда лучше unicast VXLAN или старый добрый GRE.
Для подсоединения другого хоста с помощью GRE сначала конфигурируем "главный" хост:
root@edfu:~# lxc network set testbr0 tunnel.nuturo.protocol gre
root@edfu:~# lxc network set testbr0 tunnel.nuturo.local 172.17.16.2
root@edfu:~# lxc network set testbr0 tunnel.nuturo.remote 172.17.16.9
Теперь правим хост "клиент":
root@nuturo:~# lxc network create testbr0 ipv4.address=none ipv6.address=none tunnel.edfu.protocol=gre tunnel.edfu.local=172.17.16.9 tunnel.edfu.remote=172.17.16.2
Network testbr0 created
root@nuturo:~# lxc network attach-profile testbr0 default eth0
Если будет предпочтительнее использовать vxlan, то
root@edfu:~# lxc network set testbr0 tunnel.edfu.id 10
root@edfu:~# lxc network set testbr0 tunnel.edfu.protocol vxlan
и
root@nuturo:~# lxc network set testbr0 tunnel.edfu.id 10
root@nuturo:~# lxc network set testbr0 tunnel.edfu.protocol vxlan
Здесь id требуется, чтобы избежать конфликтов с уже настроенным туннелем multicast vxlan.
LXD очень просто может задать конфигурации от простых сетей до самых сложных, со множеством хостов и тысячами контейнеров. Также легко можно добавить новую сеть для нескольких контейнеров или добавить сетевое устройство в контейнер и связать его с отдельной приватной сетью.
Полный список того, что было освещено в данной статье вы можете прочесть в полной документации Network configuration.
Серия статей про LXD.
Серия статей про LXC.