基于zookeeper+mesos+marathon的docker集群管理平台

· 介绍


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

 

访问页面:

 

原文地址:https://www.cnblogs.com/lanist/p/13356529.html