0

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

假设这些主机的 IP 地址为

192.168.1.13
192.168.1.55
192.168.8

我将路由器设置为转发 192.168.1.13 的端口 80 到 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 入口网络能以某种方式挽救我的生命吗?

我的堆栈 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在堆栈部署中被忽略了,但我忘了删除它。

4

1 回答 1

0

好的,我使用 Keepalived 解决了它。

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

! 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),一切都按预期工作。

于 2020-10-06T10:31:49.847 回答