尝鲜 | 在Docker中运行你的Mesos集群

【编者的话】本文介绍了在Docker中运行Apache Mesos,Mesos官方网站提供了安装包来直接运行它,但文中尝试使用Docker来运行Mesos,Mesosphere也提供了相应的镜像。在Docker中运行Mesos也有它的好处,读者可以尝试下。 很多人都已经开始在Apache Mesos中运行容器化的应用,我们也是这样。尽管我们尝试在容器中运行应用,但我们还是通过传统的安装包来在自己的主机上安装Mesos。尽管这是最简单和直接的方式来安装Mesos,大部分也都这样做。但不知道你是否想过,在容器中安装和运行Mesos? 在容器中安装Mesos可以帮助我们解决一个非常实际的问题,我们可以在任意版本的主机系统上运行Mesos和它的框架,包括各种测试版本。因为基于容器,问题就转化为只需要在主机上运行不同的Docker镜像。 #Mesos、 Marathon和Zookeeper的Docker镜像 目前在Docker Hub上有几个不同的Apache Mesos Docker镜像,(注意Mesos master 和 slave是两个镜像)。我们选择Mesosphere的镜像。Redjack的仓库同样提供高质量、文档丰富的Mesos镜像。使用哪个取决于你,哪个都可以正常运行,不过需要注意配置可能有些不同。注意这篇文章中使用的是Mesosphere提供的镜像。 上周Thijs Schnitger 创建了一个ZooKeeper 3.5的镜像。Apache ZooKeeper在这个版本引入了动态主机重配置,一个非常酷的特性,特别是在一个经常变化的环境中特别有用,集群也是。所以我们也使用ZooKeeper容器化的解决方案。 我们还会用到Mesosphere的Marathon Docker 镜像#容器化集群配置 我们使用Terraform启动集群。参考terraform-mesos的GitHub仓库并下载它的容器分支,你会找到解决方案(至少在写这篇文章时)。不久,它会被合并到master分支。 让我们来看一下配置过程的有趣部分,通过Docker来运行Mesos、Marathon和Zookeeper。 #Mesos 主节点
QUORUM=2 # number of masters divided by 2 plus 1
CLUSTERNAME="cluster7"
ZK="zk:///mesos"
MESOS_VERSION="0.22.1-1.0.ubuntu1404"

docker run -d \
-e MESOS_QUORUM=${QUORUM} \
-e MESOS_WORK_DIR=/var/lib/mesos \
-e MESOS_LOG_DIR=/var/log \
-e MESOS_CLUSTER=${CLUSTERNAME} \
-e MESOS_ZK=${ZK}/mesos \
--net="host" \
redjack/mesos-master:${MESOSVERSION}
--mesosphere/mesos-master:${MESOSVERSION} 
如你所见,我们仅仅传递给镜像几个相关的版本tag就能运行指定版本的Mesos。除此之外,为了Mesos正常工作还需要传递几个环境变量给容器并启用host networking。 简而言之,带`MESOS_`前缀的变量保存配置的值,我们一般会写到主机`/etc/mesos*`目录下的配置文件。 在集群中的每台主机上运行主节点容器。 #Mesos从节点
ZK="zk:///mesos"
HOSTNAME="host1" # use a hostname of the host
IP="10.20.30.2" # use an IP address of the host
MESOSVERSION="0.22.1-1.0.ubuntu1404"

docker run -d \
 -e MESOS_LOG_DIR=/var/log/mesos \
 -e MESOS_MASTER=${ZK} \
 -e MESOS_EXECUTOR_REGISTRATION_TIMEOUT=5mins \
 -e MESOS_HOSTNAME=${HOSTNAME} \
 -e MESOS_ISOLATOR=cgroups/cpu,cgroups/mem \
 -e MESOS_CONTAINERIZERS=docker,mesos \
 -e MESOS_PORT=5051 \
 -e MESOS_IP=${IP} \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /usr/bin/docker:/usr/bin/docker \
 -v /sys:/sys:ro \
 --net="host" \
redjack/mesos-slave
 --mesosphere/mesos-slave:${MESOSVERSION} 
对于Mesos从节点,配置有点复杂,主要是需要确保从节点可以访问主机上的Docker后台进程(同一个后台进程用来运行这个Mesos从节点实例)。通过挂载`/var/run/docker.sock`文件,`/usr/bin/docker`执行文件和`/sys` 目录(只读)到Mesos从节点容器实现。请注意,这还不是一个完美的解决方案,例如当从Marathon运行另一个Mesos框架,需要再进行细微调整。 #Zookeeper
 # 第一个节点
docker run -d -p 2181:2181 containersol/zookeeper 1

 # 其它节点
MYID="2" # 3,4,5,...
FIRST_NODE="cluster7-mesos-master-0" # hostname of the first node

docker run -d -p 2181:2181 containersol/zookeeper ${MYID} ${FIRST_NODE}
--需要更改端口2888:2888,3888:3888
在这个配置中,运行容器化的ZooKeeper需要一点小技巧。在第一个节点以“standalone” 模式运行,等其它所有节点ZooKeeper实例能连接到它并运行正常,ZooKeeper接着会自动重新配置它自己向所有节点同步。 #Marathon 因为我们想运行应用容器和其它框架,我们在Mesos之上安装“datacenter init system” Marathon框架。
MARATHONVERSION="v0.8.2"
ZK="zk://" # zookeeper quorum string

docker run -d \
 -p 8080:8080 \
 -p 5051:5051 \
 mesosphere/marathon:${MARATHONVERSION} \
 --master ${ZK}/mesos \
 --zk ${ZK}/marathon
注意,我们指定Marathon UI 运行在8080端口,监听5051端口。我们运行任意版本镜像并传递两个强制参数: `master` – quorum hostname/ip and Mesos registration path `zk` – quorum hostname/ip and Marathon registration path 这样就可以在Docker容器中运行Mesos集群的关键组件了。除了运行不同版本的组件,这个我们最大的动机,这种方式自然而然的带来在集群管理层次容器化的所有好处:快速部署,维护简单和设备可移植性。 在这一过程,我们还需要解决haproxy-marathon bridge和Mesos DNS配置的问题。 如果你有任何问题或者要进行评论,请直接在文章下面留言或者在 GitHub上创建issues原文链接:Containerized Mesos Cluster (翻译:朱高校)

2 个评论

【问题请教】使用Mesos集群是为了获得高可靠性、任务调度等......但安装比较烦;在Docker上运行Mesos可以解决安装Mesos的复杂问题。但是:这样的架构,系统的性能会成为问题吗?
就拿建一个网站系统来说,要经过的各个环节:
1、Docker化集群方式:1裸机->2操作系统->3Docker软件->4Mesos集群->5Docker软件->6网站Docker化的应用(Nginx+PHP+MySQL......)
2、普通集群方式:1裸机->2操作系统->4Mesos集群->5Docker软件->6网站Docker化的应用(Nginx+PHP+MySQL......)
3、简单方式:1裸机->2操作系统->5Docker软件->6网站Docker化的应用(Nginx+PHP+MySQL......)

请问:这样的架构,系统的性能会成为问题吗?文中Docker化的集群方式能正式用在生产中吗?
说实话,我们是没有生产的,这个文章来自国外一家docker咨询公司

要回复文章请先登录注册