基于Mesos+Marathon+Zookeeper的Docker集群管理环境搭建过程分享

来源:互联网 发布:淘宝prd和mrd是什么 编辑:程序博客网 时间:2024/05/16 05:28

前言

本文为搭建高可用的基于Mesos+Marathon+Zookeeper管理Docker集群的环境,资源有限仅使用两台服务器进行环境搭建(多台同理)。

  • 系统环境:Ubuntu 14.04、JDK1.8
  • 所需工具:Mesos-1.1、Marathon-1.3.5、Docker-1.12.5、Zookeeper-3.4.9

  • 服务器分配(双主高可用集群):
    IP 192.168.8.68:Java、Mesos master、Mesos slave、Marathon、Docker、Zookeeper伪分布式环境
    IP 192.168.8.69:Java、Mesos master、Mesos slave、Marathon、Docker

安装、配置环境(两台服务器分别安装)

安装依赖:
$ apt-get install curl python-setuptools python-pip python-dev python-protobuf

环境依赖JDK安装JDK1.8(Mesos1.1依赖jdk1.7,Marathon1.3.5依赖JDK1.8,所以这里直接安装JDK1.8)

$ sudo add-apt-repository ppa:webupd8team/java$ sudo apt-get update$ sudo apt-get install oracle-java8-installer
安装mesos依赖环境
# Update the packages.$ sudo apt-get update# Install a few utility tools.$ sudo apt-get install -y tar wget git# Install autotools (Only necessary if building from git repository).$ sudo apt-get install -y autoconf libtool# Install other Mesos dependencies.$ sudo apt-get -y install build-essential python-dev libcurl4-nss-dev libsasl2-dev libsasl2-modules maven libapr1-dev libsvn-dev
两台服务器相互配置hosts
$ echo "192.168.8.68 mesos-2" >/etc/hosts$ echo "192.168.8.69 mesos-3" >/etc/hosts

安装zookeeper伪分布式环境

参考另一篇文章《安装zookeeper伪分布式环境》

安装配置Docker

执行命令(这里使用的是阿里云的一个自动安装脚本):
$ curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
确认docker安装
$ docker versionClient: Version:      1.12.5 API version:  1.24 Go version:   go1.6.4 Git commit:   7392c3b Built:        Fri Dec 16 02:30:42 2016 OS/Arch:      linux/amd64Server: Version:      1.12.5 API version:  1.24 Go version:   go1.6.4 Git commit:   7392c3b Built:        Fri Dec 16 02:30:42 2016 OS/Arch:      linux/amd64

安装配置Mesos

下载最新安装包
$ wget http://www.apache.org/dist/mesos/1.1.0/mesos-1.1.0.tar.gz$ tar -zxf mesos-1.1.0.tar.gz
编译安装Mesos

进入到Mesos目录,执行如下命令,

$ ./configure$ make -j5$ make check$ make -j5 install

编译Mesos过程的时间会很长,也会有编译失败失情况,一般主要有以下几个原因:
1.Maven的环境变量需要配置好
2.在编译构建过程中会下载远程的jar包等数据,由于国内网络的问题,有很多时候会导致网络无法连接,需要多重试几次

安装配置Marathon

下载最新版本的Marathon
$ curl -O http://downloads.mesosphere.com/marathon/v0.8.2/marathon-0.8.2.tgz$ tar xzf marathon-0.8.2.tgz

启动Mesos及Marathon

Mesos-master后台启动(两台服务器分别启动)
$ nohup /usr/local/mesos/sbin/mesos-master --ip=192.168.8.68 --zk=zk://192.168.8.68:2181,192.168.8.68:2182,192.168.8.68:2183,192.168.8.68:2184,192.168.8.68:2185/mesos --quorum=1 --work_dir=/usr/local/mesos/work_file --external_log_file= /usr/local/mesos/logs --cluster=mesos &

注意:
如果启动时报如下错误,需要将Mesos的lib加到系统环境变量中,
error while loading shared libraries: libmesos-1.1.0.so: cannot open shared object file: No such file or directory
这里写图片描述

Mesos服务启动后可通过浏览器访问(这里的IP可以是两台中的任何一台,经由Zookeeper选主,会自动跳转到Leader服务器的页面):

http://192.168.8.69:5050

这里写图片描述

另外,如果访问Mesos主页时出现了如下弹窗,
这里写图片描述

从浏览器调试窗口中可以看到有一个请求是这样的:http://mesos-3:5050/master/state?jsonp=angular.callbacks._2,mesos-3是我的Mesos-master的主机名而不是IP,

有一个临时的解决方案,修改本机hosts文件,添加主机名IP的映射,比如我的Mesos-master主机名是mesos-3,在hosts文件中追加配置,保存后刷新页面生效,就不会再有弹窗了

192.168.8.69 mesos-3
Mesos-slave后台启动命令(两台服务器分别启动),支持部署Docker容器
$ nohup /usr/local/mesos/sbin/mesos-slave --master=zk://192.168.8.68:2181,192.168.8.68:2182,192.168.8.68:2183,192.168.8.68:2184,192.168.8.68:2185/mesos --work_dir=/usr/local/mesos/work_file2 --containerizers=docker,mesos &

