Я использую LXD в Sakura Cloud и делаю заметки о том, как прикрепить глобальный IP-адрес напрямую к контейнерам LXD или локальному коммутатору.
На этот раз я собираюсь создать это на Ubuntu 20.04.
Структура
- Подключен напрямую к маршрутизатору + коммутатору
- Два диска. Один для ОС VM и один для контейнеров LXD
Настройка
Пропускаю установку ОС и тому подобное.
Я использую архивное изображение Ubuntu 20.04.01 LTS, предоставленное Sakura Cloud.
Предполагаю, что ОС установлена на /dev/vda и у нас есть дополнительный диск на 100 ГБ /dev/vdb.
ubuntu@lxd:~$ cat /proc/partitions
major minor #blocks name
11 0 1048575 sr0
252 0 20971520 vda
252 1 1024 vda1
252 2 4194304 vda2
252 3 16774144 vda3
252 16 104857600 vdb
Настройка lxd
- Установка lxd
ubuntu@lxd:~$ sudo lxd init
- Начальная настройка lxd
ubuntu@lxd:~$ sudo lxd init
Хотите ли вы использовать кластер LXD? (да/нет) [по умолчанию=нет]:
Хотите ли вы настроить новый пул хранения? (да/нет) [по умолчанию=да]:
Имя нового пула хранения [по умолчанию=по умолчанию]:
Имя используемого бэкенда хранения (zfs, ceph, btrfs, dir, lvm) [по умолчанию=zfs]:
Создать новый пул ZFS? (да/нет) [по умолчанию=да]:
Хотите ли вы использовать существующее пустое блочное устройство (например, диск или раздел)? (да/нет) [по умолчанию=нет]: да
Путь к существующему блочному устройству: /dev/vdb
Хотите ли вы подключиться к серверу MAAS? (да/нет) [по умолчанию=нет]:
Хотите ли вы создать новый локальный сетевой мост? (да/нет) [по умолчанию=да]: нет
Хотите ли вы настроить LXD для использования существующего моста или интерфейса хоста? (да/нет) [по умолчанию=нет]:
Хотите ли вы, чтобы сервер LXD был доступен через сеть? (да/нет) [по умолчанию=нет]:
Хотите ли вы, чтобы устаревшие кэшированные образы обновлялись автоматически? (да/нет) [по умолчанию=да]
Хотите ли вы, чтобы YAML "lxd init" преднастроенный был напечатан? (да/нет) [по умолчанию=нет]:
Я решил использовать /dev/vdb как zfs.
Однако в этом состоянии утилита zfs не установлена, поэтому я установлю ее.
- Установка zfsutils-linux
$ sudo apt install zfsutils-linux
Создание моста и присвоение контейнеру глобального IP-адреса!
Вероятно, предполагается, что это должно выглядеть так.
Но в Sakura Cloud контейнер не может общаться с внешней сетью через это.
Пакеты не проходят, если MAC-адрес источника отличается от того, который был назначен при создании сервера.
Это означает, что в вышеуказанной схеме только передача с MAC-адреса ens3, назначенного при создании VM, может пройти через маршрутизатор + коммутатор, так как MAC-адрес eth0 контейнера (генерируемый автоматически) не сможет пройти.
Создание контейнера и использование ipvlan
Поскольку это невозможно сделать с помощью моста, я буду использовать ipvlan для назначения IP-адреса.
ipvlan делит MAC-адрес с хостом и добавляет IP-адрес как алиас, который выделяется для LXD.
- Если вы используете ipvlan, необходимо включить пересылку.
ubuntu@lxd:~$ sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
ubuntu@lxd:~$ sudo sysctl --system
- Создание контейнера
ubuntu@lxd:~$ lxc launch images:ubuntu/20.04 container1
Создание container1
У экземпляра, который вы запускаете, нет никаких подключенных сетей.
Чтобы создать новую сеть, используйте: lxc network create
Чтобы подключить сеть к экземпляру, используйте: lxc network attach
Запуск container1
ubuntu@lxd:~$ lxc list
+------------+---------+------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------------+---------+------+------+-----------+-----------+
| container1 | RUNNING | | | CONTAINER | 0 |
+------------+---------+------+------+-----------+-----------+
В этом состоянии сетевой интерфейс (NIC) еще не назначен, поэтому я назначу NIC и настрою ipvlan.
Но поскольку контейнер работает, я не могу назначить NIC, поэтому я сначала остановлю его.
- Остановка контейнера
ubuntu@lxd:~$ lxc stop container1
- Назначение nic
ubuntu@lxd:~$ lxc config device add container1 eth0 nic nictype=ipvlan parent=ens3 ipv4.address=27.133.xx.85
Устройство eth0 добавлено в container1
- Также установлю часовой пояс на JST
ubuntu@lxd:~$ lxc config set container1 environment.TZ Asia/Tokyo
- Запускаю контейнер
ubuntu@lxd:~$ lxc start container1
- Вход в контейнер и настройка сети
ubuntu@lxd:~$ lxc exec container1 bash
root@container1:~#
- В файле /etc/netplan/10-lxc.yaml он существует, поэтому я редактирую его
root@container1:~# cat << _EOF_ > /etc/netplan/10-lxc.yaml
network:
version: 2
ethernets:
eth0:
addresses: [ "27.133.xx.85/28" ]
gateway4: 27.133.xx.81
dhcp4: false
nameservers:
addresses: [ "8.8.8.8", "8.8.4.4" ]
_EOF_
- Применение netplan
root@container1:~# netplan apply
- Я успешно связался с внешней сетью.
root@container1:~# ping sakura.ad.jp -c5
PING sakura.ad.jp (163.43.24.70) 56(84) bytes of data.
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=1 ttl=63 time=0.290 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=2 ttl=63 time=0.341 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=3 ttl=63 time=0.304 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=4 ttl=63 time=0.347 ms
64 bytes from vip1a.www.sakura.ad.jp (163.43.24.70): icmp_seq=5 ttl=63 time=0.340 ms
--- статистика ping для sakura.ad.jp ---
5 пакетов передано, 5 получено, 0% потерь, время 4027мс
rtt min/avg/max/mdev = 0.290/0.324/0.347/0.022 мс
Резюме
Таким образом, используя ipvlan, можно назначить глобальный IP-адрес контейнерам LXD через маршрутизатор + коммутатор в Sakura Cloud, что полезно для тестирования и создания небольших публичных серверов.