软件包 链接:https://pan.baidu.com/s/1TpEHLGkVX4-MNuIbHBaKng 提取码:p3fg

工具 特点 优势
Apache Mesos 需要独立部署mesos-slave进程;依赖framework的功能可以管理docker容器;成本高 因为经过了许多互联网公司的大规模实践,稳定性具有保障
Docker Swarm Docker官方集群管理工具,需要Docker daemon启用tcp端口;Swarm的命令兼容Docker;学习成本非常低 公有云环境Machine和Swarm搭配使用效率更高
Google Kubernetes 完全Docker化的管理工具,功能迭代非常快;集群管理能力比Mesos稍差 功能模块集成度高

 使用Mesos管理Docker   Apache Mesos是一个集群管理器,可跨分布式应用程序或框架提供有效的资源隔离和共享。它位于应用程序层和操作系统之间,可以更加轻松地在大规模集群环境中更有效地部署和管理应用程序。它可以在动态共享节点池上运行许多应用程序 Apache Mesos将CPU,内存,存储和其他计算资源从机器(物理或虚拟)中抽象出来,使容错和弹性分布式系统能够轻松构建并有效运行。   

     实验环境:

master1 192.168.80.100 jdk、marathon、mesos、zookeeper
master2 192.168.80.101 jdk、mesos、zookeeper
master3 192.168.80.102 jdk、mesos、zookeeper
slave1 192.168.80.103 jdk、mesos、docker
slave2 192.168.80.104 jdk、mesos、docker
Mesos是什么呢,可以用这样一个例子进行说明。假定某公司需要频繁进行大数据计算,该任务运行时需要N多个CPU和内存,为了满足这个需求,有两种方案:
1.使用小型服务器,为任务提供足够的资源。
2.采用分布计算,即提供一批普通配置的机器,组成集群,将计算任务拆分到各个机器上计算,然后汇总结果。
Mesos就是实现这类分布式计算的框架,在分布式计算过程中,Mesos会对上述计算机资源进行管理和分配。
 
Marathon按照官方的说法是基于Mesos的私有PaaS,它实现了Mesos的Framework。Marathon实现了服务发现和负载平衡、为部署提供REST API服务、授权和SSL、配置约束等功能。Marathon支持通过Shell命令和Docker部署应用。提供Web界面、支持cpu/mem、实例数等参数设置,支持单应用的Scale,但不支持复杂的集群定义。Marathon能够支持运行长服务,比如Web应用等。Marathon能够原样运行任何Linux二进制发布版本,比如Tomcat Play等。
 
Mesos和Marathon的关系
如果将Mesos类比为操作系统的内核,负责资源调度。则Marathon可以类比为服务管理系统,比如init,systemd或upstart等系统,用来管理应用的状态信息。Marathon将应用程序部署为长时间运行的Mesos任务。
 
 
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
 
 
 
这里部属的机器为3个Master控制节点,2个slave运行节点,其中:
 
zookeeper、Mesos-master、marathon运行在Master端;Mesos-slave和docker运行在Slave端;需要修改zk的内容来保证slave能够被发现和管理
 
构建环境
 
配置mesos-master(3台master节点都要操作)
 
hostnamectl   set-hostname     master1
hostnamectl   set-hostname     master2
hostnamectl   set-hostname     master3
hostnamectl   set-hostname     slave1
hostnamectl   set-hostname     slave2
 
vi /etc/hosts
192.168.80.100 master1
192.168.80.101 master2
192.168.80.102 master3
192.168.80.103 slave1
192.168.80.104 slave2
 
 
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
setenforce 0
 
systemctl stop firewalld
systemctl disable firewalld
 
# 安装mesos、marathon、zookeeper
 
1、部署java环境
tar xf jdk-8u144-linux-x64.tar.gz -C /opt
 
cp -rv jdk1.8.0_144/ /usr/local/java
 
vi /etc/profile //在文件末尾新增
 
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
 
source /etc/profile
 
java -version
 
 
yum groupinstall -y "Development Tools" #安装开发工具
 
 
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo 
#添加apache-maven#为Mesos提供项目管理和构建自动化工具的支持
 
yum install -y apache-maven \
-- python-devel \
-- python-six \
-- python-virtualenv \
-- java-1.8.0-openjdk-devel \
-- zlib-devel \
-- libcurl-devel \
-- openssl-devel \
-- cyrus-sasl-devel \
-- apr-devel \
-- subversion-devel \
-- apr-util-devel \
-- cyrus-sasl-md5
 
 
vi /etc/yum.repos.d/wandisco-svn.repo #配置WANdiscoSVN网络源
[WANdiscoSVN]
name=WANdisco SVN Repo 1.9
enabled=1
baseurl=http://opensource.wandisco.com/centos/7/svn-1.9/RPMS/$basearch/
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
 
yum update systemd -y
 
