用容器轻松搭建Chronos运行环境
Apache Mesos把自己定位成一个数据中心操作系统,它能管理上万台的从机(slave)。Framework相当于这个操作系统的应用程序,每当应用程序需要执行,Framework就会在Mesos中选择一台有合适资源(cpu、内存等)的从机来运行。Chronos是Framework的一种,被Airbnb公司设计用来代替cron执行作业。本文尝试从零开始用docker搭建Mesos和Chronos的运行环境,并用此环境运行作业。
准备工作
参考《用容器轻松搭建Marathon运行环境》的准备工作一节,用vagrant搭建两台虚拟机master和slave。
搭建环境
参考《用容器轻松搭建Marathon运行环境》的搭建环境一节,跳过marathon部分。
搭建mesos master和slave环境完成后,最后在master的虚拟机上启动chronos:
我们还可以打开http://192.168.33.18:8080/
感知一下chronos:
运行作业
在chronos的页面上,点击New Job按钮,然后填入如下参数:
- NAME:test
- COMMAND:docker run -d busybox sleep 30
- SCHEDULE P:T1M
如下图所示:
点击Create按钮,立刻就能看见有一个名为test的作业正在运行。同时,在mesos的主页上也能看到有一个任务运行起来了。如果手慢一点或者喝了杯茶,还能看见有几个任务已经是完成的状态了,这是因为根据我们设置的T1M,1分钟之后,chronos就会帮助再重新启动一次作业。另外还可以在slave的虚拟机上用docker ps -a
看到busybox容器已经启动起来了。
T1M的意思是:1分钟之后。1M的意思是:1个月之后。1Y2M3DT4H5M6S的意思是:1年2月3天4小时5分钟6秒之后。
管理作业
新建作业的窗口里还有一个Other settings的链接,是可以在里面设置一些高级功能的,比如说CPU、内存和磁盘,默认是0.1、128MB和256MB,还能设置作业优先级、运行方式等。已经生成的作业也可以再次修改、强制运行、复制和删除。作业也可以是一次性的,只要把SCHEDULE R设成0就可以了,记得同时调整一下时间T哦。
作业直接还可以指定依赖。我们再创建一个如下作业:
- NAME:test2
- COMMAND:date >> /tmp/test.txt
- PARENTS: test
这回我们并没有设置SCHEDULE,而是设置了一个PARENTS为test,它的意思就是当test运行成功时,运行这个test2的作业。等1分钟,test作业再次运行后,在slave虚拟机上运行docker exec ms1 cat /tmp/test.txt
就能看到当前时间已经被写进/tmp/test.txt
文件中,test2作业也被成功运行了。
我们再创建第三个作业:
- NAME:test3
- COMMAND:echo “hello world” >> /tmp/test.txt
- PARENTS: test, test2
这次test3依赖于test和test2,那么它们之间是“或”还是“和”的关系呢?我们强制运行一次test,在slave虚拟机上运行docker exec ms1 cat /tmp/test.txt
就能看到增加了一行日期和一行hello world。强制运行一次test2,却只增加了一行日期而没有增加hello world。由此推断,只有当test2和test全部被执行后,才会执行一次test3。那如果我们要“或”的关系怎么办呢?首先把test3的PARENTS修改为test,记得作业是有一个复制功能的吧?再复制一份test3把它的PARENTS设成test2就好啦。
最后介绍一下那个Graph按钮,它可以显示一幅图来表示作业之间的依赖关系。对于我们的示例来说,这图应该是长这样的:
对于一个非常复杂的作业系统来说,这样的图能让我们很容易找到并分析作业间的依赖关系,从而采取优化措施。许多持续集成系统也都能提供类似的依赖图供管理员决策。
注意事项
- 这个版本的chronos页面上有一些bug,会导致有时候侧面的作业详细信息栏显示有问题,刷新一下整个页面或者尝试多点击几次左边的作业表就好了。
- 还是页面的bug,有时候新建作业时会提示需要输入OWNER(S),这是个Email地址,这样当作业出错时会通知这个Email。可是我们的测试应该是不需要错误通知的。当你看到这个提示的时候,随便输个自己的邮箱就好啦。
- 像marathon一样,chronos也支持REST API,我们可以来试一下。先随便在哪台机器找个路径生成一个
test4.json
文件,内容如下:1234567{"parents": ["test"],"name": "test4","command": "echo test4 >> /tmp/test.txt"}
然后运行以下命令来发送请求给chronos:
刷新chronos的页面就能看见这个作业在跑啦。想要删掉它?当然没问题: