2016-08-24 97 views
11

我有一個由3個服務器組成的領事羣集。我也有一個大約6名工人和3個主人的碼頭羣(主人與領事服務器在同一硬件上,但設置爲可用性==排水管,以防止他們接受工作)。如何使用Docker 1.12羣集模式部署領事

我一般使用領事模板來閱讀領事K/V。我不能爲了我的生活而弄清楚如何明智地推出代理服務。如果我使用全局服務,則每個節點只能獲得一個代理,但服務器集羣抱怨,因爲客戶端代理看起來都具有相同的IP地址。

複製服務似乎是要走的路,但我相信我需要發佈客戶端端口8301,這似乎導致與我的服務器羣集衝突(它正在運行羣集主服務器和consul服務器(不在docker下) 。)

我會很感激在正確的方向上一般轉向 - 銘記這是1.12羣模式,因此從早期版本完全不同

回答

6

經過深思熟慮和許多死衚衕,我們終於想出了一個適合我們的解決方案。部分問題在於,在編寫本文時,Docker 1.12有點少年,並且介紹了一些必須理解的概念,然後纔有意義。在我們的例子中,我們之前的Swarm 1.12版本的經驗阻礙了我們的前瞻性思維,而不是幫助。

我們利用我們的羣去如下

  1. 創建一個名爲「領事」覆蓋網絡部署領事K/V服務的解決方案。這爲我們的服務在內部創建了一個地址空間。

    docker network create --driver overlay --subnet 10.10.10.0/24 consul

  2. 部署領事服務器集羣進入新的覆蓋。我們有我們的經理節點使用三臺主機,我們希望領事服務器容器到此集羣,而不是應用服務器因此「約束」標誌上運行

    docker service create -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name consulserver --network consul --constraint 'node.role == manager' --replicas 3 consul agent server -bootstrap-expect=3 -bind=0.0.0.0 -retry-join="10.10.10.2" -data-dir=/tmp

    這裏的關鍵是,羣將分配在領事網絡開始時新的VIP(10.10.10.2)映射到三個新實例。

  3. 下一步,我們部署了代理服務

    docker service create \ -e 'CONSUL_BIND_INTERFACE=eth0' \ -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true, "retry_join":["10.10.10.2"]}' \ --publish "8500:8500" \ --replicas 1 \ --network consul \ --name consulagent \ --constraint 'node.role != manager' \ consul agent -data-dir=/tmp -client 0.0.0.0

指定consulserver服務的VIP。(Consul不會解析加入名稱 - 其他容器可能會做得更好,允許指定服務名稱「consulserver」而不是VIP)

這樣做,任何其他服務都可以通過加入到領事網絡,並解決名稱「consulagent」。顧問服務可根據需要進行擴展(或部署爲全球服務)。 發佈端口8500使服務在羣集的邊緣可用,並且如果您不需要使其可用於非羣集服務,則可以放棄該服務。

+0

同樣的問題,我回復@ electrometro的答案:是不是發佈領事API端口危險? –

+0

發佈端口給誰?我們的整個網絡實際上是一個DMZ。只有同一VLAN上的設備才能訪問這些服務中的任何一個,因此風險很小。我很好奇你會怎麼做 - 我們總是願意改進我們的部署。 – MarkH

+1

在Docker Swarm模式之前,我將Consul API綁定到橋接接口IP,因此可以從集羣內訪問API,但不能訪問外部世界。這是Consul被建議在主機網絡命名空間上運行的唯一選項。我不知道我的解決方案是否明智,但這正是我來這裏研究的原因,試圖找到更好的方法.. :) –

6

這是混亂,但碼頭工人「羣模式」是一個真正的不同。動物,那就是所謂的Docker Swarm,在Swarm模式下你不需要Consul,每個主機上的docker守護進程作爲關鍵值存儲,並執行服務發現。或者「老」Docker羣需要什麼Consul。

只是要小心查找只針對「羣模式」的文檔/信息。我希望他們實際上使用了不同的名字。

+0

真的嗎?你是否在說我可以通過consul-template來閱讀我的應用程序值? 我知道我不需要它來實現swarm特性,但是我們更多地使用它來實現swab特性 – MarkH

+0

通常,consul-template用於更新nginx或haproxy的配置。它基本上增加或刪除服務器列表上的IP地址以實現負載平衡。在羣組模式中這不需要。你讓碼頭執行負載平衡。讓nginx(例如)面向服務來處理SSL,gzip,安全等事情是很好的,但其配置文件可以簡單地將dns名稱「myservice」用於上游服務器。如果你已經創建了一個名爲「myservice」的docker服務,docker會對正確的容器進行負載平衡。 – Alkaline

+0

我們使用consull-template來填充一大堆遺留應用程序的文件 - 我正在努力研究如何通過swarm實現這一點。我不瞭解swarm現在如何實現大部分依賴第三方工具的服務發現和負載平衡。但作爲一個通用的K/V商店,我只是看不到如何使用它。 – MarkH

3

