Mesos+marathon+Docker实战 1 2 **本篇博文参考赵班长发布在unixhot上的一篇文章** [Mesos + marathon + Docker实战](http://www.unixhot.com/article/32) 
环境架构图 
上图显示了 Mesos 的主要组成部分。 Mesos 由一个 master daemon 来管理 slave daemon 在每个集群节点上的运行, mesos applications ( 也称为 frameworks )在这些 slaves 上运行 tasks。
实验环境准备 
主机名 
IP地址规划 
主机描述 
 
 
linux-node1 
IP:192.168.56.22 
Mesos Master、Mesos Slave、Marathon、Zookeeper 
 
linux-node2 
IP:192.168.56.23 
Mesos Slave 
 
基础环境准备 linux-node1 1 2 3 4 5 6 echo "linux-node1" > /etc/hostname hostname linux-node1 cat >>/etc/hosts<<EOF 192.168.56.22 linux-node1 192.168.56.23 linux-node2 EOF 
linux-node2 1 2 3 4 5 6 echo "linux-node2" > /etc/hostname hostname linux-node2 cat >>/etc/hosts<<EOF 192.168.56.22 linux-node1 192.168.56.23 linux-node2 EOF 
系统版本信息 1 2 3 4 5 6 uname  -r 3.10.0-229.el7.x86_64 uname  -m x86_64 cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core) 
Zookeeper伪集群部署 安装java环境 1 2 3 4 5 6 7 8 9 10 cd /usr/local/src/ tar -zxf jdk-8u65-linux-x64.tar.gz mv jdk1.8.0_65/ ../java-1.8.65 cd ../ ln -s java-1.8.65/ java vim /etc/profile export JAVA_HOME=/usr/local/java export PATH=$JAVA_HOME/bin:$JAVA_HOME/	jre/bin:$PATH export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.$CLASSPATH:	$JAVA_HOME/lib:$JAVA_HOME/jre/lib:	$JAVA_HOME/lib/tools.jar 
linux-node1 安装zookeeper1 2 3 4 5 6 7 cd /usr/local/src wget http://mirrors.cnnic.cn/apache/zookeeper/stable/zookeeper-3.4.6.tar.gz tar zxf zookeeper-3.4.6.tar.gz mv zookeeper-3.4.6 /usr/local/ ln -s /usr/local/zookeeper-3.4.6/ /usr/local/zookeeper cd /usr/local/zookeeper/conf/ mv zoo_sample.cfg zoo.cfg 
创建三个目录用来存放zookeeper数据 1 2 3 4 mkdir /data/{zk1,zk2,zk3} -p echo "1" >/data/zk1/myid echo "2" >/data/zk2/myid echo "3" >/data/zk3/myid 
生成三份zookeeper配置文件 1 2 3 cp zoo.cfg zk1.cfg cp zoo.cfg zk2.cfg cp zoo.cfg zk3.cfg 
修改zk2和zk3的配置,使用对应的数据目录和端口。 1 2 3 4 sed -i 's/zk1/zk2/g' zk2.cfg sed -i 's/2181/2182/g' zk2.cfg sed -i 's/zk1/zk3/g' zk3.cfg sed -i 's/2181/2183/g' zk3.cfg 
启动Zookeeper 1 2 3 4 5 6 /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 # JMX enabled by default # Using config: /usr/local/zookeeper/conf/zk3.cfg # Starting zookeeper ... STARTED 
查看Zookeeper角色 1 2 3 4 5 6 7 8 9 10 11 12 /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 /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: leader /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: follower 
连接Zookeeper 1 2 /usr/local/zookeeper/bin/zkCli.sh -server192.168.56.22:2181 
通过上面的例子可以看到,目前zk2是leader,其它两个节点是follower。
 
Mesos 集群部署 Mesos集群有MesosMaster和Mesos Slave两个角色。
安装mesosphere仓库 
需要在Mesos Master和MesosSlave节点均安装
 
1 rpm -Uvh http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-1.noarch.rpm 
Mesos Master部署(node1) 1 2 3 4 5 6 yum -y install mesos marathon 安装完毕后,增加zookeeper配置 [root@linux-node1 ~]# vim /etc/mesos/zk zk://192.168.56.22:2181,192.168.56.22:2182,192.168.56.22:2183/mesos systemctl start mesos-master mesos-slave systemctl start marathon 
Mesos Slave部署(node2) 1 2 3 4 yum -y install mesos marathon [root@linux-node1 ~]# vim /etc/mesos/zk zk://192.168.56.22:2181,192.168.56.22:2182,192.168.56.22:2183/mesos systemctl start mesos-slave 
Mesos的Web管理界面   Mesos安装完毕后,Mesos Master会启动一个Web服务,监听在5050端口。http://192.168.56.22:5050/ 
下面我们来运行第一mesos任务,注意刷新查看Mesos的Web界面,你会在Active Tasks看到我们测试的任务。
1 2 MASTER=$(mesos-resolve `cat /etc/mesos/zk`) mesos-execute --master=$MASTER --name="cluster-test" --command="sleep 60" 
使用Marathon调用Mesos 运行Docker容器 配置Mesos运行Docker容器(node1) 1 2 3 [root@linux-node1 ~]# yum install -y docker [root@linux-node1 ~]# systemctl start docker [root@linux-node1 ~]# docker pull nginx 
首先先测试下,保证手动创建Docker容器没问题。
 
再所有mesos-slave上增加配置参数,并重启 linux-node1: 
1 2 3 echo 'docker,mesos' | tee /etc/mesos-slave/containerizers # docker,mesos systemctl restart mesos-slave 
linux-node2: 
1 2 3 echo 'docker,mesos' | tee /etc/mesos-slave/containerizers # docker,mesos systemctl restart mesos-slave 
接下来,我们要使用我们marathon来创建一个nginx的Docker容器,通过Mesos进行调度。   我们上面安装mesos-master的时候,已经安装了marathon。默认监听在8080端口,通过使用 http://192.168.56.22:8080/来打开marathon。如下图所示: 
marathon启动的时候会读取/etc/mesos/zk配置文件,通过Zookeeper来找到Mesos Master。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [ root@localhost ~10 : 57 : 59 ] #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"  }        ]      }    }  } 
然后调用
1 2 curl -X POST http://192.168.56.22:8080/v2/apps -d @nginx.json \ -H "Content-type: application/json" 
现在你就可以通过31984来访问到nginx了。当然了,你也可以在mesos-slave上来寻找一下这个容器:linux-node1 
1 2 3 docker ps -a CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                            NAMES 5cc8d207d2b2        nginx               "nginx -g 'daemon off"   About a minute ago   Up About a minute           443/tcp, 0.0.0.0:31610->80/tcp   mesos-b5254dbf-0b69-4c0e-b9b6-cd271f73265c-S0.2d202e6a-fb23-41b9-93b6-2b3b1cbfcf30 
如果你想创建同样的容器,可以点击上图中的Scale Application来体验一下。同样的,你也可以通过marathon的Web界面来进行容器的创建、扩展和销毁。
创建10台nginx虚拟机