當(dāng)一個Task運行的時候,Mesos-DNS會創(chuàng)建一個域名..mesos對應(yīng):
Mesos-Agent的IP地址
如果是Mesos Containerizer的話,返回的是Task內(nèi)部容器的IP
另外..slave.mesos還會提供所在的物理機(jī)的IP地址。這樣通過hostport和Mesos-DNS所給的域名,可以實現(xiàn)服務(wù)的發(fā)現(xiàn)。
第三:marathon-lb
使用DNS雖然可以實現(xiàn)服務(wù)的自發(fā)現(xiàn),但是不容易實現(xiàn)服務(wù)的負(fù)載均衡和彈性伸縮,而marathon-lb實現(xiàn)了這些功能。

Marathon-lb是一個基于haproxy的負(fù)載均衡器,但是它會監(jiān)聽marathon event bus,每當(dāng)注冊到marathon-lb上的服務(wù)數(shù)目變化的時候,marathon-lb也會自動更新haproxy的配置文件,從而實現(xiàn)負(fù)載均衡。Marathon-lb可以如圖中實現(xiàn)對外的負(fù)載均衡,也可以實現(xiàn)對內(nèi)的服務(wù)之間相互調(diào)用的負(fù)載均衡。
Marathon的安裝可以在界面中universe里面搜索marathon-lb安裝,也可以通過命令行執(zhí)行dcos package install Marathon-LB進(jìn)行安裝,默認(rèn)安裝的對外的負(fù)載均衡器。
我們在服務(wù)里面創(chuàng)建如下的應(yīng)用:
{
"id": "nginx",
"container": {
"type": "DOCKER",
"docker": {
"image": "nginx:1.7.7",
"network": "BRIDGE",
"portMappings": [
{ "hostPort": 0, "containerPort": 80, "servicePort": 10000 }
],
"forcePullImage":true
}
},
"instances": 1,
"cpus": 0.1,
"mem": 65,
"healthChecks": [{
"protocol": "HTTP",
"path": "/",
"portIndex": 0,
"timeoutSeconds": 10,
"gracePeriodSeconds": 10,
"intervalSeconds": 2,
"maxConsecutiveFailures": 10
}],
"labels":{
"HAPROXY_GROUP":"external"
}
}
在這個應(yīng)用里面,servicePort為10000則說明我們注冊到marathon-lb上的外部端口為10000, labels里面寫的是external,也即注冊到外部的負(fù)載均衡器上。
這個時候,我們訪問public slave上的10000端口,就能看到啟動的nginx的頁面 http://54.254.148.129:10000/ ,內(nèi)部其他的應(yīng)用可以通過 http://marathon-lb.marathon.mesos:10000 來訪問這個nginx
如果我們訪問public slave上的haproxy的配置頁面 http://54.254.148.129:9090/haproxy?stats ,可以看到如下的映射關(guān)系。

對外marathon-lb監(jiān)聽10000端口,對內(nèi)映射為10.0.1.78上的20215端口,如果我們從服務(wù)頁面上查看,的確啟動的nginx是監(jiān)聽20215端口的。

接下來我們部署marathon-lb-autoscale,它監(jiān)控haproxy,發(fā)現(xiàn)RPS(request per seconds)超過一定的數(shù)目,就對應(yīng)用進(jìn)行彈性擴(kuò)展。
{
"id": "marathon-lb-autoscale",
"args":[
"--marathon", " http://leader.mesos:8080" ,
"--haproxy", " http://marathon-lb.marathon.mesos:9090" ,
"--target-rps", "100",
"--apps", "nginx_10000"
],
"cpus": 0.1,
"mem": 16.0,
"instances": 1,
"container": {
"type": "DOCKER",
"docker": {
"image": "brndnmtthws/marathon-lb-autoscale",
"network": "HOST",
"forcePullImage": true
}
}
}
接下來,我們部署應(yīng)用siege向nginx發(fā)送請求
{
"id": "siege",
"args":[
"-d1",
"-r1000",
"-c100",
" http://marathon-lb.marathon.mesos:10000/"
],
"cpus": 0.5,
"mem": 16.0,
"instances": 1,
"container": {
"type": "DOCKER",
"volumes": [],
"docker": {
"image": "yokogawa/siege",
"network": "HOST",
"privileged": false,
"parameters": [],
"forcePullImage": false
}
}
}
如果我們看haproxy的stats頁面,發(fā)現(xiàn)已經(jīng)有請求發(fā)過來了。這個時候我們增加siege到10,給nginx加壓。