100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 一步一步搭建ZooKeeper + Mesos + Marathon平台管理Docker集群

一步一步搭建ZooKeeper + Mesos + Marathon平台管理Docker集群

时间:2022-01-30 12:58:16

相关推荐

一步一步搭建ZooKeeper + Mesos + Marathon平台管理Docker集群

最近在Youtube看Docker视频的过程中不幸看到了Mesos的介绍,然后就有一种一见如故的感觉,最终根据mesosphere官网的文档在IBM的Bluemix虚拟机上搭建了基于ZooKeeper+ Mesos + Marathon的平台。

搭建之前先简单了解下各个组件是做什么的。(来自wikipedia及其他网络)

ZooKeeper:Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。官网:/

Mesos:来自mesosphere的定义是Mesos是下一代的云数据中心的kernel,它是Apache下的开源分布式资源管理框架,作者之一Benjamin在Mesosconf上一直强调Mesos只做kernel的事情,只做scheduling,并不实际运行任务。现该作者也去了Mesosphere公司做云数据中心操作系统DC/OS的工作(看起来很令人兴奋的软件)。

Marathon:是Mesos的一个框架,能够支持运行长期任务,也与这个名字有点关联,马拉松本身就是长时间要完成的任务,它可以提供REST API服务,可以通过HAProxy实现服务发现和负载均衡。(负载均衡可以看mesosphere公司开源的marathon-lb /mesosphere/marathon-lb/)

Docker:就不用介绍了吧。记住它是应用容器引擎,可以给微服务提供完美的运行环境,尽量一个容器只有一个服务。

下面说一下服务器的运行环境:总共六台服务器,三台运行Mesos-master,4台运行Mesos-slave,服务器都是IBM Bluemix上申请的虚拟机,处于一个***网络里,底层是基于Openstack的架构,在底层是Softlayer和Cloudfoundry。

软件安装:

RedHat 6 / CentOS 6

#Addtherepositorysudorpm-Uvh/cdh4/one-click-install/redhat/6/x86_64/cloudera-cdh-4-0.x86_64.rpmyum-yinstallmesosmarathonzookeeper

所有机器用ansible安装Java:

ansiblemesos-mshell-a"wget/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.tar.gz"ansiblemesos-mshell-a"tarzxfjdk-8u73-linux-x64.tar.gz-C/usr/java/

导入jre到.zshrc,然后用ansible分发下去:

exportJAVA_HOME=/usr/java/jdk1.8.0_73exportPATH=$JAVA_HOME/bin:$PATHexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar

Master Node Setup

ZooKeeper的配置:

在三台ZooKeeper server上设置ID,这个数字必须是1到255的整数,并且每个节点的ID是不一样的。

sudozookeeper--server-initialize--myid=<YOURIDHERE>

编辑/etc/zookeeper/conf/zoo.cfg,在每台机器上都需要添加zk 集群的服务器名称,ip地址,端口号等信息:server.A=B:C:D

server.1=192.168.0.33:2888:3888server.2=192.168.0.28:2888:3888server.3=192.168.0.31:2888:3888

A:代表一个1-255的整数,是第几号服务器,可以随便定义。

B:代表服务器的ip地址。

C:代表服务器与集群中的Leader通信的端口。

D:代表如果集群中的Leader down了,需要用这个端口来重新选举,如果使用一台主机多个zk实例,这个D的值不能与C相同。

zk最终的配置:

#egrepv/etc/zookeeper/conf/zoo.cfgmaxClientCnxns=50tickTime=2000initLimit=10syncLimit=5dataDir=/var/lib/zookeeperclientPort=2181server.1=192.168.0.33:2888:3888server.2=192.168.0.28:2888:3888server.3=192.168.0.31:2888:3888

一份简单的zk配置就完成了,sudo service zookeeper restart。

Mesos & Marathon的配置:

在每一个master节点添加以下文件,并把master的ip地址写进去:

#cat/etc/mesos/zkzk://192.168.0.33:2181,192.168.0.28:2181,192.168.0.31:2181/mesos

Quorum的设定原则是Mesos master的数量除以2得到的整数,我们用了3个maser,除以2 是1.5,得到的整数是2,所以这里用2

