跳到内容

第 9 章:快照服务器

本章结合使用特权(root)用户和非特权(lxdadmin)用户,具体取决于您正在执行的任务。

如开头所述,LXD 的快照服务器必须在各个方面都与生产服务器相同。原因是,如果您的主服务器硬件发生故障,您可能需要将其转移到生产环境中,而拥有备份以及快速重新启动生产容器的方法可以将系统管理员的恐慌电话和短信降到最低。这永远是好事!

构建快照服务器的过程与生产服务器完全相同。为了完全模拟我们的生产服务器设置,请在快照服务器上再次执行所有**第 1-4 章**,完成后返回此处。

您回来了!恭喜您,这意味着您已成功完成快照服务器的基本安装。

设置主服务器和快照服务器之间的关系

在继续之前,需要进行一些清理工作。首先,如果您在生产环境中运行,您可能可以使用用于设置 IP 到名称解析的 DNS 服务器。

在我们的实验室中,我们没有这种便利。也许您也遇到了同样的情况。出于这个原因,您将在主服务器和快照服务器上的 /etc/hosts 文件中添加两个服务器的 IP 地址和名称。您需要以 root(或sudo)用户的身份执行此操作。

在我们的实验室中,主 LXD 服务器在 192.168.1.106 上运行,快照 LXD 服务器在 192.168.1.141 上运行。SSH 到每个服务器并将以下内容添加到 /etc/hosts 文件中

192.168.1.106 lxd-primary
192.168.1.141 lxd-snapshot

接下来,您需要允许两个服务器之间的所有流量。为此,您将更改firewalld规则。首先,在 lxd-primary 服务器上,添加以下行

firewall-cmd zone=trusted add-source=192.168.1.141 --permanent

在快照服务器上,添加以下规则

firewall-cmd zone=trusted add-source=192.168.1.106 --permanent

然后重新加载

firewall-cmd reload

接下来,作为我们的非特权(lxdadmin)用户,您需要设置两台机器之间的信任关系。这可以通过在 lxd-primary 上运行以下命令来完成

lxc remote add lxd-snapshot

这将显示要接受的证书。接受它,它将提示您输入密码。这是您在执行 LXD 初始化步骤时设置的“信任密码”。希望您能安全地保存所有这些密码。输入密码后,您将收到以下信息

Client certificate stored at server:  lxd-snapshot

反过来执行此操作也不会有害。例如,在 lxd-snapshot 服务器上也设置信任关系。这样,如果需要,lxd-snapshot 服务器可以将快照发送回 lxd-primary 服务器。重复步骤并用“lxd-primary”替换“lxd-snapshot”。

迁移第一个快照

在您迁移第一个快照之前,您需要在 lxd-snapshot 上拥有您在 lxd-primary 上创建的任何配置文件。在本例中,这是“macvlan”配置文件。

您需要为 lxd-snapshot 创建它。返回到第 6 章并在需要时在 lxd-snapshot 上创建“macvlan”配置文件。如果您的两台服务器具有相同的父接口名称(例如“enp3s0”),那么您可以将“macvlan”配置文件复制到 lxd-snapshot 而不必重新创建它

lxc profile copy macvlan lxd-snapshot

在设置好所有关系和配置文件后,下一步就是实际将快照从 lxd-primary 发送到 lxd-snapshot。如果您一直严格按照步骤操作,您可能已删除所有快照。创建另一个快照

lxc snapshot rockylinux-test-9 rockylinux-test-9-snap1

如果您为lxc运行“info”命令,您可以在列表底部看到快照

lxc info rockylinux-test-9

这将在底部显示类似以下内容

rockylinux-test-9-snap1 at 2021/05/13 16:34 UTC) (stateless)

好吧,让我们拭目以待!让我们尝试迁移快照

lxc copy rockylinux-test-9/rockylinux-test-9-snap1 lxd-snapshot:rockylinux-test-9

此命令表示,在容器 rockylinux-test-9 中,您希望将快照 rockylinux-test-9-snap1 发送到 lxd-snapshot 并将其命名为 rockylinux-test-9。

过了一会儿,复制将完成。想确定吗?在 lxd-snapshot 服务器上执行lxc list。这应该返回以下内容

+-------------------+---------+------+------+-----------+-----------+
|    NAME           |  STATE  | IPV4 | IPV6 |   TYPE    | SNAPSHOTS |
+-------------------+---------+------+------+-----------+-----------+
| rockylinux-test-9 | STOPPED |      |      | CONTAINER | 0         |
+-------------------+---------+------+------+-----------+-----------+

成功!尝试启动它。因为我们在 lxd-snapshot 服务器上启动它,所以您需要先在 lxd-primary 服务器上停止它,以避免 IP 地址冲突

lxc stop rockylinux-test-9

在 lxd-snapshot 服务器上

lxc start rockylinux-test-9

假设所有这些都能正常运行,请在 lxd-snapshot 上停止容器并在 lxd-primary 上重新启动它。

将容器的 boot.autostart 设置为 off

复制到 lxd-snapshot 的快照在迁移时将处于关闭状态,但如果您遇到电源事件或需要由于更新等原因重新启动快照服务器,您最终会遇到问题。这些容器将尝试在快照服务器上启动,从而造成潜在的 IP 地址冲突。

为了消除这种情况,您需要设置迁移的容器,使其在服务器重新启动时不会启动。对于我们新复制的 rockylinux-test-9 容器,您将使用以下命令完成此操作。

lxc config set rockylinux-test-9 boot.autostart 0

对 lxd-snapshot 服务器上的每个快照执行此操作。“0”在命令中将确保boot.autostart处于关闭状态。

自动化快照过程

能够在需要时创建快照非常棒,有时您确实需要手动创建快照。您甚至可能希望手动将其复制到 lxd-snapshot。但是,对于所有其他情况,特别是对于 lxd-primary 服务器上运行的多个容器,您**最后**不想做的事情是在快照服务器上花一个下午删除快照,创建新快照并将它们发送到快照服务器。对于大部分操作,您将希望自动化此过程。

您需要做的第一件事是安排一个过程来自动化 lxd-primary 上的快照创建。您将对 lxd-primary 服务器上的每个容器执行此操作。完成后,它将负责今后的操作。您可以使用以下语法完成此操作。请注意它与 crontab 条目中时间戳的相似之处

lxc config set [container_name] snapshots.schedule "50 20 * * *"

这意味着,每天晚上 8:50 针对容器名称执行快照。

要将此应用于我们的 rockylinux-test-9 容器

lxc config set rockylinux-test-9 snapshots.schedule "50 20 * * *"

您还希望将快照的名称设置为有意义的日期。LXD 在所有地方都使用 UTC,因此,为了便于跟踪,最好使用更易于理解的格式设置快照名称,并带有日期和时间戳

lxc config set rockylinux-test-9 snapshots.pattern "rockylinux-test-9{{ creation_date|date:'2006-01-02_15-04-05' }}"

很棒,但是您肯定不希望每天都创建新的快照而没有删除旧的快照,对吧?这样会用快照填满驱动器。要解决这个问题,您需要运行

lxc config set rockylinux-test-9 snapshots.expiry 1d

作者:Steven Spencer

贡献者:Ezequiel Bruni,Ganna Zhyrnova