2017-06-04 139 views
18

我想找到一種方法將etcd羣集部署爲Docker Swarm服務,該服務將自動配置自身而無需任何交互。基本上,我想的東西在這個命令的精神:作爲Docker羣集服務自動配置etcd羣集

docker service create --name etcd --replicas 3 my-custom-image/etcd 

我假設覆蓋網絡配置是安全的,並提供加密和認證,所以我相信我不需要TLS,甚至沒有--auto-tls。不希望額外的頭痛找到配置證書的方式,這可以在另一層上解決。

對於每個實例,我都需要一個獨特的--name,但是我可以從使用export ETCD_NAME=$(hostname --short)的入口點腳本中獲得。

問題是,我卡在初始配置。基於該clustering guide有三個選項,但沒有一個似乎適合:

  • 的DNS發現的情況是最接近於我正在尋找,但碼頭工人此刻doesn't support DNS SRV records發現。我可以查詢etcd,我將獲取節點容器的所有IP,但沒有_etcd-server._tcp記錄。
  • 我無法自動構建ETCD_INITIAL_CLUSTER,因爲雖然我知道IP,但我不知道其他節點的名稱,而且我也不知道如何解決這些問題。 (我不打算將Docker API套接字暴露給etcd容器)
  • 沒有預先存在的etcd集羣,並且在discovery.etcd.io中提供初始配置URI是我感興趣的一種可能的解決方法不這樣做。我的目標是「從這個docker-compose.yml部署一個堆棧,它會自動做正確的事情,沒有任何問題問」毫無疑問的情況。

有什麼竅門可以拉動?

回答

2

正如您已經正確地說知道節點容器的IP, ,所以建議的技巧是簡單地將所需的etcd名稱構建爲每個節點的IP地址的衍生名稱。

  • 每個容器etcd內部使用命名這個特殊的容器的IP即
  • ETCD_INITIAL_CLUSTER使用其他集裝箱的IP地址以類似的方式

名稱可以像甚至簡單填充更好的是,我們可以使用netmask來計算該網絡上的節點的IP,以使名稱更漂亮。

在這種情況下在一個簡單的3節點配置中的一個可能最終具有類似於etcd-02etcd-03

name屬性存在無特殊要求的名字,它只是需要是唯一的,人類可讀的。雖然它看起來像一個詭計,它可能會工作

+0

服務容器更新上不要更改IP地址嗎?如果容器被移除,在同一個節點上啓動(因此它仍然具有相同的數據量),但它認爲它不是以前的東西,這會很奇怪。我認爲名稱的重點在於即使網絡標識符可能發生變化,名稱仍然存在,因此節點知道其對等點仍然是相同的。 – drdaeman