· 介绍
mesos是什么?
Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核。Mesos能够在同样的集群机器上运行多种分布式系统类型,更加动态有效率低共享资源。提供失败侦测,任务发布,任务跟踪,任务监控,低层次资源管理和细粒度的资源共享,可以扩展伸缩到数千个节点。Mesos已经被Twitter用来管理它们的数据中心。
Mesos中的基本术语解释:
1)Mesos-master:主要负责管理各个framework和slave,并将slave上的资源分配给各个framework
2)Mesos-slave:负责管理本节点上的各个mesos-task,比如:为各个executor分配资源
3)Framework:计算框架,如:Hadoop,Spark等,通过MesosSchedulerDiver接入Mesos
4)Executor:执行器,安装到mesos-slave上,用于启动计算框架中的task。
Zookeeper是什么?
ZooKeeper是用来给集群服务维护配置信息,域名服务,提供分布式同步和提供组服务。所有这些类型的服务都使用某种形式的分布式应用程序。ZooKeeper是一个分布式的,开放源码的协调服务,是的Chubby一个的实现,是Hadoop和Hbase的重要组件。
ZooKeeper角色:
领导者(leader):领导者负责投票发起和决议,更新系统状态
跟随者(follwoer):follower用于接收客户请求并向客户端返回结果,在选主过程中参与投票
观察者:ObServer可以接受客户端连接,将写请求转发给leader节点,但ObServer不参加投票过程,只同步leader的状态,ObServer的目的是为了拓展系统,提高读取速度。
客户端:请求发起方
ZooKeeper同步流程:
选完leader以后,zookeeper就进入状态同步过程。
1)leader等待server连接;
2)Follower连接leader,将最大的zxid发送给leader;
3)Leader根据follower的zxid确定同步点;
4)完成同步后通知follower 已经成为uptodate状态;
5)Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。
mararthon是什么?
Marathon是一个成熟的,轻量级的,扩展性很强的Apache Mesos的容器编排框架,它主要用来调度和运行常驻服务(long-running service),提供了友好的界面和Rest API来创建和管理应用。marathon是一个mesos框架,能够支持运行长服务,比如web应用等,它是集群的分布式Init.d,能够原样运行任何Linux二进制发布版本,如Tomcat Play等等,可以集群的多进程管理。也是一种私有的Pass,实现服务的发现,为部署提供提供REST API服务,有授权和SSL、配置约束,通过HAProxy实现服务发现和负载平衡。
1.环境部署(因为配置有限,此操作使用了2台虚拟机)
IP |
描述 |
192.168.253.55 |
Mesos-master mesos-slave marathon docker |
192.168.253.55 |
Zookeeper mesos-slave docker |
备注:Zookeeper使用伪分布式部署,也就是一台虚拟机上启动三个不同端口的Zookeeper实例 |
基本框架
1.1同步时间
yum -y install ntp ntpdate
ntpdate cn.pool.ntp.org
hwclock --systohc
1.2关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
1.3关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
1.4创建工作目录
mkdir /data
2. 官网地址
Mesos:http://mesos.apache.org/
Marathon:https://mesosphere.github.io/marathon/
3.jdk安装(三个节点都要执行)
3.1解压jdk1.8
tar zxf jdk-8u161-linux-x64.tar.gz -C /data/ cd /data mv jdk1.8.0_161/ jdk`
3.2配置环境变量
vim /etc/profile
export JAVA_HOME=/data/jdk
export JRE_HOME=/data/jdk/jre
export PATH=$PATH:/data/jdk/bin
export CLASSPATH=./:/data/jdk/lib:/data/jdk/jre/lib
source /etc/profile`
3.3测试是否成功
4. 安装zookeeper(192.168.253.56)
4.1解压
tar xzf apache-zookeeper-3.6.1-bin.tar.gz -C /data
cd /data
mv apache-zookeeper-3.6.1-bin zookeeper
4.2修改配置文件
cd /data/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
[root@localhost conf]# vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
maxClientCnxns=200
dataDir=/data/zookeeper/data/zk1
clientPort=2181
server.1=192.168.253.56:3181:4181
server.2=192.168.253.56:3182:4182
server.3=192.168.253.56:3183:4183
4.3创建三个目录存放zookeeper数据
mkdir -p /data/zookeeper/data/{zk1,zk2,zk3}
4.4 创建myid文件
echo 1 >/data/zookeeper/data/zk1/myid
echo 2 >/data/zookeeper/data/zk2/myid
echo 3 >/data/zookeeper/data/zk3/myid
4.5 生成三份zookeeper配置文件
cd /data/zookeeper/conf/
cp zoo.cfg zk1.cfg
cp zoo.cfg zk2.cfg
cp zoo.cfg zk3.cfg
4.6 修改zk2,zk3对应的数据存放目录以及端口
sed -i 's#zk1#zk2#g' zk2.cfg #修改数据存放目录
sed -i 's#zk1#zk3#g' zk3.cfg
sed -i 's#2181#2182#g' zk2.cfg #修改客户端端口
sed -i 's#2181#2183#g' zk3.cfg
4.7 zookeeper角色查看
4.7.1 启动zookeeper
/data/zookeeper/bin/zkServer.sh start /data/zookeeper/conf/zk1.cfg
/data/zookeeper/bin/zkServer.sh start /data/zookeeper/conf/zk2.cfg
/data/zookeeper/bin/zkServer.sh start /data/zookeeper/conf/zk3.cfg
4.7.2 查看集群状态
/data/zookeeper/bin/zkServer.sh status /data/zookeeper/conf/zk1.cfg
/data/zookeeper/bin/zkServer.sh status /data/zookeeper/conf/zk2.cfg
/data/zookeeper/bin/zkServer.sh status /data/zookeeper/conf/zk3.cfg
5. mesos集群部署
192.168.253.55,192.168.253.56
5.1 安装mesos
yum install mesos-1.9.0-2.0.1.el7.x86_64.rpm -y
5.2 增添zookeeper配置
cd /etc/mesos
vim zk
zk://192.168.253.56:2181,192.168.253.56:2182,192.168.253.56:2183/mesos
5.3 192.168.253.55
5.3.1 mesos-master配置
cd /etc/mesos-master
echo 192.168.253.55 > ip
echo 192.168.253.55 > hostname
echo 1 > quorum #这个数字要大于安装的master节点的总数的一半
work_dir为默认
5.3.2 mesos-slave配置
cd /etc/mesos-slave/
echo 192.168.253.55 > ip
echo 192.168.253.55 > hostname
work_dir为默认
5.3.3 安装marathon
tar zxf marathon-1.5.1.tgz
mv marathon-1.5.0-96-gf84298d/ /data/marathon
5.3.4 启动mesos-master mesos-slave marathon
systemctl start mesos-master mesos-slave
systemctl enable mesos-master mesos-slave #设为开机自启
/data/marathon/bin/marathon --master zk://192.168.253.56:2181,192.168.253.56:2182,192.168.253.56:2183/mesos --zk zk://192.168.253.56:2181,192.168.253.56:2182,192.168.253.56:2183/marathon
5.3.5 浏览器访问
Mesos
Marathon
5.4 192.168.253.56
5.4.1 mesos-slave配置
cd /etc/mesos-slave/
echo 192.168.253.56 > ip
echo 192.168.253.56 > hostname
work_dir为默认
5.4.2 启动mesos-slave
systemctl start mesos-slave
systemctl enable mesos-slave
6. marathon调用mesos运行docker(192.168.253.55,192.168.253.56)
6.1 解压docker
tar zxf docker-18.06.3-ce.tgz
mv docker /data
6.2 把命令拷贝到/usr/bin
cd /data/docker
cp ./* /usr/bin
6.3 创建docker家目录
mkdir /home/docker
6.4 启动docker
dockerd -g /home/docker &
6.5 查看进程
ps -ef |grep docker
6.6 拉取nginx
docker pull nginx
6.7 在mesos-slave上增加配置参数,并重启
echo 'docker,mesos' | tee /etc/mesos-slave/containerizers
systemctl restart mesos-slave
7. 测试
7.1 运行mesos任务,可以在web界面上查看task:
MASTER=$(mesos-resolve `cat /etc/mesos/zk`)
mesos-execute --master=$MASTER --name="cluster-test" --command="sleep 60"
7.2 marathon测试
浏览器输入:http://192.168.253.55:8080/
创建一个first的任务
然后去mesos网页查看:http://192.168.253.55:5050/
可以看到任务已经分配给slave1(192.168.253.55) 和slave2(192.168.253.56)
点击
7.2.1 查看执行时间相关信息
Id根据实际情况查看
cd /var/lib/mesos/slaves/167b7f7c-1441-4755-ab15-ee6c33486c98-S0/frameworks/c3d564b2-6b6b-4468-b467-b413f61b9180-0001/executors
cd first.2e24d54e-cb1c-11ea-abb0-0242467fbcb0/runs/latest/
#标准错误和标准输出信息
stderr
#查看输出字符串
stdout
7.3 marathon通过API创建一个nginx的docker容器
下面通过Mesos调度,使用marathon来创建一个nginx镜像的Docker容器,Marathon启动时会读取/etc/mesos/zk配置文件,Marathon通过Zookeeper来找到Mesos Master。
#在marathon服务所在节点创建json文件;
7.3.1 写json文件
vim nginx.json
{ "id":"nginx-first", #容器名,只在marathon生效 "cpus":0.2, #cpu用量 "mem":20.0, #mem用量 "instances": 1, #容器数量 "constraints": [["hostname", "UNIQUE",""]], #限制 "container": { "type":"DOCKER", #应用类型 "docker": { #docker具体配置 "image": "nginx", #采用的image "network": "BRIDGE", #网络模式 "portMappings": [ {"containerPort": 80, "hostPort": 0,"servicePort": 0, "protocol": "tcp" } ]}#端口映射,”0”表示任意端口,"servicePort"服务端口 } }
7.3.2 curl方式调用
curl -X POST http://192.168.253.55:8080/v2/apps -d @/root/nginx.json -H "Content-type: application/json"
7.3.3 查看容器是否存在(此处有一个容器就证明成功,我这里执行了两遍curl,所以出现两个容器)
192.168.253.55
192.168.253.56
访问页面: