1)Mesos:Mesos采用与Linux kernerl相同的机制,只是运行在不同的抽象层次上。Mesos kernel利用资源管理和调度的API在整个数据中心或云环境中运行和提供引用(例如,Hadoop,Spark,Kafaka,Elastic Search)。
2)Zookeeper:zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。
3)Marathon:marathon是一个mesos框架,能够支持运行长服务,比如web应用等。是集群的分布式Init.d,能够原样运行任何Linux二进制发布版本,如Tomcat Play等等,可以集群的多进程管理。也是一种私有的Pass,实现服务的发现,为部署提供提供REST API服务,有授权和SSL、配置约束,通过HAProxy实现服务发现和负载平衡
4)Docker:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
1)服务器架构
机器信息如下:
这里部署的机器为3个Mastser控制节点,3个Slave运行节点,其中:
zookeeper、Mesos-master、marathon运行在Master端;Mesos-slave和docker运行在Slave端;需要修改zk的内容来保证slave能够被master发现和管理
这里为了测试方便,全部采用centos7版本系统。当然,在实际生产环境中,也不一定非要要求master和slave端的服务器版本一致,不一样的版本系统也可以。
(当机器数量没有这么多比如只有两台机器的情况下,可以将一台机器即作为Mesos-Master也作为Mesos-Slave,另一台作为Mesos-Slave,也就是一主两从的结构)
为了直观的理解,简单的画了一张架构图:
2)配置mesos-master(3台master节点都要操作)
1)关闭防火墙和selinux
关闭防火墙
关闭firewall:CentOS 7.0默认使用的是firewall作为防火墙
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
关闭selinux
[root@master-1 ~]# vi /etc/sysconfig/selinux
SELINUX=disabled
[root@master-1 ~]# setenforce 0 #临时关闭。reboot重启机器后,使得上面配置生效,就永久关闭selinux了
[root@master-1 ~]# getenforce
Permissive
如果不关闭,需要开启2181,5050,8080端口
[root@master-1 ~]# vim /etc/sysconfig/iptables
.......
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2181 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5050 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
2)添加mesos的yum源
[root@master-1 ~]# rpm -Uvh http://repos.mesosphere.io/el/7/noarch/RPMS/mesosphere-el-repo-7-1.noarch.rpm
3)安装mesos,marathon,zookeeper
[root@master-1 ~]# yum install -y java-1.8.0-openjdk-devel java-1.8.0-openjdk #安装依赖的JDK环境
[root@master-1 ~]# yum -y install mesos marathon mesosphere-zookeeper
3)安装mesos,marathon,zookeeper
[root@master-1 ~]# yum install -y java-1.8.0-openjdk-devel java-1.8.0-openjdk #安装依赖的JDK环境
[root@master-1 ~]# yum -y install mesos marathon mesosphere-zookeeper
4)配置zookeeper
设置文件/var/lib/zookeeper/myid为当前mesos master节点的id,id必须为1-255之中的整数.
master-1机器设置id为"1"
[root@master-1 ~]# echo 1 > /var/lib/zookeeper/myid
master-2机器设置id为"2"
[root@master-2 ~]# echo 2 > /var/lib/zookeeper/myid
master-3机器设置id为"3"
[root@master-3 ~]# echo 3 > /var/lib/zookeeper/myid
[root@master-1 ~]# cp /etc/zookeeper/conf/zoo.cfg /etc/zookeeper/conf/zoo.cfg.bak
[root@master-1 ~]# vi /etc/zookeeper/conf/zoo.cfg
maxClientCnxns=50 #单个客户端与单台服务器之间的连接数的限制,是ip级别的,默认是50,如果设置为0,那么表明不作任何限制。请注意这个限制的使用范围,仅仅是单台客户端机器与单台ZK服务器之间的连接数限制,不是针对指定客户端IP,也不是ZK集群的连接数限制,也不是单台ZK对所有客户端的连接数限制。
tickTime=2000 #Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳
#Zookeeper的Leader 接受客户端(Follower)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit=5 #表示 Leader 与 Follower 之间发送消息时请求和应答时间长度,最长不能超过多少个tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
dataDir=/var/lib/zookeeper #zookeeper数据文件存放目录
clientPort=2181 #客户端连接端口
server.1=182.48.115.233:2888:3888 #数字1,2,3表示这个是第几号服务器(是上面myid文件里对应的数字);中间的是master主节点的ip地址
server.2=182.48.115.235:2888:3888 #第一个端口2888(这个端口可以自己定义)表示的是这个服务器与集群中的 Leader 服务器交换信息的端口
server.3=182.48.115.236:2888:3888 #第二个端口3888表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
[root@master-1 ~]# vi /etc/mesos/zk #完全替换原来内容
zk://182.48.115.233:2181,182.48.115.235:2181,182.48.115.236:2181/mesos
设置文件/etc/master-/quorum内容为一个大于(master节点数除以2)的整数。即采用四舍五入,比如这里有3个master节点,那么3/2=1.5,四舍五入为2
设置文件/etc/master-/quorum内容为一个大于(master节点数除以2)的整数。即采用四舍五入,比如这里有3个master节点,那么3/2=1.5,四舍五入为2
[root@master-1 ~]# echo 2 >/etc/mesos-master/quorum
[root@master-1 ~]# cat /etc/mesos-master/quorum
2
5)配置mesos和marathon
主机名和ip要在hosts中写入,最好不要使用localhost,否则会出现slave不能识别,以及marathon任务下发不正常等现象。
master-1机器
[root@master-1 ~]# mkdir -p /etc/marathon/conf
[root@master-1 ~]# echo 182.48.115.233 > /etc/mesos-master/hostname
[root@master-1 ~]# echo 182.48.115.233 > /etc/marathon/conf/hostname
[root@master-1 ~]# hostnamectl --static set-hostname master-1.com
[root@master-1 ~]# echo "182.48.115.233 master-1 master-1.com" >/etc/hosts
[root@master-1 ~]# cat /etc/hosts
182.48.115.233 master-1 master-1.com
master-2机器
[root@master-2 ~]# mkdir -p /etc/marathon/conf
[root@master-2 ~]# echo 182.48.115.235 > /etc/mesos-master/hostname
[root@master-2 ~]# echo 182.48.115.235 > /etc/marathon/conf/hostname
[root@master-2 ~]# hostnamectl --static set-hostname master-2.com
[root@master-2 ~]# echo "182.48.115.235 master-2 master-2.com" >/etc/hosts
[root@master-2 ~]# cat /etc/hosts
182.48.115.235 master-2 master-2.com
master-3机器
[root@master-3 ~]# mkdir -p /etc/marathon/conf
[root@master-3 ~]# echo 182.48.115.236 > /etc/mesos-master/hostname
[root@master-3 ~]# echo 182.48.115.236 > /etc/marathon/conf/hostname
[root@master-3 ~]# hostnamectl --static set-hostname master-3.com
[root@master-3 ~]# echo "182.48.115.236 master-3 master-3.com" >/etc/hosts
[root@master-3 ~]# cat /etc/hosts
182.48.115.236 master-3 master-3.com
[root@master-1 ~]# cp /etc/mesos/zk /etc/marathon/conf/master
[root@master-1 ~]# cp /etc/mesos/zk /etc/marathon/conf/zk
[root@master-1 ~]# sed -i 's|mesos|marathon|g' /etc/marathon/conf/zk
6)启动mesos,marathon,zookeeper
[root@master-1 ~]# systemctl enable zookeeper && systemctl enable mesos-master && systemctl enable marathon
[root@master-1 ~]# systemctl start zookeeper && systemctl start mesos-master && systemctl start marathon
[root@master-1 ~]# systemctl disable mesos-slave
查看进程状态
[root@master-1 ~]# systemctl status zookeeper
[root@master-1 ~]# systemctl status mesos-master
[root@master-1 ~]# systemctl status marathon
[root@master-1 ~]# lsof -i:2181 #会显示相关信息如果没有就启动失败 zookeeper占有端口号
[root@master-1 ~]# lsof -i:5050 #会显示相关信息如果没有就启动失败 mesos占有端口号
[root@master-1 ~]# lsof -i:8080 #会显示相关信息如果没有就启动失败 marathon占有端口号
如果marathon服务启动失败
[root@master-1 ~]#vi /etc/default/marathon
MARATHON_MASTER="zk://182.48.115.233:2181,182.48.115.235:2181,182.48.115.236:2181/mesos"
MARATHON_ZK="zk://182.48.115.233:2181,182.48.115.235:2181,182.48.115.236:2181/marathon"
MARATHON_MESOS_USER="root"
7)检查配置
配置过程中出错,为了方便检查对比各master配置,直接执行如下命令
[root@master-1 ~]# cat /var/lib/zookeeper/myid && tail -6 /etc/zookeeper/conf/zoo.cfg && cat /etc/mesos/zk && cat /etc/mesos-master/quorum && cat /etc/mesos-master/hostname&& cat /etc/marathon/conf/hostname&& cat /etc/marathon/conf/master&&cat /etc/marathon/conf/zk
1
syncLimit=5
dataDir=/var/lib/zookeeper
clientPort=2181
server.1=182.48.115.233:2888:3888
server.2=182.48.115.235:2888:3888
server.3=182.48.115.236:2888:3888
zk://182.48.115.233:2181,182.48.115.235:2181,182.48.115.236:2181/mesos
2
182.48.115.233
182.48.115.233
zk://182.48.115.233:2181,182.48.115.235:2181,182.48.115.236:2181/mesos
zk://182.48.115.233:2181,182.48.115.235:2181,182.48.115.236:2181/marathon
--------------------------------------------------------------------------------------------------------
温馨提示:
1) 还可以创建 /etc/mesos-master/cluster 文件,写入集群的别名。
2)主机名最好不要轻易更换,否则会导致mesos启动失败!更换主机名后,最好彻底卸载并删除源数据,然后重新部署
# yum remove mesos marathon mesosphere-zookeeper
# rm -rf /etc/mesos*
# rm -rf /etc/marathon*
# rm -rf /var/lib/zookeeper*
# rm -rf /etc/zookeeper*
# rm -rf /var/lib/mesos* #源数据目录
# yum -y install mesos marathon mesosphere-zookeeper
3)以上操作后,master节点机不能ping通外网,是因为DNS解析文件被改变了,执行下面命令即可:
[root@master-1 local]# echo "nameserver 8.8.8.8" >> /etc/resolv.conf
[root@master-1 local]# ping www.baidu.com
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38: icmp_seq=1 ttl=53 time=38.3 ms
3)配置slave节点(3台slave节点都要操作)
1)关闭防火墙和selinux
关闭防火墙
关闭firewall:CentOS 7.0默认使用的是firewall作为防火墙
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
关闭selinux
[root@master-1 ~]# vi /etc/sysconfig/selinux
SELINUX=disabled
[root@master-1 ~]# setenforce 0 #临时关闭。reboot重启机器后,使得上面配置生效,就永久关闭selinux了
[root@master-1 ~]# getenforce
Permissive
如果不关闭,需要开启5051端口
[root@slave-1 ~]# vi /etc/sysconfig/iptables
.......
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5051 -j ACCEPTT
[root@slave-1 ~]# systemctl restart iptables.service
2)安装docker,安装后启动docker
[root@slave-1 ~]# yum install -y docker
[root@slave-1 ~]# systemctl enable docker
[root@slave-1 ~]# systemctl start docker
拉取镜像(三台slave节点机都需要下载镜像,因为在marathon界面里创建docker容器,是随机在slave节点机上读取镜像创建的)
[root@slave-1 ~]# docker pull nginx
[root@slave-1 ~]# docker pull tomcat
[root@slave-1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/tomcat latest 08f8166740f8 4 days ago 366.7 MB
docker.io/nginx latest 46102226f2fd 2 weeks ago 109.4 MB
3)添加mesos的yum源
[root@slave-1 ~]# rpm -Uvh http://repos.mesosphere.io/el/7/noarch/RPMS/mesosphere-el-repo-7-1.noarch.rpm
4)安装mesos
[root@slave-1 ~]# yum -y install mesos
5)配置master信息
slave-1机器
[root@slave-1 ~]# echo 182.48.115.237 > /etc/mesos-slave/hostname
[root@slave-1 ~]# hostnamectl --static set-hostname slave-1.com
[root@slave-1 ~]# echo "182.48.115.237 slave-1 slave-1.com" >/etc/hosts
[root@slave-1 ~]# cat /etc/hosts
182.48.115.237 slave-1 slave-1.com
slave-2机器
[root@slave-2 ~]# echo 182.48.115.238 > /etc/mesos-slave/hostname
[root@slave-2 ~]# hostnamectl --static set-hostname slave-2.com
[root@slave-2 ~]# echo "182.48.115.238 slave-2 slave-2.com" >/etc/hosts
[root@slave-2 ~]# cat /etc/hosts
182.48.115.238 slave-2 slave-2.com
slave-3机器
[root@slave-3 ~]# echo 182.48.115.239 > /etc/mesos-slave/hostname
[root@slave-3 ~]# hostnamectl --static set-hostname slave-3.com
[root@slave-3 ~]# echo "182.48.115.239 slave-3 slave-3.com" >/etc/hosts
[root@slave-3 ~]# cat /etc/hosts
182.48.115.239 slave-3 slave-3.com
[root@slave-1 ~]# vim /etc/mesos/zk
zk://182.48.115.233:2181,182.48.115.235:2181,182.48.115.236:2181/mesos
配置marathon调用mesos运行docker容器
[root@slave-1 ~]# echo 'docker,mesos' > /etc/mesos-slave/containerizers
6)启动slave(要保证mesos-slave启动后,读取的zk信息是那三个mesos-master的连接信息,否则mesos访问页面里就不会出现这个slave节点信息。ps -ef|grep mesos-slave)
[root@slave-1 ~]# systemctl start mesos-slave && systemctl enable mesos-slave
[root@slave-1 ~]# systemctl disable mesos-master
-------------------------------------------------------------------------------------------------------
温馨提示:
1)以上操作后,master节点机不能ping通外网,是因为DNS解析文件被改变了,执行下面命令即可:
[root@slave-1 ~]#echo "nameserver 8.8.8.8" >> /etc/resolv.conf
[root@slave-1 ~]# ping www.baidu.com
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38: icmp_seq=1 ttl=53 time=38.3 ms
.......
2)如果mesos-slave启动失败,可以如下检查:
[root@slave-1 ~]# journalctl -f -u mesos-slave #journalctl -f -u mesos-master可以检查master端的
mesos-slave启动失败(比如主机名改变导致),可以删除源数据,卸载干净,然后重新安装部署
# yum remove mesos
# rm -rf /etc/mesos*
# rm -rf /var/lib/mesos* #源数据目录是/var/lib/mesos/meta
# yum install mesos
4)访问web管理页面
访问mesos的管理页面,即访问http://master_ip:5050
注意:master_ip是这3个master中的任意一个就行,经过zookeeper选主,会自动跳到了leader的页面,如图mesos的leader为182.48.115.236(即master3被选为leader master)
在Frameworks中已经能够识别marathon,此时marathon的leader为182.48.115.236.
注意:mesos和marathon都是有zookeeper来选举leader,但是选主过程彼此独立,就是mesos的leader和marathon的leader可以不一样。如图这里二者通过zookeeper选出的leader是同一台机器(即都是master3:182.48.115.236)
点击"Agents",发现已经能够识别出三个slave。
注意:这里访问mesos显示的是"Agents"选项,老版本的mesos显示的是”Salve“选项
点击上面3个slave中的任意一个,也能看出它的master是182.48.115.236
访问marathon的管理页面,http://master_ip:8080
这里的master_ip就是在上面访问mesos页面Frameworks中识别出的marathon,即http://182.48.115.236:8080
或者直接点击mesos访问页面Frameworks中识别出的marathon也可以
或者点击下图标红的marathon(即zookeeper选出的主marathon),可以出现marathon的管理界面
5)通过Mesos调度,使用marathon来创建容器
比如创建一个nginx镜像的Docker容器,Marathon启动时会读取/etc/mesos/zk配置文件,Marathon通过Zookeeper来找到Mesos Master。
Marathon有自己的REST API,我们通过API的方式来创建一个Nginx的Docker容器。
首先创建一个json文件(这个要在master节点机器上创建,任意一台master节点机上都可以):
[root@master-1 ~]# vi nginx.json #nginx的docker镜像要提前创建或下载
{
"id":"nginx",
"cpus":0.2,
"mem":32.0,
"instances": 1,
"constraints": [["hostname", "UNIQUE",""]],
"container": {
"type":"DOCKER",
"docker": {
"image": "docker.io/nginx", #这个nginx镜像是在slave节点机上通过"docker images"查看到的,镜像名不能写错
"network": "BRIDGE",
"portMappings": [
{"containerPort": 80, "hostPort": 0,"servicePort": 0, "protocol": "tcp" }
]
}
}
}
接着使用curl的方式调用。注意上面的nginx.json文件是在/root路径下的(注意下面命令中json文件路径)。
[root@master-1 ~]# curl -X POST http://182.48.115.233:8080/v2/apps -d @/root/nginx.json -H "Content-type: application/json"
登陆marathon界面查看是在哪一台slave机器上创建的docker容器实例(这个是随机的),点击"running"。(如果容器创建失败,即非"running"状态,可以尝试重启slave节点的docker服务)
如上截图中可知,这个nginx容器是在slave3节点机(182.48.115.239)上创建的(注意:如果slave3节点机宕机或docker服务重启,那么这个nginx容器就会自动漂移到其他的slave节点机上;另外,通过上面方式创建好的容器,在单个slave节点机上删除后,容器也会自动转移到其他slave节点机器上,这样就实现了在slave节点出现故障时容器自动转移的高可用功能)。可以登陆slave3机器查看所创建的容器,如下可知:访问Docker随机启动的端口是31782
[root@slave-3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b35fff88051e docker.io/nginx "nginx -g 'daemon off" 14 minutes ago Up 14 minutes 0.0.0.0:31782->80/tcp mesos-6bc17bcc-433c-425e-b85e-232ffa42fe4f-S5.f1a121be-2e79-4856-bd5c-576db3497fba
访问所创建的nginx容器。(marathon ui界面里创建的docker容器映射到宿主机的访问端口默认都是随机分配的(BRIDGE模式))、可以自己制作应用的docker镜像,或者自定义构建容器并提交为新镜像(自己设定应用容器结构),然后根据自己制作的镜像在Marathon上创建应用。
接着访问mesos页面,可以看到"Active Tasks"有刚才创建的nginx任务了。(注意:只有当mesos访问界面"Active Tasks"里有容器创建任务时,才说明此容器真正创建成功了)
删除marathon创建的docker实例。如下图,点击"Destory"即可删除。
然后登陆slave3机器,发现在服务器上,这个容器只是被关闭了(docker ps -a),可以选择删除。如果再次在机器上启动这个nginx容器,那么在marathon上是不会显示的。注意:在节点机器上手动创建的docker容器,这些容器信息是不会在marathon和mesos里展示的。
[root@slave-3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@slave-3 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b35fff88051e docker.io/nginx "nginx -g 'daemon off" 30 minutes ago Exited (0) About a minute ago mesos-6bc17bcc-433c-425e-b85e-232ffa42fe4f-S5.f1a121be-2e79-4856-bd5c-576db3497fba
[root@slave-3 ~]# docker rm b35fff88051e
b35fff88051e
如上在marathon界面里"Destory"删除对应的application后,在mesos界面的"Active Tasks"里的对应任务也会删除
另外要注意:在marathon界面里通过调用mesos创建docker容器,只能创建应用容器(Application),如nginx、tomcat、mysql、redis等,需要映射端口,这里是映射的是宿主机的随机端口。不能创建基本centos,ubuntu的系统容器!
----------------------------------------------------------------------------------------------------------------------------------------
可以直接在marathon界面里手动创建docker应用容器:
然后填写创建容器的配置信息,如下图,可以点击"New Application"创建页面右上角的"JSON Mode"模式,将上面创建nginx容器的json文件复制到这里
这样,就可以直接创建一个docker应用容器了。(复制写好的json文件到这里后,可以再次关闭"JSON Mode"模式,然后对比下所选用的配置)
下面我关闭"JSON mode"模式,手动选择配置信息去创建tomcat容器:
Marathon还可以对App应用实现手动扩缩的功能,选择"Scale Application"进行快速扩容。如下图,对上面已创建的tomcat应用容器进行扩展到2个Task(注意:这里有3个slave节点,那么扩展的Task实例最好是2个,3/2=1.5,即2个Instances;如果扩展多个Task,会发现多余的创建失败,这时候可以点击"Configuration"修改,修改成2个)
查看容器创建的日志,可以在marathon界面里下载,也可以到mesos页面里查看或下载。如下图:
点击下面的日志"stderr"和"stdout"就会下载到本地。
也可以到mesos页面查看或下载。点击下面mesos页面对应容器任务后面的"Sandbox"
参考:https://blog.csdn.net/mnasd/article/details/79829154