提起Docker容器化 不得不提服务编排,众所周知目前Docker常用的服务编排模式有三种, Mesos DockerSwarm Kubernetes,下面将详细介绍这三种服务编排模式的架构和环境搭建。
一. Mesos
1.Mesos架构图
下图是在Mesos官网上对mesos架构的介绍
即使不看下面的英文描述,从这张图上我们也看看出Mesos的整体架构,主体为主从结构master/slave或者master/agent模式,对master节点来说为了避免单点,引入了多个master,多个master向Zookeeper注册自己,用zk实现选举。master节点运行一些任务调度器(scheduler),agent节点运行任务执行器(executor),一个agent节点可以运行多个执行器,有执行器来执行具体任务(task)。
2.Mesos任务执行调度过程
任务调度如下图:
从图中可以看出,这个调度分为四个过程:
1.Mesos Agent将自己所在机器(物理机,虚拟机,容器)的资源信息(可用的处理器,内存,磁盘等资源)上报给Mesos Master的资源分配组件(Allocation Module)。
2.master节点向framework发送资源邀约(resource offer),通知framework在agent上可用的资源信息。
3.框架调度程序(FW Scheduler)把需要在agent上运行的两个任务的信息发给master。
4.master将任务发送给agent,agent将需要的资源分配给执行器(Executor),执行器一次启动两个任务(task)。
当agent节点任务运行结束或者资源空闲时将循环此流程。
3.Mesos层级架构
下面的图将Mesos和Linux操作系统做了对比,很好说明了Mesos设计模式和Mesos和Framework 及Task之间的关系。
Mesos相对于Linux,BSD系统的内核,Framework相当于Linux的系统服务或者外壳,二者都是在此之上运行具体的任务。不同之处在于Mesos调度的是多台机器。
4.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独立部署。
4.1 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信息
4.2 Marathon 和 Marathon lb安装
有了上面的经验,我们对这两个组件也采用运行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
4.3 部署web服务
Marathon UI里 点击create application 填写id 需要的资源 和 镜像地址,端口映射信息,由于之前我已经把镜像打好推到了dockerHub,所以直接填写镜像pull的地址即可。点击create即可。
关于镜像仓库:标准企业生产环境是有自己的私有镜像仓库的,用的比较多的是 Vmware 开源的 Harbor,我之前在一台机器上起着Harbor来着,由于机器资源有限,并且三台机器并不是一家云服务供应商,1M带宽下 镜像 push pull 都很慢,所以在这里就没有引入Docker 私有仓库的问题。如果要使用私有仓库,可以直接在三台机器上分别执行 docker login 登录到私服就可以了。
二. Swarm
来源:oschina
链接:https://my.oschina.net/u/2420680/blog/3044002