#cat/etc/mesos-master/quorum2

Hostname的设置是可选的,如果有DNS的前提下,可以不用设置,但是为了避免后期出现不能解析域名的情况,我这里设置的hostname,在每一台机器(包括slave)的/etc/mesos-{master,slave}/hostname的文件里写上改机器的ip地址,注意:每台机器只需要写自己机器的ip即可,不需要把所有机器的ip都写进去:

$ansibleall-mshell-a'cat/etc/mesos-master/hostname'-sbastion|success|rc=0>>192.168.0.33dbmaster|success|rc=0>>192.168.0.28dbslave2|success|rc=0>>192.168.0.31

然后将hostname 复制到Marathon的目录一份:

cp/etc/mesos-master/hostname/etc/marathon/conf/

如果你不需要master的机器跑slave的话,需要将slave的功能override

sudostopmesos-slavesudosh-c"echomanual>/etc/init/mesos-slave.override"

然后没有问题的话就可以start Mesos-master和Marathon了。

ansiblemaster-mshell-a"startmesos-msater&&startmarathon"

Slave Node Setup

安装mesos-slave软件

Debian/Ubuntu

#Setup#sudoapt-keyadv--keyserverhkp://:80--recvE56151BF#DISTRO=$(lsb_release-is|tr'[:upper:]''[:lower:]')#CODENAME=$(lsb_release-cs)###Addtherepository#echo"deb/${DISTRO}${CODENAME}main"|\#sudotee/etc/apt/sources.list.d/mesosphere.list#sudoapt-get-yupdate#sudoapt-get-yinstallmesos

RedHat/CentOS6

##Addtherepository#sudorpm-Uvh#sudoyum-yinstallmesos

如果系统使用的是Ubuntu like的系统,需要将自动安装的ZooKeeper禁用

sudoservicezookeeperstopsudosh-c"echomanual>/etc/init/zookeeper.override"

配置zk,跟master节点的内容一样,可以使用ansible 分发到slave节点:

#catzkzk://192.168.0.33:2181,192.168.0.28:2181,192.168.0.31:2181/mesos

要支持运行Docker,还需要在slave节点/etc/mesos-slave/添加两个文件:containerizers,executor_registration_timeout,文件内容如下:

#ibmcloudatdbarbiter.shankerin/etc/mesos-slave[15:43:23]$catcontainerizersdocker,mesos#ibmcloudatdbarbiter.shankerin/etc/mesos-slave[15:43:27]$catexecutor_registration_timeout5mins

需要配置的就这么多,接下来就是要在slave节点上禁用mesos-master,要不然选举的时候会出莫名其妙的错的

sudoservicemesos-masterstopsudosh-c"echomanual>/etc/init/mesos-master.override"

然后开启slave服务

Ubuntu:

sudoservicemesos-slaverestart

CentOS:

sudostartmesos-slave

然后在浏览器里输入一个master节点的ip:5050看看是否有Mesos的console出现,如果输入的ip地址不是leader,mesos会自动跳转到Leader的ip地址上:

登录进Mesos-master的dashborad之后会发现有显示Cluster Name, 当前Leader的ip地址,有多少Slaves, Resources具体情况,Active Tasks,即当前的任务都有哪些,Completed Tasks,:

如果不确认当前的Marathon的Leader ip是哪个,可以看Mesos-master的Framework页面,来查看Marathon的ip:

然后Marathon的界面如下:

利用这个UI界面可以很容易的创建应用,并且可以以json的方式编辑,只要右上角这个JSON Mode被选中即可:

比如我们创建一个python的应用程序,来看看后来Docker是否正常运行:

有了这个平台创建基于Docker的应用非常容易,而且扩展起来也是秒级的,比如我们创建了一个Nginx的应用,然后需要扩展到5个,只需要点击Scale Application,输入5,后台就自动扩展了5个Nginx的应用。

然后就是故障自动转移,加入我们去后台终止一个正在运行的容器,Marathon会自动检测到正在运行的任务与设置的不一样,而立马新创建一个应用。

初了用web ui的方式来创建任务,也可以使用API的形式:

