当另一台主机出现故障时,访问局域网中的可用Docker Swarm主机



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

假设这些主机有的IP地址

192.168.1.13
192.168.1.55
192.168.8

我的路由器设置为将192.168.1.13的端口80处的所有请求转发到80,并且对443->443.

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

我的问题是:

有没有一种方法可以配置我的路由器,将我的请求转发到位于所有主机顶部的虚拟IP?有其他方法可以解决我的问题吗?我曾想过Keepalive将宕机主机的IP传输到另一个正在运行的主机,但我不喜欢这个解决方案,我担心它会与我在路由器设置中所做的静态IP绑定发生冲突(我已经将每个主机的MAC地址绑定到一个特定的IP,例如192.168.1.13等(。我读过关于HAProxy的文章,但除了不确定它是否能解决我的问题外,理想情况下,如果我能以某种方式使用负载均衡器中内置的docker群,我就不想添加额外的服务。docker swarm入口网络能救我一命吗?

我的堆栈docker组成文件如下:

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(,一切都如预期。

最新更新