我有一个聊天应用程序,我想在 docker swarm 中进行扩展。我也在使用 redis 来管理应用程序。状态。

我创建了一个由 3 个节点组成的集群

docker-machine create --driver virtualbox node1 // master
docker-machine create --driver virtualbox node2 // worker
docker-machine create --driver virtualbox node3 // worker

一个覆盖网络(用于服务到服务通信)
docker network create --driver overlay webnet

两项服务
docker service create --name redis --network webnet --replicas 1 redis:alpine
docker service create --name chatapp --replicas=4 --network webnet --publish 80:3000 anandkr/chatapp-prod

问题

Swarm 负载平衡器使用循环技术在 4 个使用 websockets 进行客户端通信的 chatapp 容器之间分发端口 80 上的请求。正因为如此,websocket 握手会中断,因为一个客户端-容器之间没有粘性。

即使我使用外部负载均衡器,它仍然会将服务发现的责任转移到 swarm 负载均衡器。

如何处理这种情况?我在这里做错了什么?

最佳答案

Swarm 默认使用虚拟 ip(端点模式 vip)。因此,每个服务都有自己的 IP 地址,并且 swarm 负载均衡器(位于 OSI 第 4 层上)根据它认为合适的方式分配请求。要防止服务拥有 IP 地址,您可以运行
docker 服务更新 webnet --endpoint-mode dnsrr
这将允许内部负载均衡器针对服务名称运行 DNS 查询,以发现给定服务的每个任务/容器的 IP。

从那里你可以做你自己的负载平衡(可能是哈希ip)
如果你这样做,你需要确保你有负载均衡器可用的客户端 IP(在 vm 或 docker 网关之前设置 x-forwarded-for header 。

关于websocket - 如何负载平衡 Websocket 应用程序。在 Docker Swarm 中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42875572/

10-16 02:24