基于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
  • 1

环境依赖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
  • 1
  • 2
  • 3
安装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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
两台服务器相互配置hosts
$ echo "192.168.8.68 mesos-2" >/etc/hosts
$ echo "192.168.8.69 mesos-3" >/etc/hosts
  • 1
  • 2

安装zookeeper伪分布式环境

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

安装配置Docker

执行命令(这里使用的是阿里云的一个自动安装脚本):
$ curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
  • 1
确认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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

安装配置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
  • 1
  • 2
  • 3
编译安装Mesos

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

$ ./configure
$ make -j5
$ make check
$ make -j5 install
  • 1
  • 2
  • 3
  • 4

编译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
  • 1
  • 2
  • 3

启动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 &
  • 1

注意: 
如果启动时报如下错误,需要将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
  • 1

这里写图片描述

另外,如果访问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
  • 1
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 &
  • 1

注意: 
老版本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 &
  • 1

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

http://192.168.8.68:8080
  • 1

这里写图片描述
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
}'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
运行后查看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
  • 1

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

修改Docker源为私用仓库地址:
$ vi /etc/defult/docker

#填加如下内容(私有仓库地址)
DOCKER_OPTS='--insecure-registry 192.168.8.139:8888'
  • 1
  • 2
  • 3
  • 4
重启docker
$ service docker restart
  • 1
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  &
  • 1
docker服务器只要登录过私有仓库,会自动在.docker/下生成config.json配置文件,启动Mesos-slave时指定这个配置文件即可

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

{
    "auths": {
        "192.168.8.139:8888": {
            "auth": "XXXxxXXXXxXXXxxXXxx="
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

俱体参考官方说明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": {}
      }
    ]
}'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
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的项目持续集成的解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值