提起Docker容器化 不得不提服务编排,众所周知目前Docker经常使用的服务编排模式有三种, Mesos DockerSwarm Kubernetes,下面将详细介绍这三种服务编排模式的架构和环境搭建。git
下图是在Mesos官网上对mesos架构的介绍github
即便不看下面的英文描述,从这张图上咱们也看看出Mesos的总体架构,主体为主从结构master/slave或者master/agent模式,对master节点来讲为了不单点,引入了多个master,多个master向Zookeeper注册本身,用zk实现选举。master节点运行一些任务调度器(scheduler),agent节点运行任务执行器(executor),一个agent节点能够运行多个执行器,有执行器来执行具体任务(task)。web
任务调度以下图:docker
从图中能够看出,这个调度分为四个过程:apache
1.Mesos Agent将本身所在机器(物理机,虚拟机,容器)的资源信息(可用的处理器,内存,磁盘等资源)上报给Mesos Master的资源分配组件(Allocation Module)。vim
2.master节点向framework发送资源邀约(resource offer),通知framework在agent上可用的资源信息。设计模式
3.框架调度程序(FW Scheduler)把须要在agent上运行的两个任务的信息发给master。bash
4.master将任务发送给agent,agent将须要的资源分配给执行器(Executor),执行器一次启动两个任务(task)。架构
当agent节点任务运行结束或者资源空闲时将循环此流程。app
下面的图将Mesos和Linux操做系统作了对比,很好说明了Mesos设计模式和Mesos和Framework 及Task之间的关系。
Mesos相对于Linux,BSD系统的内核,Framework至关于Linux的系统服务或者外壳,两者都是在此之上运行具体的任务。不一样之处在于Mesos调度的是多台机器。
以最简单的多结点服务为例,我有一个基于SpringBoot的已经打好Docker镜像的web服务,目前的需求是咱们须要把这个服务部署在三个节点防止单点故障,而且之后随着环境的变化(用户访问量的增长/减小,容灾灾备等)咱们还要对这个服务随时进行扩缩容。针对当前的需求分析后设计以下基于Apache Mesos的部署架构图。
简单介绍一下,再生产中咱们的Mesos Framework选用Marathon,Marathon是一个中间层的生产级容器编排平台,能够运行在数据中心操做系统(DC / OS)和Apache Mesos上。具体资料能够从官方Github地址获取:http://mesosphere.github.io/marathon。使用Marathon lb实现自动负载均衡。
首先有三台机器分别为 server01 server02 server03,将server01做为Mesos master节点,server02 和 server03 做为slave节点,因为我的测试机器有限因此Zookeeper和Marathon Marathon lb 都部署在server01上,生产环境强烈建议部署独立的Zookeeper集群,Marathon也脱离Mesos独立部署。
Mesos安装方式有好几种,源码编译安装,二进制包安装,使用Docker镜像来运行Mesos。
前两种安装方式介绍在Mesos官网Getting Started 就能够找到,http://mesos.apache.org/getting-started,参考文档很容易就能够装好,咱们介绍第三张基于Docker的安装方式,减小对容器环境的依赖,也方便管理。
若是不了解MesosDocker镜像的话,咱们能够先去看看DockerHub上有没有已经作好的镜像,https://hub.docker.com,搜索mesos,能够看到已经有mesosphere为咱们打好的镜像,mesosphere为dockerHub贡献的不少很是实用的镜像。
找到须要的镜像
点击去看看它的一些描述信息,ReadMe and Dockerfiles: https://github.com/mesosphere/docker-containers/tree/master/mesos
据此咱们大体知道如何来运行master个slave的镜像,能够选择一个镜像版本,我就选择1.6.2了。
接下来开始安装,登陆到master机器(server01),执行 docker version 确认docker安装信息。
关于安装并启动Zookeeper,参考我这篇文章,zookeeper 安装
新建一个放置启动脚本的路径,建立启动脚本。
mkdir -p /data/mesos cd /data/mesos vim mesos-master.sh
对以前提供的启动命令进行调整,修改zk地址,指定net模式,修改挂载日志和临时文件路径,指定镜像版本,关闭host查询,指定hostname,具体以下(IP为虚拟):
#!/bin/bash docker run -d --net=host \ --hostname=36.107.107.175 \ -e MESOS_PORT=5050 \ -e MESOS_ZK=zk://127.0.0.1:2181/mesos \ -e MESOS_QUORUM=1 \ -e MESOS_REGISTRY=in_memory \ -e MESOS_LOG_DIR=/var/log/mesos \ -e MESOS_WORK_DIR=/var/tmp/mesos \ -v "/data/mesos/log/mesos:/var/log/mesos" \ -v "/data/mesos/tmp/mesos:/var/tmp/mesos" \ mesosphere/mesos-master:1.6.2 --no-hostname_lookup --hostname=mesos.mrpei.cn
确认已启动Zookeeper后,执行以下脚本便可启动Mesos master
sh mesos-master.sh
查看容器信息
docker ps
若是启动失败,能够执行
docker logs [container id]
查看日志,定位问题。
相似的 在slave机器上也执行以上操做,下面给出slave的启动脚本:
#!/bin/bash docker run -d --net=host --privileged \ --hostname=36.107.107.180 \ -e MESOS_PORT=5051 \ -e MESOS_MASTER=zk://36.107.107.175:2181/mesos \ -e MESOS_SWITCH_USER=0 \ -e MESOS_CONTAINERIZERS=docker,mesos \ -e MESOS_LOG_DIR=/var/log/mesos \ -e MESOS_WORK_DIR=/var/tmp/mesos \ -v "$(pwd)/log/mesos:/var/log/mesos" \ -v "$(pwd)/tmp/mesos:/var/tmp/mesos" \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /sys:/sys \ -v /usr/bin/docker:/usr/local/bin/docker \ mesosphere/mesos-slave:1.6.2 --no-systemd_enable_support
都启动之后能够访问master的5050端口,能够看到Mesos的基本信息面板。
agent信息
有了上面的经验,咱们对这两个组件也采用运行docker容器的方式来启动。DockerHub查看Marathon 和 Marathon lb的镜像。其实mesosphere已经为咱们准备好了,咱们去看看这两个镜像的描述信息。
对于Marathon能够看到以下信息:
咱们能够根据提供的信息编写一个启动脚本:
#!/bin/bash docker run -d --net=host \ mesosphere/marathon:v1.5.15 \ --master zk://36.107.107.175:2181/mesos \ --zk zk://36.107.107.175:2181/marathon
启动Marathon:
sh marathon.sh
Marathon lb镜像信息以下:
编写启动脚本以下:
#!/bin/bash docker run -d -p 8090:9090 \ -e PORTS=8090 mesosphere/marathon-lb:v1.13.0 sse --group external --marathon http://36.107.107.175:8080
启动Marathon lb:
sh marathon-lb.sh
查看镜像启动状况:
访问8090查看Marathon UI
Marathon UI里 点击create application 填写id 须要的资源 和 镜像地址,端口映射信息,因为以前我已经把镜像打好推到了dockerHub,因此直接填写镜像pull的地址便可。点击create便可。
关于镜像仓库:标准企业生产环境是有本身的私有镜像仓库的,用的比较多的是 Vmware 开源的 Harbor,我以前在一台机器上起着Harbor来着,因为机器资源有限,而且三台机器并非一家云服务供应商,1M带宽下 镜像 push pull 都很慢,因此在这里就没有引入Docker 私有仓库的问题。若是要使用私有仓库,能够直接在三台机器上分别执行 docker login 登陆到私服就能够了。