2016-11-21 39 views
12

Elasticsearch設計爲以集羣模式運行,我所要做的就是通過環境變量在集羣中定義相關的節點IP,只要網絡連接可用,它就會連接並加入集羣的其他節點。以羣模式運行Elasticsearch容器

我有3個節點,1個充當碼頭羣管理員,另外兩個是工作人員。我已經初始化了管理員並加入了工作節點,從這個角度來看,一切看起來都不錯。

現在我試圖以允許我將所有節點加入同一個elasticsearch集羣的方式運行elasticsearch容器,但是,我希望節點使用其覆蓋網絡接口加入,這意味着我需要在運行docker service create命令時知道容器內部IP地址,我該怎麼做?我必須使用領事這樣的東西來實現嗎?

一些澄清

我需要知道,在服務創建時所有參與者Elasticsearch的IP地址(或DNS名稱),這樣我就可以正常啓動羣集。這必須在創建時,而不是在之後。此外,據我所知,我可以公開端口9200/9300的所有服務,並與外部機器IP協同工作,但我想使用覆蓋網絡來完成所有這些通信(我認爲這是什麼羣集模式是)。

+0

此外領事那裏也是Zookeeper和Etcd。 –

+0

@MattSchuchard我不能用羣體的核心來做到這一點嗎? *我*有*使用外部服務發現嗎? –

+0

不知道;因此評論並沒有回答。不要在乎我自己;更喜歡Mesosphere(Zookeeper)或Kubernetes(Consul/Etcd?)。 Swarm似乎對我來說太黑了。 –

回答

2

這裏只有部分解決方案。 因此,將服務附加到自定義覆蓋網絡時,您確實可以訪問Docker的自定義服務發現功能。我將詳細介紹Docker Swarm模式的網絡功能,然後再嘗試將它與您的問題聯繫起來。

我將使用的服務任務,其中,服務可能是elasticsearch不同的期限,而任務是elasticsearch服務的單個實例

泊塢網絡

的想法是,爲創建的每個服務,碼頭工人分配一個虛擬IP(VIP),和一個自定義DNS別名。您可以使用docker service inspect myservice命令檢索此VIP。

但是,有兩種模式的服務附加到覆蓋網絡dnsrrVIP。您可以使用docker service create--endpoint-mode選項來選擇這些選項。

VIP模式(我相信它是默認的,或者至少是最常用的),會影響虛擬IP到服務的dns別名。這意味着做一個nslookup servicename會給你一個單一的VIP,在幕後,將以循環方式與你的一個容器鏈接。但是,還有一個特殊的dns別名,可讓您訪問所有實例ips(所有任務ips):tasks.myservice

所以在VIP模式下,您可以使用簡單的nslookup tasks.myservice檢索您的所有任務ips,其中myservice是服務名稱。

另一種模式是dnsrr。該模式簡單地擺脫VIP,並以循環方式將dns別名連接到不同的任務(=服務實例)。這樣,您只需執行nslookup myservice即可檢索不同的服務實例ip。

Elasticsearch集羣

好了,所以首先我真的不熟悉的方式elasticsearch讓你集羣。根據我的理解,您需要在運行elasticsearch二進制文件時將其作爲參數,它需要與其他節點進行集羣的地址全部

所以我會做的是創建一個自定義的Elasticsearch圖像,可能是基於默認庫中的一個,我將添加一個自定義Entrypoint,它將首先運行腳本來檢索其他任務ip。

我相信,留在VIP模式適合你,因爲有tasks.myservice DNS別名。然後你需要解析輸出來檢索任務ip(並可能刪除你的)。然後,您可以將它們保存在配置文件環境變量中,或將它們用作您的elasticsearch二進制文件的運行時選項。

編輯:要創建一個自定義的覆蓋網絡,你將需要使用docker network create命令,並使用docker service create

--network選擇這個答案,主要是基於該Swarm mode networking documentation

+1

這聽起來像是一個有效的解決方案,感謝這篇文章,我會盡快嘗試,讓你知道它是如何發展的。 –

+0

現在運行一個名爲'elastic'的服務和3個副本,每個機器上使用'--endpoint-mode vip'來測試,我在其中一個彈性容器中運行bash,但無法解決任何問題。如果我'ping彈性'或'ping <容器名>'或'ping node02.elastic'(node02是機器名之一),我會爲所有這些命令'無法解析主機'。 –

+0

@OrWeinberger您可能還需要使用'docker network create mynet'創建自己的網絡,並使用'docker service create'的'--network'選項將您的服務連接到這個網絡。 – MagicMicky

相關問題