Apache Mesos 是一个分布式系统的管理软件,对集群的资源进行分配和管理。
Mesos主要由以下几部分组成:
Master: 管理各Slave节点
Slave: 为集群提供资源
Framework: scheduler从Master请求资源,executor在Slave上执行任务
Slave节点上的每个executor是一个容器
官方文档:
http://mesos.apache.org/documentation/latest/architecture/
http://mesos.apache.org/documentation/latest/getting-started/
Mesos主服务器使用Zookeeper进行服务选举和发现。它有一个注册器记录了所有运行任何和从服务器信息,使用MultiPaxos进行日志复制实现一致性。
Mesos有一个从服务器恢复机制,无论什么时候一个从服务器死机了,用户的任务还是能够继续运行,从服务器会将一些关键点信息如任务信息 状态更新持久化到本地磁盘上,重新启动时可以从磁盘上恢复运行这些任务(类似Java中的钝化和唤醒)
Marathon 是Mesos的一个Framework,用来执行需要长时间运行的任务。如果把Mesos比喻成Kernel的话,那么Marathon就是它的守护进程Daemon。
它还具备HA,Health Checks,服务发现等功能。如果某个Docker进程崩溃,Marathon会重新启动同样的进程。
Chronos本质上是cron-on-mesos,这是一个用来运行基于容器定时任务的Mesos框架。
ZooKeeper用于集群的管理,包括统一配置管理,选举Leader等。
本次测试环境的构成如下:
Mesos Master: test166
Mesos Slave: test166,test167
Marathon: test166
Chronos: test166
ZooKeeper: test166
在所有机器上,安装Mesos源
1
|
# rpm -Uvh http://repos.mesosphere.io/el/7/noarch/RPMS/mesosphere-el-repo-7-1.noarch.rpm
|
在所有机器的/etc/hosts中,指定主机名
1
2
3
|
# vi /etc/hosts
10.86.255.166 test166
10.86.255.167 test167
|
1
|
# yum install mesos marathon chronos mesosphere-zookeeper
|
如果服务器上之前装过jdk,升级到最新版本
本次配置的Master是单节点环境,ZooKeeper也是单点
1
2
|
# vi /etc/mesos/zk
zk: //test166 :2181 /mesos
|
1
2
3
4
|
# systemctl start zookeeper
# systemctl start mesos-master
# systemctl start marathon
# systemctl start chronos
|
1
|
# yum install mesos docker
|
1
2
|
# echo 'docker,mesos' > /etc/mesos-slave/containerizers
# echo '5mins' > /etc/mesos-slave/executor_registration_timeout
|
1
2
|
# vi /etc/mesos/zk
zk: //test166 :2181 /mesos
|
1
2
|
# systemctl start docker
# systemctl start mesos-slave
|
Mesos的页面
http://10.86.255.166:5050/
Marathon的页面
http://10.86.255.166:8080/
Chronos的页面
http://10.86.255.166:4400/
在Mesos Slave页面,可以看到两个Slave
1
|
# ./src/examples/python/test-framework 10.86.255.166:5050
|
用nc命令启动一个HTTP服务
1
|
# yum install nmap-ncat
|
command: while true; do ( echo "HTTP/1.0 200 Ok"; echo; echo "Hello World" ) | nc -l $PORT; done
可以看到任务分布在两个节点上,访问HTTP服务启动的端口
test166:
test167:
注意:时间是UTC时间
启动Docker,抓取ubuntu镜像,date命令输出当前时间
任务Deploying的时候,从docker.io抓取镜像,抓取下来后,开始Running。
如果抓取镜像的时间过长,失败的时候,可以先用docker pull命令在节点上抓取镜像后,再执行任务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# vi marathon-test.json
{
"container" : {
"type" : "DOCKER" ,
"docker" : {
"image" : "libmesos/ubuntu"
}
},
"id" : "ubuntu-marathon" ,
"instances" : 2,
"cpus" : 0.5,
"mem" : 256,
"uris" : [],
"cmd" : "while sleep 10; do date -u +%T; done"
}
|
1
|
# curl -X POST -H "Content-Type: application/json" http://test166:8080/v2/apps [email protected]
|
1
|
# docker ps
|
1
|
# docker logs CONTAINER_ID
|
启动Docker,抓取nginx镜像,启动nginx容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# vi chronos-test.json
{
"container" : {
"type" : "DOCKER" ,
"image" : "nginx" ,
"network" : "BRIDGE"
},
"schedule" : "R\/2015-12-20T07:30:00Z\/PT2M" ,
"name" : "chronos-nginx" ,
"cpus" : "0.5" ,
"mem" : "256" ,
"uris" : [],
"command" : "/usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf"
}
|
network": "BRIDGE",因为Docker默认的网络模式是桥接,不指定默认也是BRIDGE
1
|
# curl -L -H "Content-Type: application/json" -X POST [email protected] http://test166:4400/scheduler/iso8601
|
本次是测试,所以在Chronos的任务页面,点击「Force Run」强制执行
1
|
# docker ps
|
Mesos, Marathon 使得 Docker集群的管理变得简单方便,为在生产环境部署使用Docker集群提供了可能。