2016-10-19 28 views
0

我有一個dockerized應用程序拆分在幾個容器(幾個前端和後端服務器,負載平衡器,mysql,elasticsearch等)。負載均衡器的配置需要知道哪些容器已啓動,因此我正在使用Consul服務發現註冊服務。我的碼頭圖片是否需要自己的領事客戶端實例?

但我不太確定在每個碼頭集裝箱上運行一個consul代理而不是使用碼頭主機來監督所有正在運行的碼頭集裝箱並通過Consul的HTTP-API註冊它們是一個好主意。

有沒有我可以遵循的最佳做法?

回答

0

我不確定是否有最佳做法,但我發現這篇博文很有幫助Automatic Docker Service Announcement with Registrator。他談到了幾種服務註冊方法及其好處和缺點。

更直接地回答你的問題,不,你不應該在每個容器內運行一個領事代理。

一種選擇是,在每個主機上運行一個consul代理。然後你可以使用像Registrator這樣的東西來觀察新容器的啓動和關閉並自動更新Consul。主要優點是你的容器有一個工作要做,運行你的應用程序。註冊人還有一項工作要做,觀察集裝箱啓動/停止事件並將其記錄在Consul中。你的集裝箱對領事一無所知,仍然參與服務發現。

還有Autopilot pattern,它建議走向另一個方向,使您的應用Consul知道,以便它可以報告自己的健康狀況並發現自己的依賴關係。我在這種模式中看到的大部分信息都是Joyent(如blog post)。對於實現應用程序的可伸縮性和彈性來說,不同的觀點值得一讀。

2

你不需要在每個碼頭集裝箱上運行一個consul代理,你可以簡單地利用領事把它的DNS公開給你的本地。以下是不是從一個容器,但你會知道我在做什麼。

以下是我使用運行我的經紀人

consul agent -data-dir /var/lib/consul/ -config-dir /etc/consul.d/ -bind 10.X.X.X -dns-port 53 -join consul-master 

注命令:我已經添加了領事主一個的/ etc/hosts條目與它的IP,我還增加了一個域名服務器爲127.0。 0.1在/etc/resolv.conf文件中。

目錄/etc/consul.d/保存我的服務配置文件。以下是一個例子:

{ 
    "service": { 
    "name": "stackoverflow", 
    "tags": [ 
     "example" 
    ], 
    "port": 5000 
    } 
} 

現在,一旦我的領事代理正在運行,我可以通過挖命令或HTTP API請求與領事代理(客戶端/服務器)的服務在任何主機上檢查如下:

curl http://stackoverflow.service.consul:80/api/v1/ping 
{"success":true,"message":"pong"} 

對於DNS:

dig @127.0.0.1 -p 53 stackoverflow.service.consul 

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.55.amzn1 <<>> @127.0.0.1 -p 53 tracker.service.consul 
; (1 server found) 
;; global options: +cmd 
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57167 
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 
;; WARNING: recursion requested but not available 

;; QUESTION SECTION: 
;tracker.service.consul.  IN A 

;; ANSWER SECTION: 
tracker.service.consul. 0 IN A X.X.X.X 

;; Query time: 1 msec 
;; SERVER: 127.0.0.1#53(127.0.0.1) 
;; WHEN: Fri Jul 7 11:29:01 2017 
;; MSG SIZE rcvd: 56 

希望幫助並給它一個明確的想法

相關問題