Docker 服务编排 Mesos Swarm Kubernetes 三种模式实践

提起Docker容器化 不得不提服务编排,众所周知目前Docker经常使用的服务编排模式有三种, Mesos DockerSwarm Kubernetes,下面将详细介绍这三种服务编排模式的架构和环境搭建。git

一. Mesos

1.Mesos架构图

下图是在Mesos官网上对mesos架构的介绍github

即便不看下面的英文描述,从这张图上咱们也看看出Mesos的总体架构,主体为主从结构master/slave或者master/agent模式,对master节点来讲为了不单点,引入了多个master,多个master向Zookeeper注册本身,用zk实现选举。master节点运行一些任务调度器(scheduler),agent节点运行任务执行器(executor),一个agent节点能够运行多个执行器,有执行器来执行具体任务(task)。web

2.Mesos任务执行调度过程

任务调度以下图: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

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

相关文章
相关标签/搜索