Estoy usando LXD en Sakura Cloud y aquí están mis notas sobre cómo asignar una dirección IP global directamente a un contenedor de LXD o querer asignar directamente la dirección IP de un switch local.
En esta ocasión, lo haré utilizando Ubuntu 20.04.
Configuración

- Conectado directamente al router + switch.
- Dos discos. Uno para el sistema operativo de la VM y otro para los contenedores de LXD.
Construcción
Omitiré la instalación del sistema operativo.
Estoy utilizando la imagen de archivo de Ubuntu 20.04.01 LTS proporcionada por Sakura Cloud.
Supondré que el sistema operativo está instalado en /dev/vda y que /dev/vdb es un disco adicional de 100 GB.
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
Configuración de lxd
- Instalación de lxd
ubuntu@lxd:~$ sudo lxd init
- Configuración inicial de lxd
ubuntu@lxd:~$ sudo lxd init
¿Te gustaría usar agrupación de LXD? (sí/no) [por defecto=no]:
¿Quieres configurar un nuevo grupo de almacenamiento? (sí/no) [por defecto=sí]:
Nombre del nuevo grupo de almacenamiento [por defecto=default]:
Nombre del backend de almacenamiento a utilizar (zfs, ceph, btrfs, dir, lvm) [por defecto=zfs]:
¿Crear un nuevo grupo ZFS? (sí/no) [por defecto=sí]:
¿Te gustaría usar un dispositivo de bloques vacío existente (por ejemplo, un disco o una partición)? (sí/no) [por defecto=no]: sí
Ruta al dispositivo de bloques existente: /dev/vdb
¿Te gustaría conectarte a un servidor MAAS? (sí/no) [por defecto=no]:
¿Te gustaría crear un nuevo puente de red local? (sí/no) [por defecto=sí]: no
¿Te gustaría configurar LXD para usar un puente o interfaz de host existente? (sí/no) [por defecto=no]:
¿Te gustaría que el servidor LXD estuviera disponible a través de la red? (sí/no) [por defecto=no]:
¿Te gustaría que las imágenes en caché obsoletas se actualizaran automáticamente? (sí/no) [por defecto=sí]
¿Te gustaría que se imprimiera una presemana "lxd init" en YAML? (sí/no) [por defecto=no]:
He decidido usar /dev/vdb como zfs.
Sin embargo, en este estado, el comando zfs no está instalado, así que lo instalaré.
- Instalación de zfsutils-linux
$ sudo apt install zfsutils-linux
¡Cree un puente y asigne una dirección IP global al contenedor!

Probablemente se espera que se configure de esta manera.
En Sakura Cloud, los contenedores no pueden comunicarse con el exterior de esta forma.
Manual de Sakura Cloud ¿Hay paquetes que no pueden pasar por los switches o routers + switches?
No se permitirá el paso si la dirección MAC de origen es diferente a la asignada al crear el servidor.
Dado que, en el diagrama anterior, la comunicación que no tiene la dirección MAC de ens3, asignada al crear la VM, no podrá pasar por el router + switch, por lo que no puede ser transmitido con la dirección MAC de eth0 del contenedor (generada automáticamente).
Crear un contenedor y utilizar ipvlan
Como no se puede hacer con un puente, decidimos usar ipvlan para asignar la dirección IP.
ipvlan comparte la dirección MAC del host y se imagina que la dirección IP adicional asignada se asigna a LXD.
- Es necesario habilitar el reenvío al usar 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
- Creación del contenedor
ubuntu@lxd:~$ lxc launch images:ubuntu/20.04 container1
Creando container1
La instancia que estás iniciando no tiene ninguna red conectada.
Para crear una nueva red, usa: lxc network create
Para adjuntar una red a una instancia, usa: lxc network attach
Iniciando container1
ubuntu@lxd:~$ lxc list
+------------+---------+------+------+-----------+-----------+
| NOMBRE | ESTADO | IPV4 | IPV6 | TIPO | SNAPSHOTS |
+------------+---------+------+------+-----------+-----------+
| container1 | EN FUNCIONAMIENTO | | | CONTENEDOR | 0 |
+------------+---------+------+------+-----------+-----------+
En este estado, no se ha asignado NIC, así que asignaré la NIC y configuraré ipvlan.
Sin embargo, como el contenedor está funcionando, no se puede asignar NIC, así que lo detendremos primero.
- Detener el contenedor
ubuntu@lxd:~$ lxc stop container1
- Asignación de NIC
ubuntu@lxd:~$ lxc config device add container1 eth0 nic nictype=ipvlan parent=ens3 ipv4.address=27.133.xx.85
Dispositivo eth0 añadido a container1
- Además, cambiaré la zona horaria a JST.
ubuntu@lxd:~$ lxc config set container1 environment.TZ Asia/Tokyo
- Inicia el contenedor
ubuntu@lxd:~$ lxc start container1
- Entra en el contenedor y configura la red
ubuntu@lxd:~$ lxc exec container1 bash
root@container1:~#
- Editaré /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_
- Aplicar la configuración de netplan
root@container1:~# netplan apply
- Ahora se puede comunicar con el exterior.
root@container1:~# ping sakura.ad.jp -c5
PING sakura.ad.jp (163.43.24.70) 56(84) bytes de 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
--- estadísticas del ping a sakura.ad.jp ---
5 paquetes transmitidos, 5 recibidos, 0% de pérdida de paquetes, tiempo 4027ms
rtt min/avg/max/mdev = 0.290/0.324/0.347/0.022 ms
Resumen
De esta manera, utilizando ipvlan, se pueden asignar direcciones IP globales a contenedores de LXD desde el router + switch de Sakura Cloud, lo que resulta útil para pruebas e incluso para consolidar pequeños servidores públicos.