跳至内容

9 快照服务器

本章根据您执行的任务,结合使用了特权用户(root)和非特权用户(incusadmin)。

如开头所述,Incus 快照服务器必须在所有可能的方式上镜像生产服务器。如果您的主服务器硬件发生故障,您可能需要将其投入生产,拥有备份和快速重启生产容器的方法可以最大限度地减少系统管理员的恐慌电话和短信。这始终是好事!

构建快照服务器的过程与生产服务器完全相同。为了完全模拟您的生产服务器设置,请在快照服务器上重复第 1-4 章,完成后,返回此处。

如果您在这里,说明您已完成快照服务器的基本安装。

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

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

在您的实验室环境中,您没有这种便利。也许您遇到了相同的情况。因此,您将把两台服务器(主服务器和快照服务器)的 IP 地址和名称都添加到 /etc/hosts 文件中。您必须以 root 用户(或 sudo 用户)身份执行此操作。

在您的实验室环境中,主 Incus 服务器运行在 192.168.1.106,快照 Incus 服务器运行在 192.168.1.141。SSH 到每台服务器,并将以下内容添加到 /etc/hosts 文件中

192.168.1.106 incus-primary
192.168.1.141 incus-snapshot

接下来,您需要允许两台服务器之间的所有流量。为此,您将修改 firewalld 规则。首先,在 incus-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

接下来,作为您的非特权用户(incusadmin),您必须在两台机器之间建立信任关系。这通过在 incus-primary 上运行以下命令来完成

incus remote add incus-snapshot

这将显示要接受的证书。接受它,然后会提示您输入密码。这是您在 Incus 初始化阶段设置的“信任密码”。希望您能记住所有这些密码。输入密码后,您将收到此提示

Client certificate stored at server:  incus-snapshot

反过来操作也没有坏处。例如,信任关系也可以在 incus-snapshot 服务器上建立。如果需要,incus-snapshot 服务器可以将快照发送回 incus-primary 服务器。重复上述步骤,并将“incus-primary”替换为“incus-snapshot”。

迁移您的第一个快照

在迁移您的第一个快照之前,您必须在 incus-snapshot 上创建在 incus-primary 上已有的任何配置文件。在本例中,是“macvlan”配置文件。

您需要在 incus-snapshot 上创建这个。回到 第 6 章,如果需要,请在 incus-snapshot 上创建“macvlan”配置文件。如果您的两台服务器具有相同的父接口名称(例如“enp3s0”),则可以直接将“macvlan”配置文件复制到 incus-snapshot,而无需重新创建。

incus profile copy macvlan incus-snapshot

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

incus snapshot rockylinux-test-9 rockylinux-test-9-snap1

如果您在 incus 上运行 "info" 命令,您可以在列表的底部看到快照

incus info rockylinux-test-9

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

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

尝试迁移您的快照

incus copy rockylinux-test-9/rockylinux-test-9-snap1 incus-snapshot:rockylinux-test-9

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

短暂时间后,复制将完成。想确认一下吗?在 incus-snapshot 服务器上执行 incus list。它应该会返回以下内容

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

成功!尝试启动它。由于您是在 incus-snapshot 服务器上启动它,为了避免 IP 地址冲突,您需要先在 incus-primary 服务器上停止它。

incus stop rockylinux-test-9

在 incus-snapshot 服务器上

incus start rockylinux-test-9

假设所有这些都无错误地工作,请在 incus-snapshot 上停止容器,然后在 incus-primary 上重新启动它。

为容器设置 boot.autostart 为 off

复制到 incus-snapshot 的快照在迁移时将处于关闭状态,但如果您遇到断电事件或因更新等原因需要重启快照服务器,您将遇到问题。那些容器将尝试在快照服务器上启动,从而可能导致 IP 地址冲突。

为了消除这个问题,您需要设置迁移的容器,使其在服务器重启时不会自动启动。对于您新复制的 rockylinux-test-9 容器,您将通过以下命令执行此操作

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

在 incus-snapshot 服务器上为每个快照执行此操作。命令中的 "0" 将确保 boot.autostart 已关闭。

自动化快照过程

能够按需创建快照固然很好,有时您确实需要手动创建快照。您甚至可能想手动将其复制到 incus-snapshot。但对于其他所有情况,特别是当您的 incus-primary 服务器上运行着许多容器时,您最不想做的事情就是花一个下午在快照服务器上删除快照、创建新快照并将它们发送到快照服务器。对于大多数操作,您需要自动化这个过程。

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

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

这意味着:每天晚上 8:50 创建一次容器名称的快照。

将此应用于您的 rockylinux-test-9 容器

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

您还希望设置快照的名称,使其具有有意义的日期。Incus 在所有地方都使用 UTC,因此为了更好地跟踪,最佳做法是使用更易于理解的格式设置快照名称,包含日期和时间戳。

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

太棒了,但您肯定不希望每天都创建新的快照而不删除旧的。这样会填满驱动器。要解决此问题,请运行以下命令

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

作者:Steven Spencer

贡献者:Ezequiel Bruni, Ganna Zhyrnova