创新路
我们一直在努力

Mesos + marathon + Docker实战

如果要评价2015年***火的技术,那么非Docker莫属,当你开始使用并部署上Docker之后,那么你会发现想真正用起来,缺少很多组件。比如本文要介绍的分布式集群管理就是其中之一。

本文为实战分享,所以相关理论较少,需要大家自行Google。

Mesos:Mesos采用与Linux Kernel相同的机制,只是运行在不同的抽象层次上。Mesos Kernel利用资源管理和调度的API在整个数据中心或云环境中运行和提供引用(例如,Hadoop、Spark、Kafaka、ElasticSearch)。

ZooKeeper:ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和HBase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。

Marathon:Marathon是一个Mesos框架,能够支持运行长服务,比如Web应用等。它是集群的分布式Init.d,能够原样运行任何Linux二进制发布版本,如Tomcat、Play等等。它也是一种私有的PaSS,实现服务的发现,为部署提供提供REST API服务,有授权和SSL、配置约束,通过HAProxy实现服务发现和负载平衡。
好的,架构图看起来像这样。

无标题1.png

下面我们就准备开始实战部署了。首先要说明下实验环境:

index.png

Zookeeper伪集群部署
在部署mesos集群之前,我们必须先部署一个可用的zookeeper集群,后面mesos会连接到zookeeper上。

[root@linux-node1 ~]# cd /usr/local/src
[root@linux-node1 src]# wget <a href="http://mirrors.cnnic.cn/apache/zookeeper/stable/zookeeper-3.4.6.tar.gz" target="_blank" rel="nofollow">http://mirrors.cnnic.cn/apache ... ar.gz</a>
[root@linux-node1 src]# tar zxf zookeeper-3.4.6.tar.gz
[root@linux-node1 src]# mv zookeeper-3.4.6 /usr/local/zookeeper
[root@linux-node1 src]# ln -s /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper
[root@linux-node1 ~]# cd /usr/local/zookeeper/conf/
[root@linux-node1 conf]# mv zoo_sample.cfg zoo.cfg


zookeeper配置文件详解

下面就是zoo.cfg配置文件的修改了。那么我们首先要熟悉下zookeeper配置文件。

[root@linux-node1 ~]# cat/usr/local/zookeeper/conf/zoo.cfg

dataDir:数据目录
dataLogDir:日志目录
clientPort:客户端连接端口
tickTime:Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
initLimit:Zookeeper的Leader 接受客户端(Follower)初始化连接时***长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit:表示 Leader 与 Follower 之间发送消息时请求和应答时间长度,***长不能超过多少个tickTime 的时间长度,总的时间长度就是 2*2000=4 秒。
server.A=B:C:D:
A 是一个数字,表示这个是第几号服务器;
B 是这个服务器的 ip 地址;
C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

Zookeeper配置文件修改
如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

[root@linux-node1 conf]# grep '^[a-z]' zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zk1
clientPort=2181
server.1=192.168.56.11:3181:4181
server.2=192.168.56.11:3182:4182
server.3=192.168.56.11:3183:4183

创建三个目录用来存放zookeeper数据

[root@linux-node1 ~]# mkdir -p /data/zk1 /data/zk2/data/zk3
[root@linux-node1 ~]# echo "1" >/data/zk1/myid
[root@linux-node1 ~]# echo "2" >/data/zk2/myid
[root@linux-node1 ~]# echo "3" >/data/zk3/myid

生成三份zookeeper配置文件

[root@linux-node1 conf]# cp zoo.cfg zk1.cfg
[root@linux-node1 conf]# cp zoo.cfg zk2.cfg
[root@linux-node1 conf]# cp zoo.cfg zk3.cfg

修改zk2和zk3的配置,使用对应的数据目录和端口。

[root@linux-node1 conf]# sed -i 's/zk1/zk2/g'zk2.cfg
[root@linux-node1 conf]# sed -i 's/2181/2182/g'zk2.cfg
[root@linux-node1 conf]# sed -i 's/zk1/zk3/g'zk3.cfg
[root@linux-node1 conf]# sed -i 's/2181/2183/g'zk3.cfg

启动Zookeeper

/usr/local/zookeeper/bin/zkServer.sh start/usr/local/zookeeper/conf/zk1.cfg
/usr/local/zookeeper/bin/zkServer.sh start/usr/local/zookeeper/conf/zk2.cfg
/usr/local/zookeeper/bin/zkServer.sh start/usr/local/zookeeper/conf/zk3.cfg

查看Zookeeper角色

[root@linux-node1 ~]#/usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk1.cfg
JMX enabled by default
Using config: /usr/local/zookeeper/conf/zk1.cfg
Mode: follower

[root@linux-node1 ~]#/usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk2.cfg
JMX enabled by default
Using config: /usr/local/zookeeper/conf/zk2.cfg
Mode: follower

[root@linux-node1 ~]#/usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk3.cfg
JMX enabled by default
Using config: /usr/local/zookeeper/conf/zk3.cfg
Mode: leader





连接Zookeeper

