我有一个聊天应用程序,我想在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握手中断,因为一个客户端容器之间没有粘性。
即使我使用外部负载均衡器,它仍然会将责任卸载到群集负载均衡器以进行服务发现。
如何处理这种情况?我在这里做错了什么?
答案 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标头设置为。