用容器轻松搭建Marathon运行环境
Apache Mesos把自己定位成一个数据中心操作系统,它能管理上万台的从机(slave)。Framework相当于这个操作系统的应用程序,每当应用程序需要执行,Framework就会在Mesos中选择一台有合适资源(cpu、内存等)的从机来运行。Marathon是Framework的一种,被设计来支持长时间运行的服务。本文尝试从零开始用docker搭建Mesos和Marathon的运行环境,并用此环境长时间运行docker容器。
准备工作
我们需要先安装virtualBox和vagrant。通过vagrant来驱动virtualBox搭建一个虚拟测试环境。首先在本地任意路径新建一个空文件夹比如test
,运行以下命令:
里面应该有一句config.vm.box = "minimum/ubuntu-trusty64-docker"
,在它的下面添加如下几行代码,相当于给它分配两台虚拟机,一台叫做master,它的IP是192.168.33.18;另一台叫做slave,它的IP是192.168.33.19。
这个vagrant镜像已经在ubuntu的基础上帮我们安装了docker,用起来很方便。然后分别在两个终端运行以下命令启动并连接两台虚拟机。
|
|
搭建环境
在master的虚拟机上启动zookeeper:
可以用docker ps
看到名为zk的容器已经启动起来了。有兴趣的话,可以用下面的命令验证:
这里就不详细介绍zookeeper的命令了,ls /
可以查看根节点,help
可以查看所有命令,quit
退出客户端。
接下来在master的虚拟机上启动mesos master:
顺利的话,打开http://192.168.33.18:5050/
应该能看到下图:
然后在slave的虚拟机上启动mesos slave:
点击mesos页面上的Slaves应该能看到下图,这说明slave节点已经关联到mesos master了:
最后在master的虚拟机上启动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或者命令的健康检查,设置环境变量等多种操作。如下图所示:
注意事项
- 如果第一次运行一个比较大的镜像,可能需要比较长的下载时间。在这种情况下,需要往mesos master的启动参数里增加
-e MESOS_EXECUTOR_REGISTRATION_TIMEOUT=10mins
,否则可能会报timeout的错误,默认是1分钟。还得在marathon的启动参数里增加--task_launch_timeout=600000
,默认为300000毫秒,即5分钟。 - 如果一个容器老是启动不起来,可能是分配给它的资源太少。可以在marathon新建应用的窗口里指定分配给此应用的CPU和内存,默认是0.1和16MB。但是不要超过mesos slave能提供的资源哦。
- 如果你是坚定不移的命令行狂人,可以用
curl
来发送一个http请求来运行容器。还是用上面的test来举例子,先随便在哪台机器找个路径生成一个test.json
文件,内容如下:12345678910111213141516{"id": "test","cmd": "sleep 30","cpus": 0.1,"mem": 16.0,"container": {"type": "DOCKER","volumes": [],"docker": {"image": "busybox","privileged": false,"parameters": [],"forcePullImage": false}}}
然后运行以下命令来发送请求给marathon:
打开marathon的页面就能看见这个应用在跑啦。想要删掉它?当然没问题: