如何加载平衡Websocket应用程序。在Docker Swarm?

时间:2017-03-18 14:25:29

标签: websocket docker-swarm

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

我创建了一个包含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个chatapp容器之间在端口80上分发请求,这些容器使用websockets进行客户端通信。因此,websocket握手中断,因为一个客户端容器之间没有粘性。

即使我使用外部负载均衡器,它仍然会将责任卸载到群集负载均衡器以进行服务发现。

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

1 个答案:

答案 0 :(得分:2)

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

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