這一章主要探討是Mesos關於服務發現與應用的負載均衡的解決方案,主要側重對服務發現與負載均衡進行講解,須要明白的一點,Mesos做爲 兩層架構,Marathon做爲Mesos的systemd服務,服務發現功能只須要向marathon提供便可,marathon啓動的k8s、 Cloud Foundry都用自身的服務發現功能。html
服務發現的功能實現是爲Dcos系統中的服務提供便捷的網絡通訊,它的側重點在於對服務進行註冊,更新,查詢等功能,服務發現的實現方法較多, 主要有DNS、集中式服務路由、應用內部實現服務註冊/服務發現等方式,Dcos服務發現功能採用的是Mesos-DNS策略,有關Mesos-DNS的 具體介紹詳見上一篇文章。
經過Mesos-DNS的服務發現策略,能夠經過輔助腳本利用Marathon REST API定時(經過Linux crond服務)產生HAProxy 配置文件,經過diff 生成的hapxoy配置文件與已有的haproxy,來判斷是否進行reload haproxy操做。node
Mesos-slave默認想master提供的端口資源的範圍是31000-32000,當marathon啓動一個task 實例時,所在的mesos-slave會隨意給其綁定一個或多個在其範圍內的端口。須要注意的是應用綁定的實際端口(即mesos-slave分配給它的 端口)和應用在配置時所指定的形式端口(這是之後直接訪問的應用端口)之間的區別,形式端口(即應用端口)是應用運行在marathon的一種命名空間, 不是直接綁定的,也就是說其餘服務也能夠綁定這樣一個端口,只是服務不一樣而已,它間接的被負載均衡器所使用。python
服務發現功能,容許marathon上的應用能夠經過配置的端口與其餘marathon應用進行通訊,這樣作的好處就是,無需知道實際分配的端口是 多少,例如: Python的wsgi服務(配置時你指定的是80)須要跟MySQL(配置時你指定的327)進行通訊,這樣你能夠直接與localhost:327進 行通訊便可。mysql
HAProxy會把請求路由到具體的服務節點上,若是此服務路徑不可達,它將繼續將路由到下一個服務節點。須要注意的是,目前服務發現功能只支持marathon上的應用。linux
使用 HAProxygit
Marathon附帶一個簡單的被叫作 haproxy-marathon-bridge 的shell腳本以及更高級的python腳本 servicerouter.py(這個腳本在marathon/bin下面)。兩個腳本均可以將Marathon的REST API列表中正在運行的任務推送到HAproxy的設置文件中,HAproxy是一個輕量級的TCP/HTTP的代理。haproxy- marathon-bridge提供了一個最小設置功能。 而servicerouter.py支持如SSL卸載,sticky鏈接和虛擬主機的負載均衡的更高級的功能。github
負載均衡實現原理就是上述說起的,經過輔助腳本(這裏是使用haproxy-marathon-bridge)利用Marathon REST API定時(經過linux crond服務)產生HAProxy 配置文件,經過diff 生成的hapxoy配置文件與已有的haproxy,來判斷是否進行reload haproxy操做。sql
下圖描述了在一個集羣分別在兩個節點安裝同一服務,SVC1和SVC2,分配配置的應用端口是1111和2222,能夠看到實際分配給它們的是31100和31200。docker
當slave2節點上的SVC2服務經過localhost:2222鏈接SVC1服務時,HAProxy將把請求轉發到第一配置項SVC1的slave1節點。shell
若是slave1節點掛了,下一次對Localhost:2222的請求,將被轉發到slave2上。
haproxy與Marathon的橋接
經過 haproxy-marathon-bridge腳本從Marathon生成一個HAProxy配置在leader.mesos:8080運行:
$ ./bin/haproxy-marathon-bridge leader.mesos:8080 > /etc/haproxy/haproxy.cfg
從新加載HAProxy配置而不中斷現有的鏈接:
$ haproxy -f haproxy.cfg -p haproxy.pid -sf $(cat haproxy.pid)
配置腳本並從新加載能夠經過Cron常常觸發來跟蹤拓撲變化。若是一個節點在從新加載時消失, HAProxy的健康檢查將抓住它並中止向這個node發送traffic 。
爲了方便這個設置,haproxy-marathon-bridge 腳本以另外一種方式能夠調用安裝腳本自己,HAProxy和定時任務每分鐘ping一次的Marathon服務,若是有任何改變將馬上刷新HAProxy。
$ ./bin/haproxy-marathon-bridge install_haproxy_system leader.mesos:8080
Marathon須要ping的列表存按行存儲在 /etc/haproxy-marathon-bridge/marathons
腳本安裝在 /usr/local/bin/haproxy-marathon-bridge
-cronjob安裝在/etc/cron.d/haproxy-marathon-bridge 注意須要用root來運行。
所提供的只是一個基本的示例腳本。
servicerouter.py
經過servicerouter.py腳本從Marathon生成一個HAProxy配置在leader.mesos:8080運行:
$ ./bin/servicerouter.py --marathon http://leader.mesos:8080 --haproxy-config /etc/haproxy/haproxy.cfg
若是有任何變化,將會刷新haproxy.cfg,這樣HAproxy將會從新自動加載。
servicerouter.py有許多額外的功能,像sticky 會話,HTTP到HTTPS的重定向,SSL卸載,VHost支持和模板功能。
場景:當你在Mesos集羣上部署的了一系列的微服務,而這些服務可以以HTTP方式經過訪問特定的URL來對外提供服務或者對內進行通訊。
Bamboo的處理流程跟上述的方案是殊途同歸的。
優勢:
1. 容許任意URL與服務進行對應
2. 容許經過HTTP Header與服務進行對應
3. 及時的觸發Marathon event來促使HAProxy進行改變
4. HAProxy heavy lifting
不足:
1. 對於非HTP不適用
2. 內部須要有HAProxy故障切換機制除非可以實現SmartStack架構的服務
3. 內部非流量都鄒另外的hop(HAProxy)
實現
一、安裝HAProxy和Bamboo
HAProxy
HAProxy的安裝可使用以下方式:
apt-get install haproxy
Bamboo
Bamboo項目地址,你能夠經過構建腳本來製做deb或者rpm的軟件包,固然也能夠經過build container進行構建deb 軟件包
docker build -f Dockerfile-deb -t bamboo-build . docker run -it -v $(pwd)/output:/output bamboo-build # package ends up as output/bamboo_1.0.0-1_all.deb
須要注意的是,須要修改/var/bamboo/production.json
來修改對應的Marathon、HAProxy、Zookeeper的hostname,而後重啓bamboo,經過retsart bamboo-server
。
二、在marathon上部署應用
編輯ghost.json文件,填入下述配置:
{ "id": "ghost-0", "container": { "type": "DOCKER", "docker": { "image": "ghost", "network": "BRIDGE", "portMappings": [{ "containerPort": 2368 }] } }, "env": {}, "instances": 1, "cpus": 0.5, "mem": 256, "healthChecks": [{ "path": "/" }] }
而後使用curl -X POST -H "Content-Type: application/json" http://marathon.mesos:8080/v2/apps -d@ghost.json
便可部署該應用,能夠看到marathon UI
三、Bamboo配置rules
能夠定義rules來告訴HAProxy如何去proxy:
首先,在/etc/hosts
添加一行,這樣就能夠匹配Host Header:
# ip of HAProxy 192.168.99.100 ghost.local
訪問Bamboo UI,一般是http://haproxy:8000, 而後添加對應的name:ghost-0,以下圖:
查看一下是否添加成功:
ok!能夠訪問http://ghosts.local/
參考文檔:
一、Service Discovery mesosphere
二、marathon-lb github
三、Service Discovery pi
四、Bamboo-haproxy-marathonbamboo
五、數人科技mesosphere中文文檔