两台虚拟机托管在同一台机器上,我们将它们命名为 VM1 和 VM2。两台虚拟机都托管一个runC
运行服务器应用程序的容器,客户端直接在主机上运行,并连接到 VM1 中容器中运行的服务。
我想构建一个故障转移服务,如果我关闭 VM1 上的容器,客户端应该连接到在 VM2 上运行的容器。
我已经使用以下方法实现并测试了浮动 IP:keepalived 和 VRRP就像建议的那样这链接,但这仅在整个 VM 发生故障时才有效,我必须为容器实现容错服务,如果 VM1 上的容器发生故障,则客户端应该连接到在 VM2 上运行的副本,即使 VM1 已启动,即容器发生故障但托管该容器的 VM 已启动。
这里的限制是我不想使用任何可能成为单点故障的负载均衡器/HAproxy 服务。
我知道如何实现这一点吗?或者这不可能实现吗?
编辑: (正如评论中所建议的,添加细节以消除可能的混淆。)从主容器(即在 VM1 上运行的容器)启动以来,VM2 上的容器一直没有运行,有一个名为criu
,你可以看看这里和这里。因此,使用此实用程序,VM1 的容器将迁移到 VM2,方法是首先检查该容器,然后将该状态迁移到 VM2 并恢复它。但现在还需要确保客户端应该连接到在 VM2 上运行的容器。到目前为止,我只是在网络命名空间中运行容器并从 VM1 的接口添加路由。这样,我可以防止硬件故障,例如如果 VM1 本身发生故障,如前所述,使用keepalived 和 VRRP,但现在我想要的是当容器的状态迁移到 VM2 端并且容器关闭但 VM1 已启动并且该容器的迁移状态在 VM2 上恢复时,我如何确保客户端将连接到 VM2 上现在正在运行的容器?我必须模拟这种情况。