1. 程式人生 > >使用Apache Mesos和Consul實現服務的註冊發現

使用Apache Mesos和Consul實現服務的註冊發現

為保證基於Docker應用程式和服務都具有高效能和可用性,設計出一種具有服務發現,高可用性和容錯能力的解決方案非常重要。

  我們使用Apache Mesos 和Mesosphere的 Marathon實現Docker的任務排程和應用部署,Mesos能夠幫助完成高可用性 高容錯性。

  作為服務編排註冊和發現, Consul 不僅能夠作為一個key/value儲存,而且能夠支援錯誤偵測以及多資料中心支援。

  註冊定義是當有Docker容器啟動或停止時,其他Docker容器應該能獲知,使用Apache Consul實現註冊或登出Docker容器的微服務名稱以及釋出埠。

Consul-template 是一個獨立的應用,能夠查詢Consul並且更新檔案系統上的一個檔案模板,正如你看到一樣,使用Consul/Consul-template實現註冊的捆綁能夠幫助完成動態服務的註冊和發現,以及配置檔案的更新,我們可以使用這些工具與Haproxy聯合一起為所有服務請求提供一個通用的代理閘道器。

 

安裝步驟

  假設 Consul為3個或5個伺服器叢集工作,每個伺服器節點包括所有mesos 主從伺服器和haproxy等都必須有一個Consul代理閘道器安裝和執行。

  安裝Consul 伺服器和代理節點的步驟:

wget https://dl.bintray.com/mitchellh/consul/0.4.1_linux_amd64.zip
unzip 0.4.1_linux_amd64.zip
cp consul /usr/local/bin

 

Consul伺服器設定

  我們配置3個vm作為Consul伺服器叢集. 按照Consul網站的 the server setup instructions 設定伺服器叢集建立領導人選舉,如果一切正常,你應該能通過執行'consul members'看到所有伺服器節點。

 

Consul節點設定

  按照Consul網站的 the agent setup instructions安裝,鍵入'consul members' 應該可以看到所有服務節點,包括伺服器節點。

 

設定Mesos主伺服器

我們可以按照 

Mesosphere Master Node Instructions指引安裝和配置主節點,我們執行桑格主節點,設定2 quorum, 需要python egg來啟動或停止腳步,除安裝標準操作外,確保你還運行了下面指令:

curl -sSfL http://downloads.mesosphere.io/master/redhat/6/mesos-0.20.1-py2.6-linux-x86_64.egg –output /tmp/mesos.egg

easy_install –allow-hosts pypi.python.org /tmp/mesos.egg

一旦全部安裝完成,鍵入命令啟動:

start mesos-master

會出現:

[[email protected] mesos-master]# ps -ef | grep master 
root 8978 1 0 Oct29 ? 00:09:47 /usr/local/sbin/mesos-master --zk=zk://1.1.1.1:2181,
2.2.2.2:2181,3.3.3.3:2181/mesos --port=5050 --log_dir=/var/log/mesos 
--hostname=1.1.1.1 --quorum=2 --work_dir=/var/lib/mesos 
root 8990 8978 0 Oct29 ? 00:00:00 logger -p user.info -t mesos-master[8978] 
root 8991 8978 0 Oct29 ? 00:00:00 logger -p user.err -t mesos-master[8978]

 

設定Mesos 從伺服器

按照 Mesosphere Slave Node Instructions 安裝從伺服器,也需要安裝python egg來執行啟動指令碼,執行以下命令:

curl -sSfL http://downloads.mesosphere.io/master/redhat/6/mesos-0.20.1-py2.6-linux-x86_64.egg –output /tmp/mesos.egg

easy_install –allow-hosts pypi.python.org /tmp/mesos.egg

一切安裝正常後,執行:

start mesos-slave

你會看到:

ps -ef | grep slave
root 10749 3451 0 11:03 pts/0 00:00:00 grep slave 
root 15229 1 0 Nov06 ? 00:25:01 /usr/local/sbin/mesos-slave 
--master=zk://1.1.1.1:2181,2.2.2.2:2181,3.3.3.3:2181/mesos --log_dir=/var/log/mesos 
--containerizers=docker,mesos
--executor_registration_timeout=5mins --hostname=172.25.1.35
root 15241 15229 0 Nov06 ? 00:00:00 logger -p user.info -t mesos-slave[15229]
root 15242 15229 0 Nov06 ? 00:00:00 logger -p user.err -t mesos-slave[15229]

一旦安裝所有mesos所有元件,你就可以通過埠 5050看見從伺服器激活了。

 

 

安裝Docker

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6*.rpm
yum install -y docker-io

配置後臺執行配置,確保/etc/sysconfig/docker有如下:

other_args="-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock"

啟動Docker後臺執行:service docker start

 

設定註冊器

拉一個Docker image:

docker pull progrium/registrator

執行註冊器容器 (確保Consul代理已經安裝和執行)

docker run -d -v /var/run/docker.sock:/tmp/docker.sock -h $HOSTNAME progrium/registrator consul://localhost:8500

在註冊器容器執行docker logs應該會看到:

2014/10/31 20:06:26 registrator: Using consul registry backend at consul://172.0.0.1:8500 2014/10/31 20:06:26 registrator: Listening for Docker events…

 

設定consul-template 和 haproxy

現在我們需要設定使用consul-template配置haproxy例項, 這樣能在haproxy實現服務的動態註冊和登出。

安裝haproxy到你的vm, 然後安裝consul-template. 確保Consul已經安裝並且加入了叢集. consul-template下載地址: https://github.com/hashicorp/consul-template/releases.

wget https://github.com/hashicorp/consul-template/releases/download/v0.2.0/
consul-template_0.2.0_linux_amd64.tar.gz

tar xvfz consul-template_0.2.0_linux_amd64.tar.gz cp consul-template /usr/local/bin

下面配置consul-template

首先建立一個模板配置檔案,這個檔案當啟動consul-template時會被使用,建立檔案在/data/cfg/consul/tmpl.json:

consul = "127.0.0.1:8500"

template {

  source = "/etc/haproxy/haproxy.ctmpl"
  destination = "/etc/haproxy/haproxy.cfg"
  command = "service haproxy restart"

}

這個配置檔案提供了所有consul-template需要的必備配置,使用它們consul-template能夠實現haproxy配置,其中haproxy.cfg配置如下:

defaults REDIS
    mode tcp
    timeout connect  4s 
    timeout server  30s 
    timeout client  30s 
 
listen http-in 
    bind *:80{{range service "web"}} 
        server {{.Node}} {{.Address}}:{{.Port}}{{end}} 
listen http-in 
    bind *:4567{{range service "demoapp"}} 
        server {{.Node}} {{.Address}}:{{.Port}}{{end}} 
frontend ft_redis
    bind *:6379 name redis
    default_backend bk_redis
backend bk_redis{{range service "redis"}} 
        server {{.Node}} {{.Address}}:{{.Port}}{{end}} 

 

配置中有三個監聽:一個是webapps監聽在埠80, 一個是為sinatra webapps監聽在埠 4567 ,一個redis監聽埠是6379.

使用下面命令啟動consul-template:

nohup consul-template -config /data/cfg/consul/tmpl.json > consul-template.out 2>&1 &

當名為 "web", "demoapp" "redis"的docker伺服器啟動後,節點的IP和埠資訊將自動更新haproxy.cfg. Haproxy將會自動分發負載到後臺docker服務,以隨機分配的埠的方法,如果一個後臺docker容器宕機,它的節點IP和埠將被自動從haproxy.cfg移除。

視訊和英文原文:Service Discovery & Orchestration With Mesos and Consul

Docker教程