Использование глобального IP-адреса для контейнеров LXD в Sakura Cloud
Сервер
Published: 2021-02-11

Я использую 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 контейнер не может общаться с внешней сетью через это.

Руководство по 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, что полезно для тестирования и создания небольших публичных серверов.