Mesos+Zookeeper+Marathon的Docker管理平台部署

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

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页