资讯专栏INFORMATION COLUMN

基于Docker搭建多节点Mesos/Marathon

ConardLi / 2230人阅读

摘要:摘要在之前的一篇博客中,我介绍了基于搭建单机版,但是仅仅使用了单个节点。具有容错功能当容器由于节点崩溃等原因意外停止运行时,会自动将容器调度到其他节点。因此,目前仅适合运行无状态的服务,而数据库等有状态服务应该多带带部署。

摘要: 在之前的一篇博客中,我介绍了基于Docker搭建单机版Mesos/Marathon,但是仅仅使用了单个节点。而在这篇博客中,我将介绍基于Docker搭建多节点Mesos/Marathon,开发者可以使用3个节点快速地搭建一个真正的分布式容器集群系统。服务发现负载均衡是容器集群必不可少的功能,我选择了Marathon LB来实现。

GitHub地址: kiwenlau/mesos-marathon-platform

作者: KiwenLau

日期: 2016-07-10

一. Mesos/Marathon简介 1. Mesos

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

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

目前主流的集群资源管理系统还有Hadoop YARN,Kubernetes以及Swarm。Hadoop YARN目前仅适合运行分布式计算框架例如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. Marathon LB

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

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

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

二. 搭建步骤 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. 开启Docker daemon的监听端口

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

Master, Slave1和Slave2:

sudo vim /etc/default/docker

修改DOCKER_OPTS

DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

重启Docker

sudo restart docker
3. 下载Docker镜像

Master:

sudo docker pull kiwenlau/zookeeper:3.4.8 
sudo docker pull kiwenlau/mesos:0.26.0 
sudo docker pull kiwenlau/marathon:1.1.1  
sudo docker pull kiwenlau/marathonlb:1.3.0

Slave1 和 Slave2:

sudo docker pull kiwenlau/mesos:0.26.0
4. 下载GitHub仓库

Master:

git clone https://github.com/kiwenlau/mesos-marathon-platform
5. 运行容器

Master:

cd mesos-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.2 192.168.59.3)
6. 运行Nginx:

下载nginx镜像(Slave1和Slave2):

sudo docker pull nginx: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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26636.html

相关文章

  • 关于 Mesos,你知道少?

    摘要:是一个集群管理器,提供了有效的跨分布式应用或框架的资源隔离和共享,可以运行。更贴近于层,而在之上。所以有人称其为,或者分布式操作系统。你在这里可以看到使用的列表和有什么关联吗是一个为分布式应用提供一致性服务的软件,而是一个分布式应用。 showImg(https://segmentfault.com/img/bVrBZJ); 听过不少人在讨论 Mesos,然而并不是很明白 Mesos ...

    cartoon 评论0 收藏0
  • 关于 Mesos,你知道少?

    摘要:是一个集群管理器,提供了有效的跨分布式应用或框架的资源隔离和共享,可以运行。更贴近于层,而在之上。所以有人称其为,或者分布式操作系统。你在这里可以看到使用的列表和有什么关联吗是一个为分布式应用提供一致性服务的软件,而是一个分布式应用。 showImg(https://segmentfault.com/img/bVrBZJ); 听过不少人在讨论 Mesos,然而并不是很明白 Mesos ...

    xietao3 评论0 收藏0
  • 使用 Docker, 7 个命令部署一个 Mesos 集群

    本文原文是 Deploy a Mesos Cluster with 7 Commands Using Docker 这个教程将给你展示怎样使用 Docker 容器提供一个单节点的 Mesos 集群(未来的一篇文章将展示怎样很容易的扩展这个到多个节点或者是见底部更新)。这意味着你可以使用 7 个命令启动整个集群!不需要安装任何东西除了一个正在运行的 Docker 服务器。 将启动 4 个容器:...

    dadong 评论0 收藏0
  • 基于 Docker 1.12 Swarm 的集群管理开发实践

    摘要:由于没有了中心化的负载均衡器,集群不会因某台机器异常而导致整个服务对外不可用,很好的避免了单点问题,同时也带了可扩展性。 Mesos/Marathon 折腾久了,我们一直希望有机会深入到 Swarm 内部一探究竟。 另外, Mesos 这一套东西虽然是久经企业级考验的, 但是安装、部署和使用相对复杂,上手有门槛。同时,在今年的 DockerCon 上,内置了Swarm 功能的 Dock...

    My_Oh_My 评论0 收藏0
  • 应用容器env化实战

    摘要:本文是数人云工程师方志浩在微信群分享的实录,与大家聊一聊应用容器在配置管理中遇到的问题以及解决方法。数人云分测试演示生产三种环境进行持续集成发布,同时数人云组件通过进行应用容器的封装下发和管理。 本文是数人云工程师方志浩在DockOne微信群分享的实录,与大家聊一聊应用容器在配置管理中遇到的问题以及解决方法。 随着Docker技术的火热发展, Docker在代码构建发布中扮演着越来越重...

    kid143 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<