本文为搭建高可用的基于Mesos+Marathon+Zookeeper管理Docker集群的环境,资源有限仅使用两台服务器进行环境搭建(多台同理)。
所需工具: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
# 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
$ echo "192.168.8.68 mesos-2" >/etc/hosts
$ echo "192.168.8.69 mesos-3" >/etc/hosts
参考另一篇文章《安装zookeeper伪分布式环境》
$ curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
$ docker version
Client:
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
Server:
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
$ 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目录,执行如下命令,
$ ./configure
$ make -j5
$ make check
$ make -j5 install
编译Mesos过程的时间会很长,也会有编译失败失情况,一般主要有以下几个原因:
1.Maven的环境变量需要配置好
2.在编译构建过程中会下载远程的jar包等数据,由于国内网络的问题,有很多时候会导致网络无法连接,需要多重试几次
$ curl -O http://downloads.mesosphere.com/marathon/v0.8.2/marathon-0.8.2.tgz
$ tar xzf marathon-0.8.2.tgz
$ 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
从浏览器调试窗口中可以看到有一个请求是这样的: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
$ 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
参数
$ 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不是同一台服务器。
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
}'
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
$ vi /etc/defult/docker
#填加如下内容(私有仓库地址)
DOCKER_OPTS='--insecure-registry 192.168.8.139:8888'
$ service docker restart
$ 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 &
/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": {}
}
]
}'
从截图中可以看到,有一个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的集群管理,关于网络与监控的方案也需要额外花一些精力来研究搞定,之后陆续追加此类分享。