Apache Mesos(9)-使用Chronos运行计划任务

目录
  1. 安装和配置Chronos
  2. 使用Chronos创建简单任务
    1. 创建基于命令行的任务
      1. 使用web界面创建任务
      2. 使用REST API创建任务
    2. 创建基于Docker的任务

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

本篇我们来看看Mesos框架Chronos。如果您将Mesos看成“分布式系统的内核”,则Chronos相当于Linux的Cron系统或Windows的计划任务:它处理Mesos集群上基于时间的计划任务。Chronos支持在cgroups内运行命令以及Docker容器。

安装和配置Chronos

对于安装Marathon(Version 2.4.0),需要满足以下的一些先决条件:

  • Java 1.7+
  • Mesos 0.22.2+
  • ZooKeeper+

安装Chronos的最简单的方法是通过Mesosphere提供的安装源,使用包管理器进行安装。根据Linux的发行版,使用如下命令安装Chronos:

  • RHEL/CentOS:sudo yum install Chronos
  • Ubuntu:sudo apt-get install Chronos

也可以使用Tarball或者编译安装,还可以通过Docker的镜像,将Chronos作为Marathon的一个任务运行。

如果是通过Mesosphere提供的安装源安装的Chronos,可以使用基于文件的配置,配置文件的位置在/etc/chronos/conf/文件夹。

Chronos的详细的安装和配置可以参考官方文档

使用Chronos创建简单任务

可以通过Chronos创建一个独立的、不依赖于其它任务的任务。它没有任何对其它Chronos任务的父子依赖关系。这可以是类似于每天发送邮件或者每晚进行数据库备份的任务。

创建基于命令行的任务

在Chronos中的计划任务,是通过JSON对象描述的,它包含至少以下几项:

  • Schedule计划表
  • 名称(也可以称为ID)
  • 命令

计划表是由3部分组成,由/分开,如下图所示:
“schedule”
了解了Chronos计划任务的格式后,你可以很容易得理解任务开始的时间,间隔多长时间任务重复执行,以及任务重复执行的次数(包括无限次)。上图的例子表示每10分钟运行一次任务,它开始执行的时间是2015年10月5日10:00pm,它重复执行无限次。

关于ISO8601日期/时间的格式标准,参考https://en.wikipedia.org/wiki/ISO_8601

使用web界面创建任务

通过web界面来创建计划任务非常直观,通过访问http://your-chronos-ip:4400,打开web界面,点击New job按钮,在右边的面板中填入相关信息,如下图:
“通过web界面创建计划任务”

使用REST API创建任务

REST API包括web UI没有提供的功能,如Docker容器信息,时区支持,使用Mesos fetcher来下载文件到任务的工作目录中。下面的JSON文件创建了一个计划任务:

new-sleep-job.json
1
2
3
4
5
6
7
8
9
{
"schedule": "R/2016-08-05T06:25:00Z/PT24H",
"name": "new-sleep-job",
"description": "Sleep for 60 seconds and return.",
"cpus": 0.5,
"mem": 256,
"disk": 500,
"command": "sleep 60"
}

使用curl命令提交到Chronos:

$ curl -H 'Content-Type: application/json' -d @simple-sleep.json http://your-chronos-ip:4400/scheduler/iso8601

创建基于Docker的任务

Docker容器允许你将代码和它的依赖一起打包成一个镜像,以一个单一的artifact分发到集群中的任何节点上。这极大地方便了程序的部署。
Mesos集群环境中,一个很有用的功能是:Mesos任务的工作目录自动地映射到容器内部的某一路径,这样就可以继续使用Mesos提供的功能,如通过fetcher下载你计划任务需要使用的文件或脚本。
我们来看一个例子。这个例子根据用户指定的U.S.邮政编码给用户发送这个地区的天气预报:

simple-docker.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"schedule": "R/2016-08-05T08:00:00.000Z/PT24H",
"name": "daily-forecast-97201",
"description": "The daily NWS weather forecast for Portland, OR",
"container": {
"type": "DOCKER",
"image": "python:3.4.3"
},
"cpus": 0.1,
"mem": 128.0,
"owner": "user@example.com",
"uris": [
"https://raw.githubusercontent.com/rji/mesos-in-action-code-samples/master/email-weather-forecast.py"
],
"command": "cd $MESOS_SANDBOX && python3 email-weather-forecast.py",
"environmentVariables": [
{ "name": "TO_EMAIL_ADDR", "value": "user@example.com" },
{ "name": "FROM_EMAIL_ADDR", "value": "weather@example.com" },
{ "name": "ZIP_CODE", "value": "97201" },
{ "name": "MAIL_SERVER", "value": "smtp.gmail.com:587" },
{ "name": "MAIL_USERNAME", "value": "weather@example.com" },
{ "name": "MAIL_PASSWORD", "value": "ItsTopSecret!" }
]
}

上述代码第5-8行指定了需要使用的Docker镜像,第11行指定了当任务失败后,Chronos将发送通知邮件到该地址,第12-14行指定了脚本文件的下载地址,第15行指定了需要运行的命令,剩下的几行代码指定了脚本需要用到的环境变量的值。你可以将MAIL_USERNAME和MAIL_PASSWORD换成你gmail的账号和密码。然后通过下面的命令提交到Chronos:

$ curl -H 'Content-Type: application/json' -d @simple-docker.json http://your-chronos-ip:4400/scheduler/iso8601

如果要更新一个已经存在的任务的配置,只需要将同样的JSON文档使用HTTP的PUT方法而不是POST方法。如果使用的是curl,可以通过添加参数-X PUT来实现。

本篇我们安装了Chronos框架,并且使用它创建了基于命令行和Docker容器的计划任务。以上创建的任务都是独立的、不依赖于其它任务的任务,下篇我们创建一些有依赖关系的任务。