在苍桜云上使用LXD容器的全球IP地址的讨论
服务器
Lastmod: 2025-01-21
Published: 2021-02-11

我在苍桜云上使用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的容器,这对于验证等用途或汇总一些小型外部公开服务器很有帮助。