比如我这里有个2048游戏的json格式的文件,使用的p_w_picpath为nginx:latest,将本地的/home/ibmcloud/2048-maser/ 映射到容器的nginx根目录,采用BRIDGE网络,expose容器的80端口,并对改容器进行http的健康检查:

$catnginx-bridge-2048game.json{"id":"/nginx","cpus":1,"mem":128,"disk":0,"instances":1,"container":{"type":"DOCKER","volumes":[{"containerPath":"/usr/share/nginx/html/","hostPath":"/home/ibmcloud/2048-master/","mode":"RO"}],"docker":{"p_w_picpath":"nginx","network":"BRIDGE","portMappings":[{"containerPort":80,"hostPort":0,"protocol":"tcp","servicePort":80,"labels":{}}],"privileged":false,"parameters":[],"forcePullImage":false}},"healthChecks":[{"path":"/","protocol":"HTTP","portIndex":0,"gracePeriodSeconds":120,"intervalSeconds":30,"timeoutSeconds":5,"maxConsecutiveFailures":3,"ignoreHttp1xx":false}],"portDefinitions":[{"port":10003,"protocol":"tcp","labels":{}}]}

在Marathon的Leader机器上运行

#curl-uusername:password-i-H'Content-Type:application/json'-d@nginx-bridge-2048game.json192.168.0.33:8080/v2/appsHTTP/1.1201CreatedDate:Tue,07Jun07:59:17GMTX-Marathon-Leader:http://192.168.0.33:8080Cache-Control:no-cache,no-store,must-revalidatePragma:no-cacheExpires:0Location:http://192.168.0.33:8080/v2/apps/nginxContent-Type:application/json;qs=2Transfer-Encoding:chunkedServer:Jetty(9.3.z-SNAPSHOT){"id":"/nginx","cmd":null,"args":null,"user":null,"env":{},"instances":1,"cpus":1,"mem":128,"disk":0,"executor":"","constraints":[],"uris":[],"fetch":[],"storeUrls":[],"ports":[80],"portDefinitions":[{"port":80,"protocol":"tcp","labels":{}}],"requirePorts":false,"backoffSeconds":1,"backoffFactor":1.15,"maxLaunchDelaySeconds":3600,"container":{"type":"DOCKER","volumes":[{"containerPath":"/usr/share/nginx/html/","hostPath":"/home/ibmcloud/2048-master/","mode":"RO"}],"docker":{"p_w_picpath":"nginx","network":"BRIDGE","portMappings":[{"containerPort":80,"hostPort":0,"servicePort":80,"protocol":"tcp","labels":{}}],"privileged":false,"parameters":[],"forcePullImage":false}},"healthChecks":[{"path":"/","protocol":"HTTP","portIndex":0,"gracePeriodSeconds":120,"intervalSeconds":30,"timeoutSeconds":5,"maxConsecutiveFailures":3,"ignoreHttp1xx":false}],"readinessChecks":[],"dependencies":[],"upgradeStrategy":{"minimumHealthCapacity":1,"maximumOverCapacity":1},"labels":{},"acceptedResourceRoles":null,"ipAddress":null,"version":"-06-07T07:59:18.003Z","residency":null,"tasksStaged":0,"tasksRunning":0,"tasksHealthy":0,"tasksUnhealthy":0,"deployments":[{"id":"c30b9f6e-786c-45bd-9e7e-cc6cc001d91d"}],"tasks":[]}#

为了方便,可以将这个命令写入到脚本里运行:

$catrunapp.sh#!/bin/bashcurl-i-H'Content-Type:application/json'-d@"$1"192.168.0.33:8080/v2/apps

可以看到我们的2048游戏已经可以玩了:

最后强调一下安全问题,因为我把Marathon暴漏到公网了,而且没加认证,导致有坏蛋扫描到我的机器,并且创建了一个Metasploit的任务对我的服务器进行***,好在我的安全性做的还可以,凶手没有得逞,参考这篇文章:http://shanker./1189689/1785797

然后marathon开启认证的方式是这样运行的:

marathon--http_credentials"username:password"

注意问题:

1.需要添加MESOS_QUORUM到/etc/default/mesos-master, 即使/etc/mesos-master/quorum 有这个,也必须要做这一步(来自stackoverflow的解决方案)

# cat /etc/default/mesos-master

