我在苍桜云上使用LXD,这是关于如何直接给LXD容器分配全球IP地址或直接给本地交换机分配IP地址的备忘录。
此次我将使用 Ubuntu20.04 进行实际构建。
架构

- 直接连接到路由器+交换机
- 硬盘有两个,分别用于VM的操作系统和LXD的容器
构建
操作系统的安装等省略。
使用的是苍桜云提供的 Ubuntu20.04.01LTS 归档镜像。
假设 /dev/vda 上安装了操作系统,而 /dev/vdb 是额外增加的100GB硬盘。
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 集群吗? (yes/no) [default=no]:
您想配置一个新的存储池吗? (yes/no) [default=yes]:
新的存储池名称 [default=default]:
要使用的存储后端名称 (zfs, ceph, btrfs, dir, lvm) [default=zfs]:
要创建新的 ZFS 池吗? (yes/no) [default=yes]:
您想使用现有的空块设备吗(例如磁盘或分区)? (yes/no) [default=no]: yes
现有块设备的路径: /dev/vdb
您想连接到 MAAS 服务器吗? (yes/no) [default=no]:
您想创建新的本地网络桥吗? (yes/no) [default=yes]: no
您想配置 LXD 使用现有的桥接或主机接口吗? (yes/no) [default=no]:
您想让 LXD 服务器可通过网络访问吗? (yes/no) [default=no]:
您希望过期的缓存镜像自动更新吗? (yes/no) [default=yes]
您想打印 YAML "lxd init" 预设吗? (yes/no) [default=no]:
我决定将 /dev/vdb 用作 zfs。
不过,此时还没有安装 zfs 命令,所以我将其安装。
- 安装 zfsutils-linux
$ sudo apt install zfsutils-linux
创建桥接并给容器分配全球IP地址!

我想这应是预期的样子。
在苍桜云中,这样的配置并无法让容器访问外部。
如果源 MAC 地址与服务器创建时分配的不同,则不会通过。
因此,在上面的图中,只有在创建虚拟机时分配给 ens3 的 MAC 地址作为源的通信才能通过
路由器+交换机,容器的 eth0 MAC 地址(自动生成)不能通过。
创建容器并使用 ipvlan
由于桥接无法实现,我决定使用 ipvlan 来分配 IP 地址。
ipvlan 共享主机的 MAC 地址,并通过别名分配给 LXD 一个添加的 IP 地址。
- 使用 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
--- sakura.ad.jp ping 统计 ---
发送了 5 个数据包,接收了 5 个,丢包率 0%,时间 4027 毫秒
rtt min/avg/max/mdev = 0.290/0.324/0.347/0.022 ms
总结
通过使用 ipvlan,可以为苍桜云的路由器+交换机分配全球IP地址到LXD的容器,这对于验证等用途或汇总一些小型外部公开服务器很有帮助。