2017-02-28 152 views
12

我正在使用docker-swarm建立一個雲架構的項目。我知道,使用swarm,我可以部署服務的副本,這意味着該映像的多個容器將運行以服務請求。如何在Docker-Swarm模式下完成負載均衡

我還看到,docker有一個內部負載均衡器來管理這個請求分配。

不過,我需要了解以下幫助:

說我有一個公開服務的REST API或者說,它的一個web應用程序的容器。如果我在羣中部署了多個容器(副本),並且我有其他容器(運行某些應用程序)與此HTTP/REST服務交談。

然後,當我寫這些應用程序IP:端口組合使用?是否有任何工作節點IP正在運行這些服務?這樣做是否會妥善分配負載,即使是在運行相同服務的其他工人/經理之間也是如此?

或者我應該調用管理器來反過來適當地維護路由(即使管理器節點沒有運行此特定服務的容器)?

謝謝。

回答

14

當我寫這些應用程序哪些IP:端口組合使用?工作節點IP的任何 是否運行這些服務?

即使在該節點上不存在所涉及的服務的副本,您也可以使用參與羣集的任何節點。 所以你會使用Node:HostPort組合。入口路由網格將請求路由到活動容器。

其中一張價值一萬個字

enter image description here

威爾這樣採取適當分配負載甚至 除其他工作人員/管理運行同一服務的護理?

入口控制器默認會循環。

現在,客戶端應該使用dns循環法來訪問碼頭羣節點上的服務。傳統的DNS緩存問題將會發生。爲了避免這種情況,我們可以使用像HAproxy這樣的外部負載均衡器。

enter image description here

+1

你確定它總是循環?你能鏈接到這個事實嗎?它讓我感到奇怪的設計選擇。可能產生大量不必要的網絡流量,例如如果一個容器需要另一個容器的服務,並且在同一主機上有一個副本 - 應該給予副本優先級,以避免不必要的網絡流量。 –

+0

@farhad:謝謝。我看到羣集中的節點之間的負載平衡混亂。但是,假設我已經將容器隔離到跨節點設置的不同覆蓋網絡。負載平衡是否仍然發生?(1) 節點++ - >容器(A)_1,容器(A) Container(A)類型的兩種服務都連接到三個不同的覆蓋網絡,每個覆蓋網絡只有C **,D&E在Node **上運行。 因此,當C,D或E試圖通過自己的覆蓋網絡訪問類型A的容器時,它會被處理嗎? – Shabirmean

+1

@AssafLavie容器流量使用dns。 Swarm內部DNS將以循環順序返回與服務名稱匹配的所有活動容器記錄。 Kubernetes通過pod概念處理這個問題。 –