配置多台Mesos-master环境

生产环境中ZooKeeper是以宕机个数过半来让整个集群宕机的。所以Mesos-master一般选择奇数个节点来组成集群,随着部署的Master节点增多可靠性也就增强,但多Mesos-master集群环境只有一个Mesos-master会处于Leader状态对外提供服务,集群中的其他服务器则会成为此Leader的Follower,处于就绪状态。当Leadre发生故障的时候,ZooKeeper就会快速在Follower中投票选举出下一个服务器作为Leader继续对外提供服务。

实验环境表

在CentOS7上配置Marathon+Mesos+Docker实战

实验步骤

1.设置四台服务器的名称分别是:master1、master2、master3、slave 。

[root@localhost ~]# hostnamectl set-hostname master1  
[root@localhost ~]# hostnamectl set-hostname master2
[root@localhost ~]# hostnamectl set-hostname master3
[root@localhost ~]# vim /etc/hosts  #所有主机同步
192.168.126.162 master1
192.168.126.164 master2
192.168.126.161 master3
192.168.126.165 slave1
192.168.126.166 slave2

[root@localhost ~]# hostnamectl set-hostname slave1
[root@localhost ~]# hostnamectl set-hostname slave1
[root@localhost ~]# vim /etc/hosts
192.168.126.162 master1
192.168.126.164 master2
192.168.126.161 master3
192.168.126.165 slave1
192.168.126.166 slave2

2.安装ZooKeeper

分别在所有的Mesos-master节点上安装ZooKeeper。

[root@master1 ~]# tar zxvf zookeeper-3.4.6.tar.gz -C /home/q/
[root@master1 ~]# cd /home/q/zookeeper-3.4.6/
[root@master1 ~]# mv conf/zoo_sample.cfg conf/zoo.cfg 

3.配置ZooKeeper

修改ZooKeeper配置文件,以server.A=B:C:D: 格式定义各个节点相关信息,其中:A 是一个数字,表示第几号服务器;B是这个服务器的IP地址;C为与集群中的Leader服务器交换信息的端口;D是在Leader挂掉时专门进行Leader选举时所用的端口。

dataDir=/home/q/zookeeper-3.4.6/data     #修改位置
dataLogDir=/home/q/zookeeper-3.4.6/datalog
server.1=192.168.126.162:2888:3888   #2888,信息交互端口
server.2=192.168.126.164:2888:3888   #3888,选举端口
server.3=192.168.126.161:2888:3888

修改完的配置文件拷贝给其他Mesos-master主机:

[root@master1 zookeeper-3.4.6]# scp conf/zoo.cfg 192.168.126.164:/home/q/zookeeper-3.4.6/conf/zoo.cfg 
[root@master1 zookeeper-3.4.6]# scp conf/zoo.cfg 192.168.126.161:/home/q/zookeeper-3.4.6/conf/zoo.cfg 

每个节点还需要在配置文件zoo.cfg中定义的dataDir路径下创建一个myid文件,myid文件存有上面提到的A的值。

Master1:
[root@master1 zookeeper-3.4.6]# mkdir data datalog
[root@master1 zookeeper-3.4.6]# echo 1 > data/myid
[root@master1 zookeeper-3.4.6]# cat data/myid 
1

Master2:
[root@master2 zookeeper-3.4.6]# mkdir data datalog
[root@master2 zookeeper-3.4.6]# echo 2 > data/myid
[root@master2 zookeeper-3.4.6]# cat data/myid 
2

Master3:
[root@master3 zookeeper-3.4.6]# mkdir data datalog
[root@master3 zookeeper-3.4.6]# echo 3 > data/myid
[root@master3 zookeeper-3.4.6]# cat data/myid 
3

分别在各Master节点上启动ZooKeeper服务

[root@master1 zookeeper-3.4.6]# ./bin/zkServer.sh start conf/zoo.cfg 
JMX enabled by default
Using config: conf/zoo.cfg
Starting zookeeper ... STARTED