在我的blog中,我探索了一種與MarkH的答案類似的方式,但主要區別在於,我沒有指向新服務器的VIP,而是指向加入網絡的前三個節點。這可能是有益的,因爲VIP會在指向自身的問題上與該VIP上所有節點上的負載平衡有關。根據我的經驗,最好是用這種方法來創建服務。

docker service create \ 
    --network=consul \ 
    --name=consul \ 
    -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \ 
    -e CONSUL_BIND_INTERFACE='eth0' \ 
    --mode global \ 
    -p 8500:8500 \ 
    consul agent -server -ui -client=0.0.0.0 \ 
    -bootstrap-expect 3 \ 
    -retry-join 172.20.0.3 \ 
    -retry-join 172.20.0.4 \ 
    -retry-join 172.20.0.5 \ 
    -retry-interval 5s 

我在3節點swarm中使用全局模式,所以你可以交換出副本,並把你的約束。

+0

最初我們使用的是與此相同的重試連接集。然而使用VIP似乎更清潔。一旦集羣建立,負載均衡器就不會涉及,因爲八卦協議將傳播單個集羣成員IP而不是VIP。我希望當我們在研究時我們找到了你的博客... – MarkH

+0

@MarkH,我也是!我們花了幾天時間想出了這個。 :)。這對VIP來說非常有趣,但我們可能需要對這些工作如何進行更多的研究。 – electrometro

+1

未公佈該代理的端口是否危險?你不希望Consul API訪問互聯網..我想你可以通過防火牆規則阻止互聯網,但我猜這有點擊敗了Docker的網絡模型(私人與已發佈的端口) –

1

對於那些像我這樣喜歡從碼頭工人,compose.yml文件上運行我們的服務,我設法「泊塢窗堆棧部署」

https://github.com/thechane/consul/blob/master/docker-compose.yml

...運行領事作爲一個碼頭工人的服務。

---編輯,表格差只是鏈接回答所以在這裏,它是:

version: '3.1' 
#customise this with options from 
#https://www.consul.io/docs/agent/options.html 

services: 

seed: 
    hostname: seed 
    image: consul:0.8.0 
    deploy: 
    restart_policy: 
     condition: none #we do not want this to be restarted on timeout (see entrypoint options below) 
    replicas: 1 
    placement: 
     constraints: 
     - "engine.labels.access == temp" 
     - "engine.labels.access != consul" 
    environment: 
    - "CONSUL_LOCAL_CONFIG={\"disable_update_check\": true}" 
    - "CONSUL_BIND_INTERFACE=eth0" 
    entrypoint: 
    - timeout  #this seed fires up the cluster after which it is no longer needed 
    - -sTERM  #this is the same signal as docker would send on a scale down/stop 
    - -t300  #terminate after 5 mins 
    - consul 
    - agent 
    - -server 
    - -bootstrap-expect=5 
    - -data-dir=/tmp/consuldata 
    - -bind={{ GetInterfaceIP "eth0" }} 
    networks: 
    - "consul" 

cluster: 
    image: consul:0.8.0 
    depends_on: 
    - "seed" 
    deploy: 
    mode: global          ##this will deploy to all nodes that 
    placement: 
     constraints: 
     - "engine.labels.access == consul"   ##have the consul label 
     - "engine.labels.access != temp" 
    environment: 
    - "CONSUL_LOCAL_CONFIG={\"disable_update_check\": true}" 
    - "CONSUL_BIND_INTERFACE=eth0" 
    - "CONSUL_HTTP_ADDR=0.0.0.0" 
    entrypoint: 
    - consul 
    - agent 
    - -server 
    - -data-dir=/tmp/consuldata 
    - -bind={{ GetInterfaceIP "eth0" }} 
    - -client=0.0.0.0 
    - -retry-join=seed:8301 
    - -ui            ##assuming you want the UI on 
    networks: 
    - "consul" 
    ports: 
    - "8500:8500" 
    - "8600:8600" 

networks: 
    consul: 
    driver: overlay 

另外請注意,我後來發現,如果沒有種子不能添加更多的領事實例。因此,如果您打算擴展您的swarm節點數,我會使用種子入口點的選項刪除超時命令。

+0

我還沒有重新訪問這個部署一段時間 - 它一直在做它的工作..但是,你的解決方案是非常酷的。你能解釋一下我不清楚的幾個方面: 1.你能否提供一個引用來控制部署的engine.labels.access - 我找不到它並且是唯一不明確的ref。我有Docker UCP(我們不使用) 2.什麼是'種子的工作 - 爲什麼不直接啓動羣集? – MarkH

+0

我發現引導羣集所需的種子,一旦它全部運行種子就停止並不再需要。 Consul文檔中的某處說,只有一個節點可以使用bootstrap選項。 標籤簽出 - https://docs.docker.com/engine/reference/commandline/node_update/#examples – thechane

+0

目前還不清楚你的標籤是如何工作的。在撰寫文件中,您有以下佈局約束: '約束: - 「engine.labels.access == temp」 - 「engine.labels.access!= consul」 ' '約束似乎是相互排斥的('溫度'可以**從不**等於'領事')。因此我的問題。 – MarkH