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 地址时,事情变得更加复杂。由于 Rocky Linux 9.x 中已弃用 network-scripts
,唯一的方法是通过静态分配,并且由于容器使用网络的方式,您将无法使用普通的 ip route
语句设置路由。问题在于,在应用 macvlan
配置文件时分配的接口(在本例中为 eth0)无法通过网络管理器进行管理。解决方法是在重启后重命名容器的网络接口并分配静态 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
将此添加到容器的 root crontab 中,时间为 @reboot
@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