這一章主要探討是Mesos關(guān)于服務(wù)發(fā)現(xiàn)與應(yīng)用的負(fù)載均衡的解決方案,主要側(cè)重對服務(wù)發(fā)現(xiàn)與負(fù)載均衡進(jìn)行講解,需要明白的一點,Mesos作為 兩層架構(gòu),Marathon作為Mesos的systemd服務(wù),服務(wù)發(fā)現(xiàn)功能只需要向marathon提供即可,marathon啟動的k8s、 Cloud Foundry都用自身的服務(wù)發(fā)現(xiàn)功能。
成都創(chuàng)新互聯(lián)服務(wù)項目包括林芝網(wǎng)站建設(shè)、林芝網(wǎng)站制作、林芝網(wǎng)頁制作以及林芝網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,林芝網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到林芝省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!1、Service Discovery with Marathon-Bridge and HAProxy服務(wù)發(fā)現(xiàn)的功能實現(xiàn)是為Dcos系統(tǒng)中的服務(wù)提供便捷的網(wǎng)絡(luò)通信,它的側(cè)重點在于對服務(wù)進(jìn)行注冊,更新,查詢等功能,服務(wù)發(fā)現(xiàn)的實現(xiàn)方法較多, 主要有DNS、集中式服務(wù)路由、應(yīng)用內(nèi)部實現(xiàn)服務(wù)注冊/服務(wù)發(fā)現(xiàn)等方式,Dcos服務(wù)發(fā)現(xiàn)功能采用的是Mesos-DNS策略,有關(guān)Mesos-DNS的 具體介紹詳見上一篇文章。
通過Mesos-DNS的服務(wù)發(fā)現(xiàn)策略,可以通過輔助腳本利用Marathon REST API定時(通過linux crond服務(wù))產(chǎn)生HAProxy 配置文件,通過diff 生成的hapxoy配置文件與已有的haproxy,來判斷是否進(jìn)行reload haproxy操作。
Mesos-slave默認(rèn)想master提供的端口資源的范圍是31000-32000,當(dāng)marathon啟動一個task 實例時,所在的mesos-slave會隨意給其綁定一個或多個在其范圍內(nèi)的端口。需要注意的是應(yīng)用綁定的實際端口(即mesos-slave分配給它的 端口)和應(yīng)用在配置時所指定的形式端口(這是以后直接訪問的應(yīng)用端口)之間的區(qū)別,形式端口(即應(yīng)用端口)是應(yīng)用運(yùn)行在marathon的一種命名空間, 不是直接綁定的,也就是說其他服務(wù)也可以綁定這樣一個端口,只是服務(wù)不同而已,它間接的被負(fù)載均衡器所使用。
服務(wù)發(fā)現(xiàn)功能,允許marathon上的應(yīng)用可以通過配置的端口與其他marathon應(yīng)用進(jìn)行通信,這樣做的好處就是,無需知道實際分配的端口是 多少,例如: python的wsgi服務(wù)(配置時你指定的是80)需要跟mysql(配置時你指定的327)進(jìn)行通信,這樣你可以直接與localhost:327進(jìn) 行通信即可。
HAProxy會把請求路由到具體的服務(wù)節(jié)點上,如果此服務(wù)路徑不可達(dá),它將繼續(xù)將路由到下一個服務(wù)節(jié)點。需要注意的是,目前服務(wù)發(fā)現(xiàn)功能只支持marathon上的應(yīng)用。
使用 HAProxy
Marathon附帶一個簡單的被叫做 haproxy-marathon-bridge 的shell腳本以及更高級的Python腳本 servicerouter.py(這個腳本在marathon/bin下面)。兩個腳本都可以將Marathon的REST API列表中正在運(yùn)行的任務(wù)推送到HAproxy的設(shè)置文件中,HAproxy是一個輕量級的TCP/HTTP的代理。haproxy- marathon-bridge提供了一個最小設(shè)置功能。 而servicerouter.py支持如SSL卸載,sticky連接和虛擬主機(jī)的負(fù)載均衡的更高級的功能。
負(fù)載均衡實現(xiàn)原理就是上述提及的,通過輔助腳本(這里是使用haproxy-marathon-bridge)利用Marathon REST API定時(通過linux crond服務(wù))產(chǎn)生HAProxy 配置文件,通過diff 生成的hapxoy配置文件與已有的haproxy,來判斷是否進(jìn)行reload haproxy操作。
下圖描述了在一個集群分別在兩個節(jié)點安裝同一服務(wù),SVC1和SVC2,分配配置的應(yīng)用端口是1111和2222,可以看到實際分配給它們的是31100和31200。
當(dāng)slave2節(jié)點上的SVC2服務(wù)通過localhost:2222連接SVC1服務(wù)時,HAProxy將把請求轉(zhuǎn)發(fā)到第一配置項SVC1的slave1節(jié)點。
如果slave1節(jié)點掛了,下一次對Localhost:2222的請求,將被轉(zhuǎn)發(fā)到slave2上。
haproxy與Marathon的橋接
通過 haproxy-marathon-bridge腳本從Marathon生成一個HAProxy配置在leader.mesos:8080運(yùn)行:
$ ./bin/haproxy-marathon-bridge leader.mesos:8080 > /etc/haproxy/haproxy.cfg
重新加載HAProxy配置而不中斷現(xiàn)有的連接:
$ haproxy -f haproxy.cfg -p haproxy.pid -sf $(cat haproxy.pid)
配置腳本并重新加載可以通過Cron經(jīng)常觸發(fā)來跟蹤拓?fù)渥兓?。如果一個節(jié)點在重新加載時消失, HAProxy的健康檢查將抓住它并停止向這個node發(fā)送traffic 。
為了方便這個設(shè)置,haproxy-marathon-bridge 腳本以另一種方式可以調(diào)用安裝腳本本身,HAProxy和定時任務(wù)每分鐘ping一次的Marathon服務(wù),如果有任何改變將立刻刷新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來運(yùn)行。
所提供的只是一個基本的示例腳本。
servicerouter.py
通過servicerouter.py腳本從Marathon生成一個HAProxy配置在leader.mesos:8080運(yùn)行:
$ ./bin/servicerouter.py --marathon http://leader.mesos:8080 --haproxy-config /etc/haproxy/haproxy.cfg
如果有任何變化,將會刷新haproxy.cfg,這樣HAproxy將會重新自動加載。
servicerouter.py有許多額外的功能,像sticky 會話,HTTP到HTTPS的重定向,SSL卸載,VHost支持和模板功能。
2、Service Discovery with Bamboo and HAProxy場景:當(dāng)你在Mesos集群上部署的了一系列的微服務(wù),而這些服務(wù)能夠以HTTP方式通過訪問特定的URL來對外提供服務(wù)或者對內(nèi)進(jìn)行通信。
Mesos 集群上通過Marathon框架啟動應(yīng)用(服務(wù)),Marathon通過健康檢查(healthcheck)跟蹤它們的狀態(tài) Bamboo通過監(jiān)聽Marathon event以更新HAProxy配置文件 HAProxy ACL規(guī)則通過Bamboo進(jìn)行配置,其能夠根據(jù)請求的特征,如URL規(guī)則、hostname、HTTP headers,來匹配應(yīng)用服務(wù)。Bamboo的處理流程跟上述的方案是異曲同工的。
優(yōu)點:
1. 允許任意URL與服務(wù)進(jìn)行對應(yīng)
2. 允許通過HTTP Header與服務(wù)進(jìn)行對應(yīng)
3. 及時的觸發(fā)Marathon event來促使HAProxy進(jìn)行改變
4. HAProxy heavy lifting
不足:
1. 對于非HTP不適用
2. 內(nèi)部需要有HAProxy故障切換機(jī)制除非能夠?qū)崿F(xiàn)SmartStack架構(gòu)的服務(wù)
3. 內(nèi)部非流量都鄒另外的hop(HAProxy)
實現(xiàn)
1、安裝HAProxy和Bamboo
HAProxy
HAProxy的安裝可以使用如下方式:
apt-get install haproxy
Bamboo
Bamboo項目地址,你可以通過構(gòu)建腳本來制作deb或者rpm的軟件包,當(dāng)然也可以通過build container進(jìn)行構(gòu)建deb 軟件包
docker build -fDockerfile-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來修改對應(yīng)的Marathon、HAProxy、Zookeeper的hostname,然后重啟bamboo,通過retsart bamboo-server。
2、在marathon上部署應(yīng)用
編輯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即可部署該應(yīng)用,可以看到marathon UI
3、Bamboo配置rules
可以定義rules來告訴HAProxy如何去proxy:
首先,在/etc/hosts添加一行,這樣就可以匹配Host Header:
# ip of HAProxy192.168.99.100 ghost.local 1 2
訪問Bamboo UI,通常是http://haproxy:8000, 然后添加對應(yīng)的name:ghost-0
參考文檔
1、Service Discoverymesosphere
2、marathon-lbgithub
3、Service Discoverypi
4、Bamboo-haproxy-marathonbamboo
5、數(shù)人科技mesosphere中文文檔