跳至内容

第 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