6 配置文件
在本章中,您必须以非特权用户(如果您一直遵循本书)的身份运行命令(如果一直遵循本书,则为“incusadmin”)。
安装 Incus 时,您会获得一个默认配置文件,该配置文件无法删除或修改。您可以使用默认配置文件为容器创建新配置文件。
如果您查看容器列表,您会注意到在每种情况下,IP 地址都来自桥接接口。在生产环境中,您可能希望使用其他方法。这可能是来自 LAN 接口的 DHCP 分配地址,或者是来自 WAN 的静态分配地址。
如果您配置了具有两个接口的 Incus 服务器,并在 WAN 和 LAN 上为每个接口分配一个 IP,则可以根据容器需要面向的接口来分配容器的 IP 地址。
从 Rocky Linux 9.4 版本(以及 Red Hat Enterprise Linux 的任何版本)开始,使用配置文件静态或动态分配 IP 地址的方法不起作用。
有一些方法可以解决这个问题,但过程并不愉快。这似乎与 Network Manager 的更改有关,这些更改会影响 macvlan
。macvlan
允许您创建具有不同第 2 层地址的多个接口。
请注意,在选择基于 RHEL 的容器镜像时,这存在缺点。
创建 macvlan 配置文件并分配它¶
要创建您的 macvlan
配置文件,请使用此命令
incus profile create macvlan
如果您在一个多接口机器上,并且想要基于您想要访问的网络创建多个 macvlan
模板,您可以使用“lanmacvlan”或“wanmacvlan”或您尝试用于标识配置文件的任何其他名称。在配置文件创建语句中使用“macvlan”由您决定。
您想更改 macvlan
接口,但在这样做之前,您需要知道 Incus 服务器的父接口是什么。此接口将分配有 LAN (在此例中) IP。要找到该接口,请使用
ip addr
查找分配有 192.168.1.0/24 网络上的 LAN IP 的接口
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 40:16:7e:a9:94:85 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.106/24 brd 192.168.1.255 scope global dynamic noprefixroute enp3s0
valid_lft 4040sec preferred_lft 4040sec
inet6 fe80::a308:acfb:fcb3:878f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
在这种情况下,接口是“enp3s0”。
接下来,更改配置文件
incus profile device add macvlan eth0 nic nictype=macvlan parent=enp3s0
此命令将 macvlan
配置文件所需的所有参数添加到其中以供使用。
使用以下命令检查此命令创建的内容
incus profile show macvlan
这将为您提供类似以下的输出
config: {}
description: ""
devices:
eth0:
nictype: macvlan
parent: enp3s0
type: nic
name: macvlan
used_by: []
配置文件可用于许多其他用途,但为容器分配静态 IP 或使用自己的 DHCP 服务器是常见需求。
要将 macvlan
配置文件分配给 rockylinux-test-8,您需要执行以下操作
incus profile assign rockylinux-test-8 default,macvlan
对 rockylinux-test-9 执行相同操作
incus profile assign rockylinux-test-9 default,macvlan
这表示您想要默认配置文件,并同时应用 macvlan
配置文件。
Rocky Linux macvlan¶
Network Manager 在 RHEL 发行版及其克隆中不断变化。因此,macvlan
配置文件的运行方式不起作用(至少与其他发行版相比),并且需要额外的工作来分配 DHCP 或静态 IP 地址。
请记住,这一切与 Rocky Linux 本身关系不大,而是与上游软件包的实现有关。
如果您想运行 Rocky Linux 容器并使用 macvlan
从 LAN 或 WAN 网络分配 IP 地址,则过程因操作系统(8.x 或 9.x)的容器版本而异。
Rocky Linux 9.x macvlan - DHCP 修复¶
首先,让我们说明在分配 macvlan
配置文件后停止并重新启动两个容器时会发生什么。
然而,拥有分配的配置文件并不能改变默认配置,默认配置是 DHCP。
要测试这一点,请执行以下操作
incus restart rocky-test-8
incus restart rocky-test-9
再次列出您的容器,并注意 rockylinux-test-9 不再拥有 IP 地址
incus list
+-------------------+---------+----------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test | RUNNING | 10.146.84.181 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
如您所见,您的 Rocky Linux 8.x 容器已从 LAN 接口接收到 IP 地址,而 Rocky Linux 9.x 容器则没有。
为了进一步演示问题,您必须在 Rocky Linux 9.0 容器上运行 dhclient
。这将向我们展示 macvlan
配置文件 *已* 应用
incus exec rockylinux-test-9 dhclient
另一个容器列表现在显示以下内容
+-------------------+---------+----------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.113 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test | RUNNING | 10.146.84.181 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
这本应在停止和启动容器时发生,但实际上并没有。假设您希望每次都使用 DHCP 分配的 IP 地址,您可以通过简单的 crontab 条目来修复此问题。要做到这一点,您需要通过输入以下命令来获得容器的 shell 访问权限
incus shell rockylinux-test-9
接下来,让我们确定 dhclient
的路径。要做到这一点,因为这个容器来自一个最小镜像,您首先需要安装 which
dnf install which
然后运行
which dhclient
这将返回
/usr/sbin/dhclient
接下来,更改 root 的 crontab
crontab -e
添加此行:
@reboot /usr/sbin/dhclient
输入的 crontab 命令使用 *vi*。使用 Shift+:+w+q 保存更改并退出。
退出容器并重新启动 rockylinux-test-9
incus restart rockylinux-test-9
再次列出将显示容器已分配 DHCP 地址
+-------------------+---------+----------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.113 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test | RUNNING | 10.146.84.181 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
Rocky Linux 9.x macvlan - 静态 IP 修复¶
在静态分配 IP 地址时,事情会变得更加复杂。由于 network-scripts
在 Rocky Linux 9.x 中已被弃用,唯一的方法是通过静态分配,并且由于容器使用网络的方式,您将无法使用常规的 ip route
语句来设置路由。问题在于,当应用 macvlan
配置文件(在此例中为 eth0)时分配的接口无法通过 Network Manager 进行管理。解决方法是在重新启动后重命名容器的网络接口并分配静态 IP。您可以使用脚本来完成此操作,并(再次)在 root 的 crontab 中运行。使用 ip
命令执行此操作。
要做到这一点,您需要再次获得容器的 shell 访问权限
incus shell rockylinux-test-9
接下来,您将在 /usr/local/sbin
中创建一个名为“static”的 bash 脚本
vi /usr/local/sbin/static
此脚本的内容并不复杂
#!/usr/bin/env bash
/usr/sbin/ip link set dev eth0 name net0
/usr/sbin/ip addr add 192.168.1.151/24 dev net0
/usr/sbin/ip link set dev net0 up
sleep 2
/usr/sbin/ip route add default via 192.168.1.1
你在这里做什么?
- 您将 eth0 重命名为一个可以管理的名称(“net0”)
- 您为您的容器分配了新的静态 IP(192.168.1.151)
- 您启动了新的“net0”接口
- 在添加默认路由之前,您会等待 2 秒钟让接口激活
- 您需要为您的接口添加默认路由
使用以下命令使您的脚本可执行
chmod +x /usr/local/sbin/static
使用 @reboot 时间将此添加到容器的 root crontab
@reboot /usr/local/sbin/static
最后,退出容器并重新启动它
incus restart rockylinux-test-9
等待几秒钟,然后再次列出容器
incus list
您应该会看到成功
+-------------------+---------+----------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test | RUNNING | 10.146.84.181 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
Ubuntu macvlan¶
幸运的是,Ubuntu 的 Network Manager 实现不会破坏 macvlan
堆栈,从而使其部署更加容易!
与您的 rockylinux-test-9 容器一样,您需要将配置文件分配给您的容器
incus profile assign ubuntu-test default,macvlan
要了解 DHCP 是否为容器分配了地址,请再次停止并启动容器
incus restart ubuntu-test
再次列出容器
+-------------------+---------+----------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test | RUNNING | 192.168.1.132 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
成功!
配置静态 IP 略有不同,但并不难。您必须更改与容器连接关联的 .yaml
文件(10-incus.yaml
)。对于此静态 IP,您将使用 192.168.1.201
vi /etc/netplan/10-incus.yaml
将现有内容更改为以下内容
network:
version: 2
ethernets:
eth0:
dhcp4: false
addresses: [192.168.1.201/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8,8.8.4.4]
请保存您的更改并离开容器。
重新启动容器
incus restart ubuntu-test
当您再次列出容器时,您将看到您的静态 IP
+-------------------+---------+----------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-8 | RUNNING | 192.168.1.114 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| rockylinux-test-9 | RUNNING | 192.168.1.151 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
| ubuntu-test | RUNNING | 192.168.1.201 (eth0) | | CONTAINER | 0 |
+-------------------+---------+----------------------+------+-----------+-----------+
成功!
在本文的示例中,我们特意选择了配置困难的容器,以及两个不太困难的容器。镜像列表中有更多 Linux 版本。如果您有喜欢的,可以尝试安装它,分配 macvlan
模板,并设置 IP。
作者:Steven Spencer
贡献者:Ezequiel Bruni, Ganna Zhyrnova