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

前言

本文为搭建高可用的基于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 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

安装配置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+Marathon+Zookeeper的Docker集群管理环境搭建过程分享_第1张图片

另外,如果访问Mesos主页时出现了如下弹窗,
基于Mesos+Marathon+Zookeeper的Docker集群管理环境搭建过程分享_第2张图片

从浏览器调试窗口中可以看到有一个请求是这样的: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的Docker集群管理环境搭建过程分享_第3张图片
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页面

基于Mesos+Marathon+Zookeeper的Docker集群管理环境搭建过程分享_第4张图片

REST API参考http://192.168.8.68:8080/api-console/index.html
基于Mesos+Marathon+Zookeeper的Docker集群管理环境搭建过程分享_第5张图片

我们通过在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+Marathon+Zookeeper的Docker集群管理环境搭建过程分享_第6张图片

Mesos最终截图:

基于Mesos+Marathon+Zookeeper的Docker集群管理环境搭建过程分享_第7张图片

从截图中可以看到,有一个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集群管理环境搭建过程分享_第8张图片

你可能感兴趣的:(环境搭建)