配置mesos环境变量:
vi /etc/profile
export MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos.so
export MESOS_NATIVE_LIBRARY=/usr/local/lib/libmesos.so
source /etc/profile    //刷新使环境变量立即生效
 
升级pytz:
pytz:python的时区模块
 
安装pip:
tar xf pip-1.5.4.tar.gz  -C /opt
cd /opt/pip-1.5.4
python setup.py install
 
升级pytz
pip install pytz --upgrade    //网络不好容易失败。
 
构建mesos
tar xf mesos-0.25.0.tar.gz -C /opt           //解压软件包
cd /opt/mesos-0.25.0
mkdir build                                                  //构建配置
cd build
../configure

yum install -y apache-maven python-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel apr-util-devel subversion-devel

make                                                           //编译
make check                                                //运行测试集
make install  
 
编译过程漫长
 
如果在配置的时候报错:
error: cannot find libsvn_subr-1 headers
 
解决方法:
yum  install -y subversion-devel
 
 
部署zookeeper集群:
软件安装
mkdir /home/q
tar zxvf zookeeper-3.4.6.tar.gz -C /home/q/
mv /home/q/zookeeper-3.4.6 /home/q/zookeeper
 
 
修改配置文件
三台master都需操作
cd /home/q/zookeeper/conf
mv zoo_sample.cfg zoo.cfg                             //模板和配置文件不能同时存在
vi  zoo.cfg
maxClientCnxns=50                     #单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是50,如果设置为0,那么表明不作任何限制
tickTime=2000                         #Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔
initLimit=10                          #Zookeeper的Leader 接受客户端(Follower)初始化连接时最长能忍受多少个心跳时间间隔数。
syncLimit=5                           #表示 Leader 与 Follower 之间发送消息时请求和应答时间长度
clientPort=2181                       #客户端连接端口
dataDir=/home/q/zookeeper/data       //zookeeper数据文件存放目录
dataLogDir=/home/q/zookeeper/datalog          //手动创建/data /datalog目录
server.1=192.168.80.100:2888:3888         
server.2=192.168.80.101:2888:3888
server.3=192.168.80.102:2888:3888              //2888为信息交互端口,3888为选举端口
 
注:
以server.A=B:C:D: 格式定义各个节点相关信息,其中:A 是一个数字,表示第几号服务器;B是这个服务器的IP地址;C为与集群中的Leader服务器交换信息的端口;D是在Leader挂掉时专门进行Leader选举时所用的端口。
 
将修改好的配置文件传输给其他master
 
 
cd /home/q/zookeeper
mkdir data datalog   
 scp -r /home/q/zookeeper/ root@192.168.80.101:/home/q/
scp -r /home/q/zookeeper/ root@192.168.80.102:/home/q/
创建myid文件
此处创建的myid文件,对应的是在上述配置文件中server.1、server2……后对应的数字,三台服务器对应修改,各不相同,一一对应。
cd /home/q/zookeeper
echo 1 > data/myid  //在master1上操作(/home/q/zookeeper/中)
echo 2 > data/myid   //在master2上操作(/home/q/zookeeper/中)
echo 3 > data/myid   //在master3上操作(/home/q/zookeeper/中)
 
启动服务
在三台master服务器上安装zookeeper软件,然后启动服务,在服务开启完成之后就会开始选取leader,通过查看状态即可获取服务器的角色,**注意这里选举的leader只是zookeeper的leader,并不是mesoso的leader。
 
cd /home/q/zookeeper                             //注意切换目录

临时修改名称
echo master1 >/proc/sys/kernel/hostname
echo master2 >/proc/sys/kernel/hostname
echo master3 >/proc/sys/kernel/hostname
echo slave1 >/proc/sys/kernel/hostname
echo slave2 >/proc/sys/kernel/hostname

./bin/zkServer.sh start conf/zoo.cfg          //在三台master都启动该服务
./bin/zkServer.sh status                           //查询角色信息
 
 
验证单点故障
当角色为follower的zookeeper服务下线时,leader并不会重新选举,但是当角色为leader下线时,则会重新选举,产生新的leader,则实现了集群的故障转移。
./bin/zkServer.sh start conf/zoo.cfg       //注意脚本所在目录
 
./bin/zkServer.sh stop conf/zoo.cfg   //关闭服务
 
./bin/zkServer.sh status   //查看状态
follower——从
leader——主
 
 
 
部署mesos集群
安装完成zookeeper之后,zookeeper会选举出leader帮助mesos选举leader,确定多master环境中,谁处于actived,又有哪些master是处于standby状态。就是说,在接下来分派任务时,三台master会去找zookeeper的leader询问,谁是主,谁来负责分派任务,建议在生产环境中不要将zookeeper和mesos装在同一台服务器中,实验环境,为了节省虚拟机就装在一起。
 
创建master启动命令软连接
ln -sf /opt/mesos-0.25.0/build/bin/mesos-master.sh /usr/sbin/mesos-master
 
