第 6 章:配置文件¶
在本章中,您需要以非特权用户身份运行命令(如果您从本书开头一直遵循,则为“lxdadmin”)。
安装 LXD 时,您会获得一个默认配置文件,并且此配置文件不可删除或修改。也就是说,您可以使用默认配置文件创建新的配置文件,用于与您的容器一起使用。
如果您检查您的容器列表,您会注意到在每种情况下,IP 地址都来自桥接接口。在生产环境中,您可能希望使用其他内容。这可能是来自您的 LAN 接口的 DHCP 分配地址,甚至可能是来自您的 WAN 的静态分配地址。
如果您使用两个接口配置您的 LXD 服务器,并为每个接口分配您的 WAN 和 LAN 上的 IP,则可以根据容器需要面向的接口来分配容器的 IP 地址。
从 Rocky Linux 版本 9.0(以及 Red Hat Enterprise Linux 的任何 bug for bug 复制)开始,使用配置文件静态或动态分配 IP 地址的方法不再有效。
有一些方法可以解决这个问题,但这很烦人。这似乎与对 Network Manager 的更改有关,这些更改影响了 macvlan。macvlan 允许您创建许多具有不同第 2 层地址的接口。
目前,请注意,在选择基于 RHEL 的容器映像时,这将带来一些弊端。
创建 macvlan 配置文件并分配它¶
要创建我们的 macvlan 配置文件,请使用此命令
lxc profile create macvlan
如果您在多接口机器上,并且希望根据您要访问的网络创建多个 macvlan 模板,您可能会使用“lanmacvlan”或“wanmacvlan”或任何其他您想用来识别配置文件的名称。在我们的配置文件创建语句中使用“macvlan”完全取决于您。
您想更改 macvlan 接口,但在更改之前,您需要知道 LXD 服务器的父接口是什么。这将是分配了 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”。
接下来更改配置文件
lxc profile device add macvlan eth0 nic nictype=macvlan parent=enp3s0
此命令将所有必要的参数添加到 macvlan 配置文件中,这些参数是使用所必需的。
使用以下命令检查此命令创建的内容
lxc profile show macvlan
这将为您提供类似于以下内容的输出
config: {}
description: ""
devices:
eth0:
nictype: macvlan
parent: enp3s0
type: nic
name: macvlan
used_by: []
您可以将配置文件用于许多其他用途,但为容器分配静态 IP 或使用自己的 DHCP 服务器是常见的需求。
要将 macvlan 配置文件分配给 rockylinux-test-8,您需要执行以下操作
lxc profile assign rockylinux-test-8 default,macvlan
对 rockylinux-test-9 执行相同的操作
lxc profile assign rockylinux-test-9 default,macvlan
这表示您想要使用默认配置文件,并且也要应用 macvlan 配置文件。
Rocky Linux macvlan¶
在 RHEL 发行版及其克隆版中,Network Manager 一直处于不断变化的状态。因此,macvlan
配置文件的使用方式无效(至少与其他发行版相比),需要一些额外的操作才能从 LAN 或 WAN 网络静态或动态分配 IP 地址。
请记住,这与 Rocky Linux 本身无关,而是与上游软件包实现有关。
如果您想运行 Rocky Linux 容器,并使用 macvlan 从您的 LAN 或 WAN 网络分配 IP 地址,则该过程将根据操作系统的容器版本(8.x 或 9.x)而有所不同。
Rocky Linux 9.x macvlan - DHCP 修复¶
首先,让我们说明在分配 macvlan 配置文件后停止和重新启动两个容器时会发生什么。
但是,分配配置文件不会更改默认配置,默认配置是 DHCP。
要测试这一点,请执行以下操作
lxc restart rocky-test-8
lxc restart rocky-test-9
再次列出您的容器,并注意 rockylinux-test-9 没有任何 IP 地址
lxc 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 配置文件实际上已经应用
lxc 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 访问权限
lxc exec rockylinux-test-9 bash
接下来,让我们确定 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
lxc 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 访问权限。
lxc exec rockylinux-test-9 bash
接下来,您将在 `/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
/usr/sbin/ip route add default via 192.168.1.1
我们在这里做什么?
- 您将 eth0 重命名为一个可管理的新名称(“net0”)。
- 您将为容器分配已分配的新静态 IP(192.168.1.151)。
- 您将启动新的 “net0” 接口。
- 您需要为我们的接口添加默认路由。
使用以下命令使脚本可执行:
chmod +x /usr/local/sbin/static
使用 `@reboot` 时间将此添加到容器的 root 的 crontab 中。
@reboot /usr/local/sbin/static
最后,退出容器并重启它。
lxc restart rockylinux-test-9
等待几秒钟,然后再次列出容器。
lxc 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 容器一样,您需要将配置文件分配给我们的容器。
lxc profile assign ubuntu-test default,macvlan
要确定 DHCP 是否将地址分配给容器,请再次停止和启动容器。
lxc 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-lxc.yaml`)。对于此静态 IP,您将使用 192.168.1.201。
vi /etc/netplan/10-lxc.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]
保存您的更改并退出容器。
重启容器。
lxc 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