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

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

准备工作

参考《用容器轻松搭建Marathon运行环境》的准备工作一节,用vagrant搭建两台虚拟机masterslave

搭建环境

参考《用容器轻松搭建Marathon运行环境》的搭建环境一节,跳过marathon部分。

搭建mesos master和slave环境完成后,最后在master的虚拟机上启动chronos:

master
1
2
3
4
5
6
7
8
docker run -d \
--net=host \
--name=ch \
mesosphere/chronos:chronos-2.4.0-0.1.20150828104228.ubuntu1404-mesos-0.27.0-0.2.190.ubuntu1404 \
usr/bin/chronos \
--master zk://192.168.33.18:2181/mesos \
--zk_hosts zk://192.168.33.18:2181/marathon \
--cluster_name ggg

我们还可以打开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按钮,它可以显示一幅图来表示作业之间的依赖关系。对于我们的示例来说,这图应该是长这样的:

对于一个非常复杂的作业系统来说,这样的图能让我们很容易找到并分析作业间的依赖关系,从而采取优化措施。许多持续集成系统也都能提供类似的依赖图供管理员决策。

注意事项

  1. 这个版本的chronos页面上有一些bug,会导致有时候侧面的作业详细信息栏显示有问题,刷新一下整个页面或者尝试多点击几次左边的作业表就好了。
  2. 还是页面的bug,有时候新建作业时会提示需要输入OWNER(S),这是个Email地址,这样当作业出错时会通知这个Email。可是我们的测试应该是不需要错误通知的。当你看到这个提示的时候,随便输个自己的邮箱就好啦。
  3. 像marathon一样,chronos也支持REST API,我们可以来试一下。先随便在哪台机器找个路径生成一个test4.json文件,内容如下:
    1
    2
    3
    4
    5
    6
    7
    {
    "parents": [
    "test"
    ],
    "name": "test4",
    "command": "echo test4 >> /tmp/test.txt"
    }

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

1
curl -X POST http://192.168.33.18:8080/scheduler/dependency -d @test4.json -H "Content-type: application/json"

刷新chronos的页面就能看见这个作业在跑啦。想要删掉它?当然没问题:

1
curl -X DELETE http://192.168.33.18:8080/scheduler/job/test4 -H "Content-type: application/json"

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