mesos-marathon-docker 实战

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 安装zookeeper

1
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虚拟机