UDN-企业互联网技术人气社区

板块导航

浏览  : 1286
回复  : 0

[技术交流] 基于Docker搭建多节点Mesos/Marathon

[复制链接]
瞌睡虫的头像 楼主
发表于 2016-7-12 10:18:49 | 显示全部楼层 |阅读模式
  
mesos-marathon-platform.png


  一.Mesos/Marathon简介

  1.Mesos

  Mesos是分布式集群资源管理系统,负责调度集群内的CPU,内存以及磁盘等资源。HadoopMapReduce,Spark以及Storm等分布式计算框架很流行,但是为每一个计算框架搭建单独的集群非常地浪费资源,也无法实现数据共享,而Mesos的设计初衷就是让不同的分布式计算框架能够共享一个集群。

  Mesos资源调度算法分为两个层次:Mesos监控集群的空余资源,并将空余资源按照一定规则分配给各个计算框架;而各个计算框架会根据需要选择接受或者拒绝所分配的资源。这时,Mesos与各个计算框架都参与了资源的调度:Mesos负责分配资源;而计算框架接受或者拒绝资源。因此,Mesos的责任非常清晰而且简单:分配集群资源。Mesos的双层调度算法提高了可扩展性,并且可以更方便地支持不同的计算框架。

  目前主流的集群资源管理系统还有HadoopYARN,Kubernetes以及Swarm。HadoopYARN目前仅适合运行分布式计算框架例如Spark;Kubernetes与Swarm仅适合运行容器应用;而Mesos对分布式计算框架以及容器应用的支持都很成熟。并且,Kubernetes与Swarm可以作为计算框架运行在Mesos之上。Kubernetes的功能强大,但是有些过度设计导致复杂度很高,而Swarm的设计简单很多但是功能相对缺乏,大家可以根据需要选择。个人认为,使用Mesos的话,最好选择Marathon作为容器编排系统,架构非常简单,且功能丰富。

  2.Marathon

  Marathon是容器编排系统,是运行于Mesos之上的众多计算框架之一。用户可以通过Marathon提交,监控并调度容器应用,然后Mesos负责运行容器。另外,Aurora与Marathon功能一致,同为容器编排系统。相比而言,Marathon的架构比Aurora更简单,没有从节点,且对Docker的支持更为完善。Marathon由Mesosphere公司负责开发,社区很活跃,文档也很完善。

  Marathon具有容错功能:当容器由于节点崩溃等原因意外停止运行时,Marathon会自动将容器调度到其他节点。这一点类似进程管理工具例如Supervisor:当进程意外退出时,Supervisor会重启进程。然而,自动容错功能并不适合有状态服务,即带有数据卷(volume)的容器,例如MongoDB与MySQL。因为数据很难跨节点移动,目前的技术还不够成熟。因此,Marathon目前仅适合运行无状态的服务,而数据库等有状态服务应该单独部署。这样做也可以提高数据的安全性。

  3.MarathonLB

  MarathonLB是Marathon的服务发现与负载均衡系统。MarathonLB通过使用Haproxy实现了代理服务器的功能。

  当使用Marathon部署容器时,容器运行的节点(IP)与使用的端口(PORT)是Mesos/Marathon平台负责调度的,无法事先确定。这样的话,每次访问服务时,需要手动去查询容器运行的IP与PORT。并且,容器出错时会发生重新调度,IP与PORT会变化。因此,访问服务会非常不方便。通过使用MarathonLB可以配置服务的固定端口,而服务的IP就是运行MarathonLB的节点IP,这样每次部署服务时,IP与PORT是固定的,就方便很多了。MarathonLB会监听Marathon的调度事件,获取容器运行的IP与PORT,然后更新代理服务器Haproxy的配置文件。因此,当部署新的容器或者容器发生变化时,仍然可以通过固定的IP与PORT访问该容器。这就是所谓的服务发现。

  同一个服务往往对应着多个容器副本,MarathonLB作为代理服务器,同时实现了负载均衡的功能。服务请求能够使用RoundRobin方式发送给各个容器。

  二.搭建步骤

  1.创建虚拟机

  按照使用Vagrant创建多节点虚拟机集群,可以快速地在单个机器上创建Mesos/Marathon平台运行所需要的3个虚拟机节点。

  其中,node1为主机点(Master),运行zookeeper,mesos_master,marathon以及marathon-lb容器;node2与node3为从节点(Slave),运行mesos_slave容器;使用marathon部署nginx时,nginx容器运行在从节点上。如下表所示:
 
节点
IP
运行的容器

node1
192.168.59.1
zookeeper, mesos_master, marathon, marathon-lb

node2
192.168.59.2
mesos_slave1, nginx

node3
192.168.59.3
mesos_slave2, nginx




       2.开启Dockerdaemon的监听端口

  因为start-containers.sh使用了远程启动容器的方式,因此需要开启Dockerdaemon的TCP监听端口。提醒一下,开启Dockerdaemon端口是不安全的,生产环境中不能打开,或者做好防火墙配置。不希望开启Dockerdaemon的监听端口的话,可以使用start-containers.sh中的命令直接运行容器,只是稍微麻烦一点。

  Master,Slave1和Slave2:

  sudovim/etc/default/Docker

  修改Docker_OPTS

  Docker_OPTS="-Htcp://0.0.0.0:2375-Hunix:///var/run/Docker.sock"

  重启Docker

  sudorestartDocker

  3.下载Docker镜像

  Master:

  sudoDockerpullkiwenlau/zookeeper:3.4.8

  sudoDockerpullkiwenlau/mesos:0.26.0

  sudoDockerpullkiwenlau/marathon:1.1.1

  sudoDockerpullkiwenlau/marathonlb:1.3.0

  Slave1和Slave2:

  sudoDockerpullkiwenlau/mesos:0.26.0

  4.下载GitHub仓库

  Master:

  gitclonehttps://github.com/kiwenlau/mesos-marathon-platform

  5.运行容器

  Master:

  cdmesos-marathon-platform

  sudo./start-containers.sh

  网页管理:

  Mesos:http://192.168.59.1:5050/

  Marathon:http://192.168.59.1:8080/

  如果需要增加Slave节点,或者配置不同的节点IP,仅需修改start-contaniers.sh脚本中以下内容:

  MASTER_IP=192.168.59.1

  SLAVE_IP=(192.168.59.2192.168.59.3)

  6.运行Nginx:

  下载nginx镜像(Slave1和Slave2):

  sudoDockerpullnginx:1.10

  运行Nginx(Master):

  sudo./run-nginx.sh

  Nginx的的定义如下(nginx.json):

  {

  "id":"nginx",

  "labels":{

  "HAPROXY_GROUP":"external"

  },

  "cpus":0.2,

  "mem":20.0,

  "instances":2,

  "healthChecks":[{

  "path":"/"

  }],

  "container":{

  "type":"Docker",

  "Docker":{

  "image":"nginx:1.10",

  "network":"BRIDGE",

  "portMappings":[{"containerPort":80,"hostPort":0,"servicePort":10000,"protocol":"tcp"}]

  }

  }

  }

  其中,servicePort表示nginx绑定的端口为10000,而marathon-lb容器运行的节点IP为192.168.59.1。因此nginx的访问地址为:

  http://192.168.59.1:10000/

  而实际上,两个nginx容器运行在Slave节点上,且端口是随机分配的。

  三.参考

  Mesos: A Platform for Fine-Grained Resource Sharing in the Data Center

文章作者:KiwenLau

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部