Docker方式搭建Mesos+Zookeeper+Chronos集群
目录
前言
一、搭建环境说明
二、前期准备工作
三、开始正式搭建
1、安装Zookeeper
2、安装Mesos-master
3、安装Chronos
4、安装Mesos-slave
四、测试
五、关于卸载
前言
本文介绍如何使用Docker方式快速搭建三主一从(本地环境有限,实际生产环境可以最好是三主二从)Mesos+Zookeeper+Chronos定时任务集群。
总体架构图:

一、搭建环境说明
使用VMware12新建4台虚拟机
| 序号 | 虚拟机版本 | IP | 安装 |
| 1 | CentOS7.0 | 192.168.121.66 | Mesos Master1.6.2 + Zookeeper3.5 + Chronos3.0.2 |
| 2 | CentOS7.0 | 192.168.121.67 | Mesos Master1.6.2 + Zookeeper3.5 + Chronos3.0.2 |
| 3 | CentOS7.0 | 192.168.121.70 | Mesos Master1.6.2 + Zookeeper3.5 + Chronos3.0.2 |
| 4 | Ubuntu16.04 | 192.168.121.71 | Mesos Slave1.6.2 |
二、前期准备工作
在4台虚拟机上执行如下命令:
1、关闭防火墙
#临时关闭防火墙
[root@localhost ~]# systemctl stop firewalld
#查看当前防火墙状态
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (dead)#禁止开机启动防火墙
[root@localhost ~]# systemctl disable firewalld
2、关闭 SELinux
#临时关闭SELinux
[root@localhost ~]# setenforce 0
setenforce: SELinux is disabled
#查看当前SELinux状态
[root@localhost ~]# getenforce
Disabled#永久关闭SELinux (CentOS7.0)
[root@localhost ~]# vim /etc/selinux/config
改:7 SELINUX=enforcing #前面的7,表示文档中第7行。方便你查找
为:7 SELINUX=disabled
3、安装 Docker
#CentOS7.0安装Docker
[root@localhost ~]# yum -y install docker#Ubuntu16.04安装Docker
# apt-get update
# apt-get install -y docker.io
4、配置Docker镜像加速器
[root@localhost ~]# vi /etc/docker/daemon.json
{"registry-mirrors": ["$(你自己的镜像加速域名)"]
}#重启docker服务
[root@localhost ~]# sudo systemctl daemon-reload
[root@localhost ~]# sudo systemctl restart docker
三、开始正式搭建
对各组件简单说明:
(1)ZooKeeper
ZooKeeper用于集群的管理,包括统一配置管理,选举Leader等。
(2)Mesos主要由以下几部分组成:
Master: 管理各Slave节点
Slave: 为集群提供资源
Framework: scheduler从Master请求资源,executor在Slave上执行任务
Slave节点上的每个executor是一个容器
(3)Chronos:
Chronos本质上是cron-on-mesos,这是一个用来运行基于容器定时任务的Mesos框架。
1、安装Zookeeper
(1)安装
#在192.168.121.66机器上执行
docker run -d -p 2181:2181 -p 2888:2888 -p 3888:3888 --restart=always --name=zk-master01 --net=host \
-v /opt/zookeeper/logs:/opt/zookeeper/logs \
-v /opt/zookeeper/data:/data \
-v /opt/zookeeper/datalog:/datalog \
-e "ZOO_MY_ID=1" \
-e "ZOO_SERVERS=server.1=0.0.0.0:2888:3888;2181 server.2=192.168.121.67:2888:3888;2181 server.3=192.168.121.70:2888:3888;2181" \
zookeeper:3.5#在192.168.121.67机器上执行
docker run -d -p 2181:2181 -p 2888:2888 -p 3888:3888 --restart=always --name=zk-master02 --net=host \
-v /opt/zookeeper/logs:/opt/zookeeper/logs \
-v /opt/zookeeper/data:/data \
-v /opt/zookeeper/datalog:/datalog \
-e "ZOO_MY_ID=2" \
-e "ZOO_SERVERS=server.1=192.168.121.66:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=192.168.121.70:2888:3888;2181" \
zookeeper:3.5#在192.168.121.70机器上执行
docker run -d -p 2181:2181 -p 2888:2888 -p 3888:3888 --restart=always --name=zk-master03 --net=host \
-v /opt/zookeeper/logs:/opt/zookeeper/logs \
-v /opt/zookeeper/data:/data \
-v /opt/zookeeper/datalog:/datalog \
-e "ZOO_MY_ID=3" \
-e "ZOO_SERVERS=server.1=192.168.121.66:2888:3888;2181 server.2=192.168.121.67:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181" \
zookeeper:3.5
命令说明:
1) 执行 docker run 命令会先从本地镜像中查找是否已有该镜像,如果没有会从镜像仓库中直接下载。
2)参数: -d 后台启动
-p 配置容器和主机端口映射,前面是宿主机端口,后面是容器端口
-v 配置挂载路径,前面是宿主机路径,后面是容器路径
-e 配置容器环境变量
3) Zookeeper3.5 和 Zookeeper3.4的 “ZOO_SERVERS”不同,多了“;2181”,详见官方文档说明
4) 具体Zookeeper的搭建过程可以参考另一篇文章:Docker方式搭建Zookeeper集群
(2)查看
#查看Zookeeper日志(192.168.121.66机器上)
[root@localhost ~]# docker logs zk-master01【这里是容器名称,也可以容器ID】
中间可能会报java.net.ConnectException: Connection refused (Connection refused)
异常,是由于三台机器不是同事启动,可以忽略#进入容器内查看Zookeeper是否正常启动(192.168.121.67机器上)
[root@localhost ~]# docker exec -it zk-master02 bash
root@localhost:/apache-zookeeper-3.5.6-bin# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: leader(表示启动正常,此机器上的Zookeeper是leader)
2、安装Mesos-master
(1)安装
#在192.168.121.66机器上执行
docker run -d --restart=always --name=mesos-master-01 --net=host \
-e MESOS_PORT=5050 \
-e MESOS_HOSTNAME=192.168.121.66 \
-e MESOS_IP=192.168.121.66 \
-e MESOS_ZK=zk://192.168.121.66:2181,192.168.121.67:2181,192.168.121.70:2181/mesos \
-e MESOS_QUORUM=2 \
-e MESOS_REGISTRY=in_memory \
-e MESOS_LOG_DIR=/var/log/mesos \
-e MESOS_WORK_DIR=/var/tmp/mesos \
-v /var/lib/mesos-master/log:/var/log/mesos \
-v /var/lib/mesos-master/tmp:/var/tmp/mesos \
mesosphere/mesos-master:1.6.2;#在192.168.121.67机器上执行
docker run -d --restart=always --name=mesos-master-02 --net=host \
-e MESOS_PORT=5050 \
-e MESOS_HOSTNAME=192.168.121.67 \
-e MESOS_IP=192.168.121.67 \
-e MESOS_ZK=zk://192.168.121.66:2181,192.168.121.67:2181,192.168.121.70:2181/mesos \
-e MESOS_QUORUM=2 \
-e MESOS_REGISTRY=in_memory \
-e MESOS_LOG_DIR=/var/log/mesos \
-e MESOS_WORK_DIR=/var/tmp/mesos \
-v /var/lib/mesos-master/log:/var/log/mesos \
-v /var/lib/mesos-master/tmp:/var/tmp/mesos \
mesosphere/mesos-master:1.6.2;#在192.168.121.70机器上执行
docker run -d --restart=always --name=mesos-master-03 --net=host \
-e MESOS_PORT=5050 \
-e MESOS_HOSTNAME=192.168.121.70 \
-e MESOS_IP=192.168.121.70 \
-e MESOS_ZK=zk://192.168.121.66:2181,192.168.121.67:2181,192.168.121.70:2181/mesos \
-e MESOS_QUORUM=2 \
-e MESOS_REGISTRY=in_memory \
-e MESOS_LOG_DIR=/var/log/mesos \
-e MESOS_WORK_DIR=/var/tmp/mesos \
-v /var/lib/mesos-master/log:/var/log/mesos \
-v /var/lib/mesos-master/tmp:/var/tmp/mesos \
mesosphere/mesos-master:1.6.2;
(2)查看
#查看mesos-master日志
[root@localhost ~]# docker logs mesos-master-01【这里是容器名称,也可以是容器ID】
....前面省略,看到Successfully代表启动成功
I0110 07:03:41.131363 10 registrar.cpp:383] Successfully fetched the registry (0B) in 1.167872ms
I0110 07:03:41.131428 10 registrar.cpp:487] Applied 1 operations in 17783ns; attempting to update the registry
I0110 07:03:41.133059 10 registrar.cpp:544] Successfully updated the registry in 1.609984ms
I0110 07:03:41.133093 10 registrar.cpp:416] Successfully recovered registrar
I0110 07:03:41.133174 10 master.cpp:1825] Recovered 0 agents from the registry (145B); allowing 10mins for agents to reregister
(3)访问测试