查看状态,看到Master2被选举为Leader,其他主机为Follower状态。

[root@master1 zookeeper-3.4.6]# ./bin/zkServer.sh status
JMX enabled by default
Using config: /home/q/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

[root@master2 zookeeper-3.4.6]# ./bin/zkServer.sh status
JMX enabled by default
Using config: /home/q/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader

[root@master3 zookeeper-3.4.6]# ./bin/zkServer.sh status
JMX enabled by default
Using config: /home/q/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

3.分别启动Mesos-master

[root@master1 zookeeper-3.4.6]# mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.126.162:2181/mesos --quorum=2

[root@master2 zookeeper-3.4.6]# mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.126.164:2181/mesos --quorum=2

[root@master3 zookeeper-3.4.6]# mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.126.161:2181/mesos --quorum=2

4.启动Mesos-slave

[root@slave ~]# mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.126.162:2181,192.168.164.164:2181,192.168.126.161:2181/mesos --no-hostname_lookup --ip=0.0.0.0

使用浏览器指定任意Mesos-master地址的5050端口进行验证,如图所示。指定的是非Leader状态下的 Mesos-master1地址,页面会自行跳转至处于Leader状态的Mesos-master2地址。
在CentOS7上配置Marathon+Mesos+Docker实战

部署运行Marathon

Marathon是一个Mesos框架,能够支持运行长服务。

1.安装marathon到三台Mesos-master主机上并启动Marathon

[root@master1 ~]# tar zxvf  marathon-0.15.2.tgz -C /home/q/
[root@master1 ~]# cd /home/q/marathon-0.15.2/
[root@master1 marathon-0.15.2]# ./bin/start --hostname 192.168.126.162 --master zk://192.168.126.162:2181,192.168.126.164:2181,192.168.175.161:2181/mesos --http_address 0.0.0.0

访问Marathon(默认使用8080端口),如图所示:
在CentOS7上配置Marathon+Mesos+Docker实战

2.使用Marathon创建测试任务

在首页点击Create按钮,创建一个测试任务echo "hello world",如图所示:
在CentOS7上配置Marathon+Mesos+Docker实战

创建成功后在页面可以看到该任务,如图所示:
在CentOS7上配置Marathon+Mesos+Docker实战

此时,Marathon会自动注册到Mesos中,可以在Mesos Web的Framework页面中看到该注册信息。如图所示:
在CentOS7上配置Marathon+Mesos+Docker实战

使用命令行方式从Mesos-slave主机的data/slave目录中可以查看到这个简单任务的相关信息。

[root@slave latest]# pwd    #查看路径
/home/q/mesos/data/slaves/7b2ad136-917c-4680-b582-71821ab25e9d-S0/frameworks/44c6a533-b607-40b4-9faf-bed151b1a958-0000/executors/tets.7e359839-a1ee-11e8-8161-52540083dae9/runs/latest
[root@slave latest]# ls
stderr  stdout      #标准错误和标准输出信息
[root@slave latest]# cat stdout 
Registered executor on 192.168.126.165
Starting task tets.7e359839-a1ee-11e8-8161-52540083dae9
sh -c 'echo "hello world"'
hello world
Forked command at 6112
Command exited with status 0 (pid: 6112)

3.使用Marathon API的形式添加新任务

[root@slave1 ~]# vim demo.json

{
"id":"basic-0",
"cmd":"while [true]; do echo 'hello Marathon'; sleep 5; done",
"cpus":0.1,
"mem":10.0,
"instances":1
}    

查看Marathon网站有新添加任务

[root@slave1 ~]# curl -X POST -H "Content-type:application/json" http://192.168.126.162:8080/v2/apps -d@demo.json   

启动第二个Mesos-slave节点slave2。在Mesos Web的Slave选项卡中可以看到加入的slave节点相关信息,如图所示:

