2017-03-18 67 views
2

我有一個聊天應用程序,我想在泊塢羣中進行擴展。我也在使用redis來管理應用程序。州。如何加載平衡WebSocket應用程序。在Docker Swarm中?

我已經創建了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負載平衡器使用循環法技術將端口80上的請求分發到使用websockets進行客戶端通信的4個chatapp容器之間。正因爲如此,websocket握手會破裂,因爲一個客戶端容器之間沒有粘性。

即使我使用外部負載均衡器,它仍然會將責任卸載到羣集負載平衡器以進行服務發現。

如何處理這種情況?我在這裏做錯了什麼?

回答

2

Swarm默認使用虛擬IP(端點模式VIP)。因此,每個服務都有自己的IP地址,並且羣集負載平衡器(位於OSI第4層)根據需要分配請求。爲防止服務擁有IP地址,您可以運行 docker service update webnet --endpoint-mode dnsrr 這將允許內部負載均衡器針對服務名稱運行DNS查詢,以發現每個任務/容器的IP一項特定的服務。

從那裏你可以做你自己的負載平衡(可能是散列IP) 如果你這樣做,你需要確保你的客戶端IP可用於負載平衡器(具有x-forwarded-for標頭集之前 vm或碼頭網關。

相關問題