当另一台主机关闭时,达到可用 Docker 局域网中的 Swarm 主机

Reach available Docker Swarm hosts in a LAN when another host is down

我有一个包含 3 个服务(后端、前端、nginx)的堆栈。 我已经在同一网络 (LAN)(3 台不同的 PC)中的 3 台不同主机上的 Docker Swarm 上部署了这个堆栈。

假设这些主机的 IP 地址为

192.168.1.13
192.168.1.55
192.168.8

我将我的路由器设置为将端口 80 上的所有请求转发到 192.168.1.13 的 80 以及 443 --> 443。

所有三个节点都是管理器。问题出现在 192.168.1.13 宕机时。然后,尽管所有服务都迁移到其他 2 台主机 192.168.1.55 和 192.168.8,但我的路由器仍将我的所有请求转发到 192.168.1.13,因此有人无法访问我的应用程序。如果我更改路由器配置以将请求转发到任何其他可用主机,则该应用程序可以正常工作。

我的问题是:

有没有办法配置我的路由器将我的请求转发到位于我所有主机之上的虚拟 IP?还有其他方法可以解决我的问题吗?我想过 Keepalived 将关闭主机的 IP 转移到另一个打开的主机,但我不喜欢这个解决方案,我担心它会与我在路由器设置中完成的静态 IP 绑定发生冲突(我已经绑定每个主机的 MAC 地址到特定 IP,例如 192.168.1.13 等)。我已经阅读了有关 HAProxy 的信息,但除了不确定它是否能解决我的问题之外,理想情况下,如果我能以某种方式使用 docker swarm 内置负载均衡器,我不想添加额外的服务。 docker swarm ingress 网络能以某种方式拯救我的生命吗?

我的栈docker-compose文件如下:

version: '3.8'

services:
  frontend:
    image: mydocker_hub/frontend
    deploy:
        replicas: 4
    ports:
      - "3001:3000"

  backend:
    image: mydocker_hub/backend
    deploy:
        replicas: 4
    ports:
      - "8001:8080"

  nginx:
    image: mydocker_hub/nginx
    deploy:
        mode: global
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - frontend
      - backend

在此先感谢,我希望我已经足够清楚地解释了我的问题。

PS:我知道 depends_on 在堆栈部署中被忽略了,但我忘了删除它。

好的,我用Keepalived解决了。

我制作了如下 3 个配置文件,并将每个文件放在我的 3 台主机上的 /etc/keepalived/keepalived.conf 上:

! Configuration File for keepalived

global_defs {
   notification_email {
     admin@example.com
   }
   notification_email_from user@host
   smtp_server localhost
   smtp_connect_timeout 30
}

! state BACKUP for slaves
! priority 100 for slaves
! Replace interface with an existing interface
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 101
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

然后我将我的路由器指向 192.168.1.100(我创建的虚拟 IP)并且一切正常。