文章目录
  1. 1. 准备工作
  2. 2. 搭建环境
  3. 3. 运行容器
  4. 4. 管理应用
  5. 5. 注意事项

Apache Mesos把自己定位成一个数据中心操作系统,它能管理上万台的从机(slave)。Framework相当于这个操作系统的应用程序,每当应用程序需要执行,Framework就会在Mesos中选择一台有合适资源(cpu、内存等)的从机来运行。Marathon是Framework的一种,被设计来支持长时间运行的服务。本文尝试从零开始用docker搭建Mesos和Marathon的运行环境,并用此环境长时间运行docker容器。

准备工作

我们需要先安装virtualBoxvagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test,运行以下命令:

virtual box host
1
2
3
4
mkdir test
cd test
vagrant init minimum/ubuntu-trusty64-docker
vi Vagrantfile

里面应该有一句config.vm.box = "minimum/ubuntu-trusty64-docker",在它的下面添加如下几行代码,相当于给它分配两台虚拟机,一台叫做master,它的IP是192.168.33.18;另一台叫做slave,它的IP是192.168.33.19

Vagrantfile
1
2
3
4
5
6
7
8
9
config.vm.define "master" do | host |
host.vm.hostname = "master"
host.vm.network "private_network", ip: "192.168.33.18"
end
config.vm.define "slave" do | host |
host.vm.hostname = "slave"
host.vm.network "private_network", ip: "192.168.33.19"
end

这个vagrant镜像已经在ubuntu的基础上帮我们安装了docker,用起来很方便。然后分别在两个终端运行以下命令启动并连接两台虚拟机。

virtual box host terminal 1
1
2
vagrant up
vagrant ssh master

virtual box host terminal 2
1
vagrant ssh slave

搭建环境

在master的虚拟机上启动zookeeper:

master
1
2
3
4
5
6
docker run -d \
--net=host \
--name=zk \
-e MYID=1 \
-e SERVERS=192.168.33.18 \
mesoscloud/zookeeper:3.4.6-ubuntu-14.04

可以用docker ps看到名为zk的容器已经启动起来了。有兴趣的话,可以用下面的命令验证:

master
1
docker exec -it zk zkCli.sh -server 127.0.0.1:2181

这里就不详细介绍zookeeper的命令了,ls /可以查看根节点,help可以查看所有命令,quit退出客户端。

接下来在master的虚拟机上启动mesos master:

master
1
2
3
4
5
6
7
8
9
docker run -d \
--net=host \
--name=mm \
-e MESOS_HOSTNAME=192.168.33.18 \
-e MESOS_IP=192.168.33.18 \
-e MESOS_ZK=zk://192.168.33.18:2181/mesos \
-e MESOS_QUORUM=1 \
-e MESOS_LOG_DIR=/var/log/mesos \
mesoscloud/mesos-master:0.24.1-ubuntu-14.04

顺利的话,打开http://192.168.33.18:5050/应该能看到下图:

然后在slave的虚拟机上启动mesos slave:

slave
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker run -d \
--net=host \
--pid=host \
--privileged=true \
--name=ms1 \
-v /usr/bin/docker:/usr/bin/docker \
-v /dev:/dev \
-v /usr/lib/x86_64-linux-gnu/libapparmor.so.1:/usr/lib/x86_64-linux-gnu/libapparmor.so.1:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/log/mesos:/var/log/mesos \
-v /tmp/mesos:/tmp/mesos \
-e MESOS_HOSTNAME=192.168.33.19 \
-e MESOS_IP=192.168.33.19 \
-e MESOS_MASTER=zk://192.168.33.18:2181/mesos \
-e MESOS_CONTAINERIZERS=docker,mesos \
mesoscloud/mesos-slave:0.24.1-ubuntu-14.04

点击mesos页面上的Slaves应该能看到下图,这说明slave节点已经关联到mesos master了:

最后在master的虚拟机上启动marathon:

master
1
2
3
4
5
6
docker run -d \
--net=host \
--name=ma \
mesosphere/marathon:v0.15.0 \
--master zk://192.168.33.18:2181/mesos \
--zk zk://192.168.33.18:2181/marathon

点击mesos页面上的Frameworks应该能看到下图,这说明marathon已经作为一个framework关联到mesos master了:

我们还可以打开http://192.168.33.18:8080/感知一下marathon:

运行容器

在marathon的页面上,点击Create Application按钮,然后填入如下参数:

  • ID:test
  • Command:sleep 30
  • Image:busybox

如下图所示:

点击+ Create按钮,不一会儿,就能看见有一个名为test的应用程序正在运行。同时,在mesos的主页上也能看到有一个任务运行起来了。如果手慢一点或者喝了杯茶,还能看见有几个任务已经是完成的状态了,这是因为我们只让这个容器sleep 30存活30秒钟,如果容器自己停止了,marathon就会帮助再重新启动一个。另外还可以在slave的虚拟机上用docker ps看到busybox容器已经启动起来了。

管理应用

Marathon也能很方便地对容器进行扩缩容。当容器启动起来后,在Health栏里会有一个的按钮,按下按钮如下图所示:

里面的Scale按钮提供了一个比较易用的方法,让我们能轻易地改变容器的数量。可以试试在弹出的界面上填2,然后点击Scale Application按钮,就会看到Running Instances很快就变成了2 of 2,点击这一行,就能看到这两个实例的状态,还可以分别下载它们的日志。同时,在mesos的主页上也能看到又多了一个运行中的任务。另外,在slave的虚拟机上用docker ps也能看到2个busybox的容器实例。

除了扩缩容,还能重新启动应用、暂停应用(实际上就是把它缩容为0个实例)和删除应用等。另外,在test这个Application的Configuration页上,还支持修改这个Application的启动参数。比如还可以在这里设置基于TCP、HTTP或者命令的健康检查,设置环境变量等多种操作。如下图所示:

注意事项

  1. 如果第一次运行一个比较大的镜像,可能需要比较长的下载时间。在这种情况下,需要往mesos master的启动参数里增加-e MESOS_EXECUTOR_REGISTRATION_TIMEOUT=10mins,否则可能会报timeout的错误,默认是1分钟。还得在marathon的启动参数里增加--task_launch_timeout=600000,默认为300000毫秒,即5分钟。
  2. 如果一个容器老是启动不起来,可能是分配给它的资源太少。可以在marathon新建应用的窗口里指定分配给此应用的CPU和内存,默认是0.1和16MB。但是不要超过mesos slave能提供的资源哦。
  3. 如果你是坚定不移的命令行狂人,可以用curl来发送一个http请求来运行容器。还是用上面的test来举例子,先随便在哪台机器找个路径生成一个test.json文件,内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    {
    "id": "test",
    "cmd": "sleep 30",
    "cpus": 0.1,
    "mem": 16.0,
    "container": {
    "type": "DOCKER",
    "volumes": [],
    "docker": {
    "image": "busybox",
    "privileged": false,
    "parameters": [],
    "forcePullImage": false
    }
    }
    }

然后运行以下命令来发送请求给marathon:

1
curl -X POST http://192.168.33.18:8080/v2/apps -d @test.json -H "Content-type: application/json"

打开marathon的页面就能看见这个应用在跑啦。想要删掉它?当然没问题:

1
curl -X DELETE http://192.168.33.18:8080/v2/apps/test -H "Content-type: application/json"

文章目录
  1. 1. 准备工作
  2. 2. 搭建环境
  3. 3. 运行容器
  4. 4. 管理应用
  5. 5. 注意事项