深入解析DC/OS 1.8 – 高可靠的微服务及大数据管理平台

  当一个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加压。