PORT=5050

ZK=`cat /etc/mesos/zk`

MESOS_QUORUM=`cat /etc/mesos-master/quorum`

2.slave start fails, need to delete the slave.info file /tmp/mesos/meta/slaves/latest/slave.info

3.当遇到主节点不是当前节点,浏览器自动转发的时候,用到的转发的文件是/etc/mesos-master/hostname,是每台机器的hostname只写自己的ip地址,而不是将所有master节点ip都写上,

然后marathon 的hostname同master的hostname,cp 过去即可。

4.遇到这个问题是因为你的slave没有禁用mesos-master,或者开启了mesos-master进程

Failed to create ZooKeeper, zookeeper_init: No such file or directory

5.遇到以下问题需要查看/etc/mesos-master/quorum 是否都设置的数量,而且/etc/default/mesos-master配置文件也有QUORUM的设置,请参考问题1

Replica in VOTING status received a broadcasted recover request from192.168.0.33:37798

6. 查看mesos 网页的的LOG ,出现以下内容,才是正常的

I052407:53:33.24283227506http.cpp:312]HTTPGETfor/master/statefrom124.193.167.1:18148withUser-Agent='Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/50.0.2661.75Safari/537.36'

I052407:53:41.83422327507http.cpp:312]HTTPGETfor/master/statefrom192.168.0.33:37798withUser-Agent='Mozilla/5.0(WindowsNT6.1;rv:46.0)Gecko/0101Firefox/46.0'

I052407:53:44.24118327509http.cpp:312]HTTPGETfor/master/statefrom124.193.167.1:18148withUser-Agent='Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/50.0.2661.75Safari/537.36'

I052407:53:52.03437427502http.cpp:312]HTTPGETfor/master/statefrom192.168.0.33:37798withUser-Agent='Mozilla/5.0(WindowsNT6.1;rv:46.0)Gecko/0101Firefox/46.0'

I052407:53:55.24188327504http.cpp:312]HTTPGETfor/master/statefrom124.193.167.1:18148withUser-Agent='Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/50.0.2661.75Safari/537.36'

I052407:54:02.23634327505http.cpp:312]HTTPGETfor/master/statefrom192.168.0.33:37798withUser-Agent='Mozilla/5.0(WindowsNT6.1;rv:46.0)Gecko/0101Firefox/46.0'

I052407:54:06.24301727508http.cpp:312]HTTPGETfor/master/statefrom124.193.167.1:18148withUser-Agent='Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/50.0.2661.75Safari/537.36'

I052407:54:13.14128427507http.cpp:312]HTTPGETfor/master/statefrom192.168.0.33:37798withUser-Agent='Mozilla/5.0(WindowsNT6.1;rv:46.0)Gecko/0101Firefox/46.0'

I052407:54:22.23888327509http.cpp:312]HTTPGETfor/master/statefrom124.193.167.1:18148withUser-Agent='Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/50.0.2661.75Safari/537.36'

I052407:54:23.34516527509http.cpp:312]HTTPGETfor/master/statefrom192.168.0.33:37798withUser-Agent='Mozilla/5.0(WindowsNT6.1;rv:46.0)Gecko/0101Firefox/46.0'

I052407:54:33.54516227509http.cpp:312]HTTPGETfor/master/statefrom192.168.0.33:37798withUser-Agent='Mozilla/5.0(WindowsNT6.1;rv:46.0)Gecko/0101Firefox/46.0'

I052407:54:34.24089827503http.cpp:312]HTTPGETfor/master/statefrom124.193.167.1:18148withUser-Agent='Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/50.0.2661.75Safari/537.36'

I052407:54:43.75538327504http.cpp:312]HTTPGETfor/master/statefrom192.168.0.33:37798withUser-Agent='Mozilla/5.0(WindowsNT6.1;rv:46.0)Gecko/0101Firefox/46.0'

8.要支持Docker任务,一定要添加这两个文件到salve下。

/etc/mesos-slave/{containerizers,executor_registration_timeout }

参考文档:

/getting-started/install/

/watch?v=hZNGST2vIds&feature=youtu.be

/watch?v=EgYyf3bSb8Q

/watch?v=_uw1ISM_uRU

欢迎补充!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。