[root@slave2 ~]# mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.126.162:2181,192.168.126.164:2181,192.168.126.161:2181/mesos --no-hostname_lookup --ip=0.0.0.0

在CentOS7上配置Marathon+Mesos+Docker实战

在Mesos Web首页看到两个slave主机都已经激活,如图所示:
在CentOS7上配置Marathon+Mesos+Docker实战

在Marathon中点击Scale Application扩充16个任务,已经启动的16个任务会发送16个echo消息,由Maarathon随机分发给了slave1与slave2主机,如图所示:
在CentOS7上配置Marathon+Mesos+Docker实战
在CentOS7上配置Marathon+Mesos+Docker实战

4.使用Mesos与Marathon创建Docker群集

使用Marathon API的形式创建Docker的Nginx请求任务。

[root@slave1 ~]# vim nginx.json

{
"id":"/nginx",
"container":{
"type":"DOCKER",
"docker":{
"image":"nginx",
"network":"HOST",
"parameters":[],
"privileged":false,
"forcePullImage":false
}
},
"cpus":0.1,
"mem":32.0,
"instances":1
}

[root@slave1 ~]# curl -X POST -H "Content-type:application/json" http://192.168.126.162:8080/v2/apps -d@nginx.json
{"id":"/nginx","cmd":null,"args":null,"user":null,"env":{},"instances":1,"cpus":0.1,"mem":32,"disk":0,"executor":"","constraints":[],"uris":[],"fetch":[],"storeUrls":[],"ports":[0],"requirePorts":false,"backoffSeconds":1,"backoffFactor":1.15,"maxLaunchDelaySeconds":3600,"container":{"type":"DOCKER","volumes":[],"docker":{"image":"nginx","network":"HOST","privileged":false,"parameters":[],"forcePullImage":false}},"healthChecks":[],"dependencies":[],"upgradeStrategy":{"minimumHealthCapacity":1,"maximumOverCapacity":1},"labels":{},"acceptedResourceRoles":null,"ipAddress":null,"version":"2018-08-17T13:17:51.854Z","tasksStaged":0,"tasksRunning":0,"tasksHealthy":0,"tasksUnhealthy":0,"deployments":[{"id":"89c43c68-c68e-49f8-8e86-c2ffdf5ba65b"}],"tasks":[]}[root@slave1 ~]#

创建好后在Marathon页面中查看,如图所示:
在CentOS7上配置Marathon+Mesos+Docker实战

可以在创建的Nginx任务下看到该任务发送给了192.168.126.165主机(slave1),如图所示:
在CentOS7上配置Marathon+Mesos+Docker实战

用命令行的方式可以查看到现在的slave1主机已经开始下载Docker镜像。

[root@slave1 ~]# ps aux | grep docker
.....//省略
root      12436  0.0  0.2 264156  3912 ?        Sl   21:18   0:00 /usr/bin/docker-containerd-shim-current 7a7592e98a239f380d13393c42f20e1bc9a10359ae1306537eaaa3297b2b1b1f /var/run/docker/libcontainerd/7a7592e98a239f380d13393c42f20e1bc9a10359ae1306537eaaa3297b2b1b1f /usr/libexec/docker/docker-runc-current
root      12533  0.0  0.0 112720   968 pts/2    R+   21:23   0:00 grep --color=auto docker

使用命令行的方式查看Nginx镜像的状态。

[root@slave1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
7a7592e98a23        nginx               "nginx -g 'daemon ..."   9 minutes ago       Up 9 minutes                            mesos-0d58bbf5-30b5-4353-8ea4-7f3ac3cd5ffd-S0.8b3424a2-48b2-460f-abaa-e93c8f963b03

访问运行着的Nginx访问,结果如图所示:
在CentOS7上配置Marathon+Mesos+Docker实战

此时,利用Apache Mesos所管理的Docker的Nginx集群搭建成功。