注意:
老版本Mesos-slave使用deimos管理docker,新版本不用了,直接在启动slave时追加--containerizers=docker,mesos参数即可,
新版本已经没有了--containerizer_path参数,也不需要指定--isolation参数

Marathon后台启动,进入到Mararthon目录后执行如下命令(两台服务器分别启动) :
$ nohup ./bin/start --master zk://192.168.8.68:2181,192.168.8.68:2182,192.168.8.68:2183,192.168.8.68:2184,192.168.8.68:2185/mesos --zk zk://192.168.8.68:2181,192.168.8.68:2182,192.168.8.68:2183,192.168.8.68:2184,192.168.8.68:2185/marathon &

Marathon 在端口8080已经启动侦听,我们可以通过浏览器访问(这里的IP可以是两台中的任何一台,经由Zookeeper选主,会自动跳转到Leader服务器的页面):

http://192.168.8.68:8080

这里写图片描述
Mesos和Marathon都是由zookeeper来选举Leader,但是选主过程彼此独立,就是有可能Mesos的Leader和Marathon的Leader不是同一台服务器。

通过Marathon创建一个任务

我们通过Marathon启动一个最简单的应用的REST API提交如下:
curl -X POST -H "Accept: application/json" -H "Content-Type: application/json" \localhost:8080/v2/apps -d '{"cpus": 0.5,"cmd": "sleep 500","id": "first-app","instances": 1,"mem": 300}'
运行后查看Marathon页面

这里写图片描述

REST API参考http://192.168.8.68:8080/api-console/index.html
这里写图片描述

我们通过在curl命令后选项”options”提交定制的Docker,我们能检查syslog ,因为mesos缺省日志是放在syslog中。

我们也能通过Marathon Rest API检查我们启动任务的状态:

$ curl -X GET -H "Content-Type: application/json" localhost:8080/v2/apps

使用Mesos部署从私有镜像仓库拉取的镜像

修改Docker源为私用仓库地址:
$ vi /etc/defult/docker#填加如下内容(私有仓库地址)DOCKER_OPTS='--insecure-registry 192.168.8.139:8888'
重启docker
$ service docker restart
Mesos-slave启动命令,需要指定Docker的配置文件:
$ nohup /usr/local/mesos/sbin/mesos-slave --master=zk://192.168.8.68:2181,192.168.8.68:2182,192.168.8.68:2183,192.168.8.68:2184,192.168.8.68:2185/mesos --work_dir=/usr/local/mesos/work_file2 --containerizers=docker,mesos --docker_config=file:///root/.docker/config.json  &
docker服务器只要登录过私有仓库,会自动在.docker/下生成config.json配置文件,启动Mesos-slave时指定这个配置文件即可

/root/.docker/config.json内容:

{    "auths": {        "192.168.8.139:8888": {            "auth": "XXXxxXXXXxXXXxxXXxx="        }    }}

俱体参考官方说明http://mesos.apache.org/documentation/latest/docker-containerizer/

通过MarathonAPI创建Docker容器应用(从私有仓库拉取),一个简单的例子:

curl -X POST -H "Accept: application/json" -H "Content-Type: application/json" \localhost:8080/v2/apps -d '{"id":"clbusoa123","container":{      "type": "DOCKER",      "volumes": [],      "docker": {        "image": "192.168.8.139:8888/clbusoa:201612071527",        "network": "BRIDGE",        "portMappings": [          {            "containerPort": 8080,            "hostPort": 0,            "servicePort": 10000,            "protocol": "tcp",            "name": "tomcat",            "labels": {}          }        ],        "privileged": false,        "parameters": [],        "forcePullImage": false      }},"cpus":1,"instances":2,"mem":800,"portDefinitions":[      {        "port": 10000,        "protocol": "tcp",        "labels": {}      }    ]}'
Marathon最终截图:

这里写图片描述

Mesos最终截图:

这里写图片描述

从截图中可以看到,有一个docker实例被自动分配到了mesos-2主机上,有两个docker实例被自动分配到了mesos-3主机上,在界面左下角也可以看到当前集群的资源情况。

更多关于Docker任务的信息可以通过Mesos GUI在Mesos主服务器的端口5050 ,现在我们测试一下任务的伸缩性,比如我们需要加入更多节点服务器,有两种办法,使用GUI或通过发出put请求。

Marathon能确保所有docker进程启动运行,如果某个进程崩溃,Marathon会重新启动同样的进程,以确保每个配置运行一个实例,还有其他开源Mesos调度器如Apache Aurora, Airbnb’s Chronos. 但是Marathon比较直接简单提供好的REST API用来管理容器,虽然Mesos, Marathon 和Docker还很年轻,但是提供了基于Docker的杀手级集群管理组合。

总结

整个搭建过程只是在编译Mesos时遇到了一坑,在编译过程中需要下载很多国外的资源,由于国内网络受限等原因,偶尔会有某个资源下载连接超时,从而导致编译会一直卡住或编译失败,这里用了很多时间折腾,其他地方都还算顺利。

后续将追加与Jenkins的集成,做一个基于Mesos+Marathon+Zookeeper+Docker+Jenkins的项目持续集成的解决方案。

另外Docker的集群管理,关于网络与监控的方案也需要额外花一些精力来研究搞定,之后陆续追加此类分享。

扫一扫,长按识别二维码关注我
不定期分享技术架构、运维、技术管理等内容文章
这里写图片描述

0 0