基于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的集群管理,关于网络与监控的方案也需要额外花一些精力来研究搞定,之后陆续追加此类分享。
扫一扫,长按识别二维码关注我
不定期分享技术架构、运维、技术管理等内容文章
- 基于Mesos+Marathon+Zookeeper的Docker集群管理环境搭建过程分享
- mesos+marathon+zookeeper的docker管理集群亲手搭建实例(详细)
- mesos+marathon+zookeeper的docker管理集群亲手搭建实例(详细)
- 基于Mesos+Marathon+Zookeeper的Docker容器管理平台
- Bluemix平台一步一步搭建ZooKeeper + Mesos + Marathon平台管理Docker集群之一
- Bluemix平台一步一步搭建ZooKeeper + Mesos + Marathon平台管理Docker集群之二
- Mesos+Zookeeper+Marathon+Docker分布式集群管理最佳实践
- Mesos+ZooKeeper+Marathon+Docker
- 使用Mesos和Marathon管理Docker集群
- 使用Mesos管理Docker集群(Mesos + Marathon + Chronos + Docker)
- Mesos+Docker+Marathon环境搭建教程
- Mesos+Docker+Marathon环境搭建教程
- Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)
- Mesos+Zookeeper+Marathon的Docker管理平台部署记录(1)
- Docker系列之(二):使用Mesos管理Docker集群(Mesos + Marathon + Chronos + Docker)
- Docker系列之(二):使用Mesos管理Docker集群(Mesos + Marathon + Chronos + Docker)
- 基于 Mesos、Marathon、Docker环境的 Jenkins 持续集成及配置管理
- centos7配置zookeeper+mesos+marathon+docker
- Shell输入密码时关闭屏幕回显
- Ubuntu Tty (字符终端) 显示中文,和字体大小设置
- 一个经典的Makefile实例
- [leetcode]58. Length of Last Word
- 关于微信小程序的好奇和多事
- 基于Mesos+Marathon+Zookeeper的Docker集群管理环境搭建过程分享
- 开发从奢侈到精细的时代
- java 类型信息 instanceof 和 isInstance区别
- HTTP协议详解(真的很经典)
- 使用MAVEN+Jacoco统计单元测试的代码覆盖率
- android DrawerLayout侧边栏实现
- 第三方登录的原理
- 单位rem
- mysql 获取上一条limit语句符合条件的总数