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。 Master 使用 Resource Offers 实现跨应用细粒度资源共享,如 cpu、内存、磁盘、网络等。 master 根据指定的策略来决定分配多少资源给 framework ,如公平共享策略,或优先级策略。 master 采用热插拔的方式实现了模块,为了以后更好的扩展。 在 Mesos 上运行的 framework 由两部分组成:一个是 scheduler ,通过注册到 master 来获取集群资源。另一个是在 slave 节点上运行的 executor 进程,它可以执行 framework 的 task 。 Master 决定为每个 framework 提供多少资源, framework 的 scheduler 来选择其中提供的资源。当 framework 同意了提供的资源,它通过 master 将 task发送到提供资源的 slaves 上运行。
实验环境准备
主机名
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/ 这时候你将得到一个像这样的页面但可能在’Tasks’表格没有任何的条目。
下面我们来运行第一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。 marathon有自己的REST API,我们通过API的方式来创建一个nginx的docker容器: 首先创建如下的配置文件nginx.json:
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虚拟机