3、安装Chronos
(1)安装
#在192.168.121.66机器上执行
docker run -d --restart=always --name=chronos-01 --net=host \
-e PORT0=4400 \
-e PORT1=4401 \
mesosphere/chronos:v3.0.2 \
--hostname 192.168.121.66 \
--master zk://192.168.121.66:2181,192.168.121.67:2181,192.168.121.70:2181/mesos \
--zk_hosts zk://192.168.121.66:2181,192.168.121.67:2181,192.168.121.70:2181#在192.168.121.67机器上执行
docker run -d --restart=always --name=chronos-02 --net=host \
-e PORT0=4400 \
-e PORT1=4401 \
mesosphere/chronos:v3.0.2 \
--hostname 192.168.121.67 \
--master zk://192.168.121.66:2181,192.168.121.67:2181,192.168.121.70:2181/mesos \
--zk_hosts zk://192.168.121.66:2181,192.168.121.67:2181,192.168.121.70:2181#在192.168.121.70机器上执行
docker run -d --restart=always --name=chronos-03 --net=host \
-e PORT0=4400 \
-e PORT1=4401 \
mesosphere/chronos:v3.0.2 \
--hostname 192.168.121.70 \
--master zk://192.168.121.66:2181,192.168.121.67:2181,192.168.121.70:2181/mesos \
--zk_hosts zk://192.168.121.66:2181,192.168.121.67:2181,192.168.121.70:2181
(2)查看
#查看Chronos启动日志(启动可能会比较慢)
[root@localhost ~]# docker logs chronos-01 【这里是容器名称,也可以是容器ID】
...前面省略
2020-01-10 07:18:22.264:INFO:oejsh.ContextHandler:HttpService STARTING: Started o.e.j.s.ServletContextHandler@180a25b8{/,null,AVAILABLE}
2020-01-10 07:18:22.278:INFO:oejs.ServerConnector:HttpService STARTING: Started ServerConnector@132df861{HTTP/1.1,[http/1.1]}{0.0.0.0:4400}
2020-01-10 07:18:22.278:INFO:oejs.Server:HttpService STARTING: Started @22572ms
07:18:22.281 [main] INFO org.apache.mesos.chronos.scheduler.Main$ - All services up and running.
07:18:33.628 [main-SendThread(192.168.121.67:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x200002d4b2e0005 after 0ms
07:18:46.967 [main-SendThread(192.168.121.67:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x200002d4b2e0005 after 0ms
(3)访问测试
在Mesos Framework中可以看到Active Frameworks的列表里面有Chronos

也可以直接通过ip + 端口号也可以访问到Chronos

4、安装Mesos-slave
(1)安装
#在192.168.121.71机器上执行
docker run -d --restart=always --name=mesos-slave-01 --pid=host --net=host --privileged \-e MESOS_PORT=5051 \-e MESOS_MASTER=zk://192.168.121.66:2181,192.168.121.67:2181,192.168.121.70:2181/mesos \-e MESOS_SWITCH_USER=0 \-e MESOS_CONTAINERIZERS=docker,mesos \-e MESOS_LOG_DIR=/var/log/mesos \-e MESOS_WORK_DIR=/var/tmp/mesos \-e MESOS_HOSTNAME=192.168.121.71 \-e MESOS_IP=192.168.121.71 \-v /var/lib/mesos-slave/log:/var/log/mesos \-v /var/lib/mesos-slave/tmp:/var/tmp/mesos \-v /var/run/docker.sock:/var/run/docker.sock \-v /cgroup:/cgroup \-v /sys:/sys \-v /run:/run \-v /usr/local/bin/docker:/bin/docker \mesosphere/mesos-slave:1.6.2;说明:添加 “--pid=host” 参数是为了清理僵尸进程
(2)查看
#查看mesos-slave启动日志
# docker logs mesos-slave-01【这里是容器名称,也可以是容器ID】
...前面省略
I0110 07:25:00.915324 7 slave.cpp:1492] Registered with master master@192.168.121.66:5050; given agent ID 6be11dad-35b2-41b2-a15e-1220339e62ff-S0
I0110 07:25:00.918725 6 task_status_update_manager.cpp:188] Resuming sending task status updates
I0110 07:25:01.044843 7 slave.cpp:1561] Forwarding agent update {"operations":{},"resource_version_uuid":{"value":"abcO1x4pTSqBhhTRD5aI1Q=="},"slave_id":{"value":"6be11dad-35b2-41b2-a15e-1220339e62ff-S0"},"update_oversubscribed_resources":true}
(3)访问测试
在Mesos首页可以看到Resources中的资源数量

在Mesos的Agents中也可以看到新添加的从机(Agent其实就是Slave)
到此全部的安装工作就已经完成了。
下面开始进行测试。
四、测试
在Chronos页面点击ADD JOB,添加一个任务
时间是UTC格式,这里简单输出一个hello,也可以写一个定时任务(eg: while true; do echo hello mesos; sleep 10;done;)。

等到指定时间后自动执行任务。

运行success后可以在mesos主页Completed Tasks列表中看到完成的任务。

五、关于卸载
以下是关于卸载的操作(仅限本地测试环境,实际开发中慎用):
#强制删除所有运行中的镜像(慎用)
docker rm -f $(docker ps -qa)#删除所有挂载目录(根据自己设置的目录调整)
#三台Master机器上
rm -rf /opt/zookeeper
rm -rf /var/lib/mesos-master
#Slave机器上
rm -rf /var/lib/mesos-slave
总结:本次只是记录了如何使用Docker搭建Mesos + Zookeeper + Chronos 集群,并没有具体解释其中的工作机制和内部原理,另外,因为没有使用到Marathon相关的服务,所以这里也没有安装Marathon。使用Docker方式使搭建Mesos变得方便,使用Mesos又使管理Docker集群变得简单。
参考地址:
Docker系列之(二):使用Mesos管理Docker集群(Mesos + Marathon + Chronos + Docker):https://www.cnblogs.com/ee900222/p/docker_2.html
Mesos+Marathon+zk+docker构建PaaS平台:https://blog.51cto.com/linuxzkq/2131961
Docker Hub:https://hub.docker.com/_/zookeeper 、https://hub.docker.com/r/mesosphere/mesos-master
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
