前言
本教程参考
http://blog.51cto.com/11863547/1903532
http://blog.51cto.com/11863547/1903532
官方文档等...
系统:centos7
软件包:RPM
mes架构
架构图可以看出mesos主要两部分主和从 ,集群依靠zookeeper
mesos运行流程
运行流程是,Agent1向 mesos master注册,mesos master向Framework 1报告有哪些资源,Framework 1 告诉mesos master有两个任务运行(taks1,task2) ,mesos master向
Agent 1提交任务执行。后面就按照这套逻辑循环.
安装
一、环境
1、配置三台服务器,三个mesos-master节点,三个slave节点,我用测试IP
主机名 | IP地址 | 所安装的服务 |
mesos-node1 | eth0:192.168.10.227 | mesos-master,mesos-slave,marathon, zookeeper,haproxy |
mesos-node2 | eth0:192.168.10.228 | mesos-master,mesos-slave,marathon,zookeeper,haproxy |
mesos-node3 | eth0:192.168.10.229 | mesos-master,mesos-slave,marathon,zookeeper,haproxy |
注意以下部分在三台服务器上都要执行
3、关闭SELinux
【临时】
1
2
3
|
[root@mesos-node1 ~]]
# setenforce 0
[root@mesos-node1 ~]]
# getenforce
Permissive
|
【永久】
更改配置文件/etc/selinux/config 将SELINUX=enforcing修改为SELINUX=disabled重启生效,如果不想重启就将上面临时修改的也执行一次。
4、关闭防火墙
1
|
systemctl stop firewalld
|
5、配置host解析
1
2
3
4
5
6
7
|
[root@mesos-node1 ~]
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.227 mesos-node1
192.168.10.228 mesos-node2
192.168.10.229 mesos-node3
[root@mesos-node1 ~]
#
|
二、部署docker
1、利用yum安装docker
1
|
yum
install
docker
|
2、启动docker
1
|
systemctl start docker.service
|
3、加入开机自启动服务
1
|
systemctl
enable
docker.service
|
4、创建docker用户组,避免使用sudo
1
|
usermod
-aG docker lcm
|
三 、部署zookeeper
1、安装Java
1
|
yum
install
-y java
|
2、查看Java版本
1
2
3
4
5
|
[root@mesos-node1 ~]
# java -version
openjdk version
"1.8.0_121"
#<=====OpenJDK1.8
OpenJDK Runtime Environment (build 1.8.0_121-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)
[root@mesos-node1 ~]
#
|
3、进入源码安装目录下载zookeeper稳定版3.4.9并安装
1
2
3
4
|
cd
/usr/local/src/
wget http:
//mirrors
.cnnic.cn
/apache/zookeeper/stable/zookeeper-3
.4.9.
tar
.gz
tar
xf zookeeper-3.4.9.
tar
.gz
mv
zookeeper-3.4.9
/usr/local/
|
4、创建软连接,方便以后升级时用
1
|
ln
-s
/usr/local/zookeeper-3
.4.9/
/usr/local/zookeeper
|
5、修改zookeeper配置文件,只修改一个,然后分发到其他两台上
1
2
3
4
5
6
7
8
9
10
11
12
13
|
cd
/usr/local/zookeeper/conf
mv
zoo_sample.cfg zoo.cfg
[root@mesos-node1 ~]
# grep "^[a-z]" zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=
/usr/local/zookeeper/data
dataLogDir=
/usr/local/zookeeper/logs
clientPort=2181
server.1=mesos-node1:2888:3888
server.2=mesos-node2:2888:3888
server.3=mesos-node3:2888:3888
[root@mesos-node1 ~]
#
|
6、创建dataDir和dataLogDir目录
1
|
mkdir
-p
/usr/local/zookeeper/data
/usr/local/zookeeper/logs
|
7、在三台服务器上创建myid文件,里面的数据要和配置文件里面的server.后面的数字一样,表示这是第几台服务器
1
2
3
|
echo
"1"
>
/usr/local/zookeeper/data/myid
echo
"2"
>
/usr/local/zookeeper/data/myid
echo
"3"
>
/usr/local/zookeeper/data/myid
|
8、启动zookeeper
1
2
|
cd
/usr/local/zookeeper
.
/bin/zkServer
.s start
|
9、查看角色状态
1
|
.
/bin/zkServer
.sh status
|
可以看到两个follower,一个 leader
10、尝试连接zookeeper
1
2
3
4
5
|
.
/bin/zkCli
.sh
#<=====连接当前zookeeper
.
/bin/zkCli
.sh -server 192.168.10.228:2181
#<======连接远程zookeeper
[zk: 192.168.10.228:2181(CONNECTED) 0]
ls
/
#<======可以用ls /查看
[zookeeper]
[zk: 192.168.10.228:2181(CONNECTED) 1]
|
OK,zookeeper安装成功,接下来安装mesos
三、mesos+marathon集群部署
1、安装mesosphere仓库
1
|
rpm -ivh http:
//repos
.mesosphere.com
/el/7/noarch/RPMS/mesosphere-el-repo-7-1
.noarch.rpm
|
2、安装mesos和marathon
1
|
yum -y
install
mesos marathon
|
3、增加zookeeper配置
1
2
3
|
[root@mesos-node1 ~]
# cat /etc/mesos/zk
zk:
//192
.168.10.227:2181,192.168.10.228:2181,192.168.10.229:2181
/mesos
[root@mesos-node1 ~]
#
|
4、配置mesos-hostname
1
2
3
4
5
|
echo
本地IP地址 |
tee
/etc/mesos-master/ip
echo
本地IP地址 |
tee
/etc/mesos-master/hostname
echo
本地IP地址 |
tee
/etc/mesos-slave/ip
echo
本地IP地址 |
tee
/etc/mesos-slave/hostname
echo
2 >
/etc/mesos-master/quorum
#这个数字要大于安装的master节点的总数的0.5倍,即一半
|
5、配置mesos-master slave marathon开机自启动并启动
1
2
|
systemctl
enable
mesos-master mesos-slave marathon
systemctl start mesos-master mesos-slave marathon
|
注意:此处我是复制的别人的,因l懒得写了.这里的marathon是没法启动的,因为配置文件没有指定mesos的 master和 zookeeper,
方法1:
打开vi /usr/lib/systemd/system/marathon.service
修改红色部分,master后面填mesos节点,--zk参数和上面的一样 zk:
//192
.168.10.227:2181,192.168.10.228:2181,192.168.10.229:2181
/meso
,这里我用的单机测试,所以不一样.
自己根据环境,做调整.
[Service]
Type=simple
WorkingDirectory=/usr/share/marathon
EnvironmentFile=/etc/default/marathon
ExecStart=/usr/share/marathon/bin/marathon --master 192.168.0.233:5050 --zk zk://192.168.0.233:2181/marathon
方法2:
针对marathon1.5
vi /etc/default/marathon
MARATHON_MASTER=zk://192.168.0.233:2181/mesos
MARATHON_ZK=zk://192.168.0.233:2181/marathon
或者直连
MARATHON_MASTER=192.168.0.233:5050
这样修改后,marathon就能启动成功了。如果还是不行,查看 /var/log/message 日志.
6、在浏览器打开任意一台服务的mesos
1
|
http:
//192
.168.10.227:5050/
|
7、如果出现下面的界面,安装成功
8、运行一个mesos任务来测试
1
2
|
MASTER=$(mesos-resolve `
cat
/etc/mesos/zk
`)
#<=====获取主服务器的IP地址
mesos-execute --master=$MASTER --name=
"cluster-test"
--
command
=
"sleep 60"
#如果没有发现任务在运行,可尝试修改--name="cluster-test",这个名字可以随意起
|
9、打开浏览器查看
至此环境已经搭建成功
二、测试,尝试管理一个docker镜像
注意,以下内容没有特别说明可在任意一台服务上完成,我选择在227
1、在docker中下载一个nginx镜像
1
|
docker pull nginx
|
2、在所有mesos-slave上增加配置参数,并重启(这一步在三台服务上面进行操作)
1
2
|
echo
'docker,mesos'
|
tee
/etc/mesos-slave/containerizers
systemctl restart mesos-slave
|
#配置超时(可选) echo '5mins' > /etc/mesos-slave/executor_registration_timeout
3、在浏览器中打开marathon,默认端口8080
1
|
http:
//192
.168.10.227:8080
|
下面通过Mesos调度,使用marathon来创建一个nginx镜像的Docker容器,Marathon启动时会读取/etc/mesos/zk配置文件,Marathon通过Zookeeper来找到Mesos Master。
4、创建nginx配置文件nginx.json,注意红色部分,根据自己环境修改,如果不明白,删除红色部分.红色部分是指明在那台机器部署
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@mesos-node1 ~]
# cat nginx.json
{
"id"
:
"nginx"
,
"cmd"
: null,
"cpus"
:0.2,
"mem"
:32.0,
"instances"
: 1,
"constraints" : [[ "hostname" ,
"UNIQUE" , "" ]],
"container"
: {
"type"
:
"DOCKER"
,
"docker"
: {
"image"
:
"nginx"
,
"network"
:
"BRIDGE"
,
"portMappings"
: [
{
"containerPort"
: 80,
"hostPort"
: 0,
"servicePort"
: 0,
"protocol"
:
"tcp"
}
]
}
}
}
[root@mesos-node1 ~]
#
|
5、利用curl的方式开启nginx容器
1
|
curl -X POST http:
//192
.168.10.227:8080
/v2/apps
-d@
/root/nginx
.json -H
"Content-type:application/json"
|
6、查看开启的容器
1
2
3
|
[root@mesos-node1 ~]
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5175ef6c9dde nginx
"nginx -g 'daemon off"
About a minute ago Up Abo
|
7、在浏览器中查看
但是我们可以发现,只能227这台服务器来访问这个端口,出现nginx页面,用其他的IP地址显然是不可以的.
so,接下来我们就来配置服务发现,设置一个固定端口,实现让每个IP地址都可以访问到这个页面。
注意:marathon生成的外部端口是随机的,在marathon的ui界面查看,或docker ps命令
四、服务发现和haproxy
以下操作在三台服务上都有
1、安装haproxy
1
|
yum -y
install
haproxy
|
2、设置服务发现
1
2
3
4
|
mkdir
-p
/etc/marathon/conf
cp
/etc/mesos/zk
/etc/marathon/conf/master
cp
/etc/marathon/conf/master
/etc/marathon/conf/zk
sed
-i
's|mesos|marathon|g'
/etc/marathon/conf/zk
|
注意:
上面是marathon1.5版本前的设置,
最新版设置方法
vi /etc/default/marathon
MARATHON_MASTER=zk://192.168.0.233:2181/mesos
MARATHON_ZK=zk://192.168.0.233:2181/marathon
3、设置文件/etc/haproxy-marathon-bridge/marathons
1
2
3
4
5
6
|
mkdir
/etc/haproxy-marathon-bridge/
[root@mesos-node1 conf]
# cat /etc/haproxy-marathon-bridge/marathons
192.168.10.227:8080
192.168.10.228:8080
192.168.10.229:8080
[root@mesos-node1 conf]
#
|
4、下载安装脚本 haproxy-marathon-bridge
https://github.com/maricaantonacci/haproxy-marathon-bridge
5、添加执行权限
1
|
chmod
+x
/etc/init
.d
/haproxy-marathon-bridge
|
6、通过 haproxy-marathon-bridge脚本从Marathon生成一个HAProxy配置在localhost:8080运行:
1
|
.
/haproxy-marathon-bridge
192.168.10.227:8080 >
/etc/haproxy/haproxy
.cfg
|
7、将haproxy加入开机自启动并启动
1
2
|
systemctl start haproxy
systemctl
enable
haproxy
|
8、开启haproxy的定时任务,每一分钟加入一次任务。
1
|
/etc/init
.d
/haproxy-marathon-bridge
install_cronjob
|
9、查看nginx.json文件,注意红色部分,上面有说明.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@mesos-node1 ~]
# cat nginx.json
{
"id"
:
"nginx"
,
"cmd"
: null,
"cpus"
:0.2,
"mem"
:32.0,
"instances"
: 1,
"constraints" : [[ "hostname" ,
"UNIQUE" , "" ]],
"container"
: {
"type"
:
"DOCKER"
,
"docker"
: {
"image"
:
"nginx"
,
"network"
:
"BRIDGE"
,
"portMappings"
: [
{
"containerPort"
: 80,
"hostPort"
: 0,
"servicePort"
: 3030,
"protocol"
:
#此处我设置了固定的端口,这个端口可以按照自己公司的要求来随意设定。
"tcp"
}
]
}
}
}
[root@mesos-node1 ~]
#
|
用curl -X POST http:
//192
.168.10.227:8080
/v2/apps
-d@
/root/nginx
.json -H
"Content-type:application/json" 提交下任务
可以看到服务发现自动生成了这个访问端口,将它映射在随机生成的端口上,至此我们就可以用任意一台的IP地址来访问这个端口了。
11.通过haproxy的ui界面查看服务开放的状态
总结
重启电脑,需按照顺序启动, zookeeper systemctl start mesos-master mesos-slave marathon haproxy
有什么问题,留言吧。