开启mnesos-master服务
在开启该服务之后,终端会被占用,若是想在终端上继续操作,则需开启新终端进行操作。
mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.80.100:2181/mesos --quorum=2
//在master1上执行,在编译安装完成之后,系统会自动识别该命令,不需要创建软连接即可直接使用
mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.80.101:2181/mesos --quorum=2
//在master2上执行
mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.80.102:2181/mesos --quorum=2
//在maseter3执行,地址为master3地址
 
说明:
--work_dir 指定工作目录
--log_dir  指定日志生成位置
--no-hostname_lookup 不指定域名解析
--ip=0.0.0.0 任意网段均可访问
 
 
网页访问
登陆网站之后,leader即选举完成,不论你使用的是那个master的地址访问,最终显示的都是leader页面,我在使用老版本做的时候发现,网页是会跳转的,但是新版本中改变了机制,但是实现的效果是一致的,即总是展示leader页面。
 
在浏览器中输入:ip地址:5050
 
 
 
验证单点故障
关闭leader所在服务器的mesos服务,mesos会重新指定leader,接替进行工作
 
配置Mesos-slave
创建slave启动命令软连接
ln -sf /opt/mesos-0.25.0/build/bin/mesos-slave.sh /usr/sbin/mesos-slave
 
安装docker,由于slave需要接受master的调度执行容器运行,因此需要安装docker
1.配置repo仓库
cd /etc/yum.repos.d/

vi docker.repo

[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

yum install docker -y
systemctl start docker
systemctl enable docker
 
启动Mesos-slave服务
 
mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.80.100:2181,192.168.80.101:2181,192.168.80.102:2181/mesos --no-hostname_lookup --ip=0.0.0.0
 
 
访问mesos网站
浏览器访问ip:5050
点击agents
 
 
在所有master上安装marathon
marathon软件包不需要安装,解压后即可使用,所有master上安装好marathon后,每台启动方式如下
 
每台mastermarathon启动hostname后面跟上自己ip以及zookeeper区域所有服务器ip
 
tar xf marathon-0.15.2.tgz -C /home/q
mv /home/q/marathon-0.15.2/ /home/q/marathon
cd /home/q/marathon/
./bin/start --hostname 192.168.80.100 --master zk://192.168.80.100:2181,192.168.80.101:2181,192.168.80.102:2181/mesos --http_address 0.0.0.0
./bin/start --hostname 192.168.80.101 --master zk://192.168.80.100:2181,192.168.80.101:2181,192.168.80.102:2181/mesos --http_address 0.0.0.0
./bin/start --hostname 192.168.80.102 --master zk://192.168.80.100:2181,192.168.80.101:2181,192.168.80.102:2181/mesos --http_address 0.0.0.0
 
测试
http://192.168.80.101:8080/
在marathon上创建一个test任务,mesos会将任务分派给集群中的代理来执行任务,任务会随机发布给agent执行

创建成功以后在applications页面可以看到该任务

Marathon会自动注册到Mesos中,可以在Mesos web的Framework页面中看到注册信息。
ip:5050

可以在Mesos Web首页看到测试任务在不停的执行中

 
在节点slave主机查看任务的相关信息

 
删除测试任务

 
使用Marathon API的形式添加新任务
在节点slave中操作
 
cd /root
vi demo.json
{
"id":"basic-0",
"cmd":"while [true]; do echo 'hello Marathon'; sleep 5; done",
"cpus":0.1,
"mem":10.0,
"instances":1
}
//查看Marathon网站有新添加任务
curl -X POST -H "Content-type:application/json" http://192.168.80.100:8080/v2/apps -d@demo.json
 
在网站页面查看:

 
使用Mesos与Marathon创建Docker集群
(1)在节点slave创建docker的nginx请求任务
cd /root
vi nginx.json
 
{
"id":"/nginx",      //应用唯一的ID
"container":{      //marathon启用docker格式
"type":"DOCKER",
"docker":{
"image":"nginx",     //nginx镜像
"network":"HOST",   //网络为![](https://s1.51cto.com/images/blog/201904/08/a2f2adf6e1b2d2258e18b593bd849690.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)HOST模式
"parameters":[],
"privileged":false,
"forcePullImage":false   //是否强制更新镜像
}
},
"cpus":0.1,
"mem":32.0,
"instances":1
}
 
//查看Marathon网站有新添加任务
curl -X POST -H "Content-type:application/json" http://192.168.80.100:8080/v2/apps -d@nginx.json
 
 
(2)在Marathon页面查看
可以在创建的Nginxd任务下看到该任务发送给主机

(3)用命令行方式查看主机下载的docker镜像
docker images
看有木有nginx镜像
docker ps -a
看有木有运行容器
 
(4)访问slave主机上运行着的Nginx服务
http:slave1ip地址