跳至内容

第 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 允许您创建具有不同第二层地址的多个接口。

目前,只需注意基于 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 配置文件的运行方式(至少与其他发行版相比)无效,需要一些额外的工作来分配 DHCP 或静态 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