[root@linux-node1 ~]#  /usr/local/zookeeper/bin/zkCli.sh -server192.168.56.11:2181

通过上面的例子可以看到,目前zk3是leader,其它两个节点是follower。本文由于实验环境局限使用的是伪分布式,注意生产环境不建议使用。

Mesos 集群部署
Mesos集群有MesosMaster和Mesos Slave两个角色。

安装mesosphere仓库
需要在Mesos Master和MesosSlave节点均安装:

# rpm -Uvh <a href="http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-1.noarch.rpm" target="_blank" rel="nofollow">http://repos.mesosphere.com/el ... h.rpm</a>

Mesos Master部署
[root@linux-node1 ~]# yum -y install mesos marathon
安装完毕后,增加zookeeper配置

[root@linux-node1 ~]# vim /etc/mesos/zk
zk://192.168.56.11:2181,192.168.56.11:2182,192.168.56.11:2183/mesos
[root@linux-node1 ~]# systemctl start mesos-master mesos-slave
[root@linux-node1 ~]# systemctl start marathon

Mesos Slave部署

[root@linux-node2 ~]# yum -y install mesos marathon
[root@linux-node2 ~]# systemctl start mesos-slave

Mesos的Web管理界面
Mesos安装完毕后,Mesos Master会启动一个Web服务,监听在5050端口。
http://${HOST_IP}:5050
这时候你将得到一个像这样的页面但可能在‘Tasks’表格没有任何的条目。

无标题2.png

下面我们来运行******mesos任务,注意刷新查看Mesos的Web界面,你会在Active Tasks看到我们测试的任务。

[root@linux-node1~]# MASTER=$(mesos-resolve `cat /etc/mesos/zk`)
[root@linux-node1~]# mesos-execute --master=$MASTER --name="cluster-test"--command="sleep 60"

 

无标题3.png

使用Marathon调用Mesos 运行Docker容器

配置Mesos运行Docker容器

[root@linux-node1 ~]# yum install -y docker
[root@linux-node1 ~]# systemctl start docker

首先先测试下,保证手动创建Docker容器没问题。

[root@linux-node1 ~]# docker pull nginx

再所有mesos-slave上增加配置参数,并重启

linux-node1:
[root@linux-node1 ~]# echo 'docker,mesos' | tee/etc/mesos-slave/containerizers
docker,mesos
[root@linux-node1 ~]# systemctl restart mesos-slave

linux-node2:
[root@linux-node2 ~]# echo 'docker,mesos' | tee/etc/mesos-slave/containerizers
docker,mesos
[root@linux-node2 ~]# systemctl restart mesos-slave

接下来,我们要使用我们marathon来创建一个nginx的Docker容器,通过Mesos进行调度。   我们上面安装mesos-master的时候,已经安装了marathon。默认监听在8080端口,通过使用http://{HOST}:8080/来打开marathon。如下图所示:

无标题4.png

我相信读者会有疑问,我们并没有对marathon做任何的配置,它是怎么知道Mesos在哪里的呢?答案是通过zookeeper,marathon启动的时候会读取/etc/mesos/zk配置文件,通过Zookeeper来找到Mesos Master。marathon有自己的REST API,我们通过API的方式来创建一个nginx的docker容器:

首先创建如下的配置文件nginx.json:

[root@linux-node1 ~]# cat nginx.json
{
  "id":"nginx",
  "cpus":0.2,
  "mem":20.0,
 "instances": 1,
 "constraints": [["hostname", "UNIQUE",""]],
 "container": {
    "type":"DOCKER",
   "docker": {
     "image": "nginx",
     "network": "BRIDGE",
     "portMappings": [
        {"containerPort": 80, "hostPort": 0,"servicePort": 0, "protocol": "tcp" }
      ]
    }
  }
}

然后调用

# curl -X POST <a href="http://192.168.56.11:8080/v2/apps-d" target="_blank" rel="nofollow">http://192.168.56.11:8080/v2/apps-d</a> @nginx.json \
-H "Content-type: application/json"

 

无标题4.png

现在你就可以通过31984来访问到nginx了。当然了,你也可以在mesos-slave上来寻找一下这个容器:

[root@linux-node1 ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES

58df0c7f15f9        nginx               "nginx -g 'daemonoff"   7 minutes ago       Up 7 minutes        443/tcp, 0.0.0.0:31984->80/tcp  mesos-0dc69732-fd81-4190-8d7e-f389f80b1f50-S1.56436b54-0fed-4951-ae94-e52889948d67


如果你想创建同样的容器,可以点击上图中德Scale Application来体验一下。同样的,你也可以通过marathon的Web界面来进行容器的创建、扩展和销毁。

无标题5.png

欢迎大家关注《天府云博运维社区》微信公众号,经常会有我们奉送的干货发出哦。

天府云二维码

天府云二维码

客官点个赞呗! (1)
分享到:

评论 抢沙发

评论前必须登录!

天府云博 - 做有态度的开发&运维&设计学习分享平台!

联系我们百度云主机