当一个Task运行的时候,Mesos-DNS会创建一个域名..mesos对应:
Mesos-Agent的IP地址
如果是Mesos Containerizer的话,返回的是Task内部容器的IP
另外..slave.mesos还会提供所在的物理机的IP地址。这样通过hostport和Mesos-DNS所给的域名,可以实现服务的发现。
第三:marathon-lb
使用DNS虽然可以实现服务的自发现,但是不容易实现服务的负载均衡和弹性伸缩,而marathon-lb实现了这些功能。
Marathon-lb是一个基于haproxy的负载均衡器,但是它会监听marathon event bus,每当注册到marathon-lb上的服务数目变化的时候,marathon-lb也会自动更新haproxy的配置文件,从而实现负载均衡。Marathon-lb可以如图中实现对外的负载均衡,也可以实现对内的服务之间相互调用的负载均衡。
Marathon的安装可以在界面中universe里面搜索marathon-lb安装,也可以通过命令行执行dcos package install Marathon-LB进行安装,默认安装的对外的负载均衡器。
我们在服务里面创建如下的应用:
{
"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"
}
}
在这个应用里面,servicePort为10000则说明我们注册到marathon-lb上的外部端口为10000, labels里面写的是external,也即注册到外部的负载均衡器上。
这个时候,我们访问public slave上的10000端口,就能看到启动的nginx的页面 http://54.254.148.129:10000/ ,内部其他的应用可以通过 http://marathon-lb.marathon.mesos:10000 来访问这个nginx
如果我们访问public slave上的haproxy的配置页面 http://54.254.148.129:9090/haproxy?stats ,可以看到如下的映射关系。
对外marathon-lb监听10000端口,对内映射为10.0.1.78上的20215端口,如果我们从服务页面上查看,的确启动的nginx是监听20215端口的。
接下来我们部署marathon-lb-autoscale,它监控haproxy,发现RPS(request per seconds)超过一定的数目,就对应用进行弹性扩展。
{
"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
}
}
}
接下来,我们部署应用siege向nginx发送请求
{
"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页面,发现已经有请求发过来了。这个时候我们增加siege到10,给nginx加压。