Apache Mesos(11)-使用Aurora创建任务

目录
  1. Aurora的简单介绍
  2. Aurora的部署
    1. 安装Schedule
    2. 安装worker components
    3. 安装client
  3. 部署应用程序
    1. 部署简单应用程序
    2. 部署基于Docker的应用程序

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

前面的文章我们对Marathon和Chronos有了认识,本篇我们研究一下Apache Aurora,由Twitter开发的Mesos框架,用于简化关于部署程序和Cron任务的操作。虽然Aurora被认为比Marathon和Chronos更加难于配置和部署,但它提供更为强大的功能。

Aurora的简单介绍

Aurora主要由以下几个模块组成:

  • Scheduler
  • Client(两个,一个用于普通用户另一个用于管理员)
  • Executor
  • Observer

这些模块组成了可以在Mesos集群上运行程序和计划任务的平台。Schedule模块是进入Aurora集群的主接口,而命令行client给用户提供了创建、更新和删除任务的一种方式。Executor和Observer为运行和监控任务提供了一致的执行环境,同时admin client允许操作员管理整个集群。
Aurora框架和其它框架有如下对比:
“Aurora、Marathon和Chronos对比”

关于Aurora的详细介绍可以参考官方网站

Aurora的部署

较旧版本的Aurora需要从源代码编译,并且需要编写一些启动脚本以及配置文件,从0.12.0版以后,官方提供的安装包就比较完善了,提供了主流的rpm包及deb格式的包。这里我们使用目前的最新版本0.15.0来进行安装部署。
假设已经有安装配置好的Mesos集群(使用包管理器安装会检测依赖,需要系统中已经安装了Mesos的包),并且使用的是CentOS7的发行版。安装过程如下:

安装Schedule

Schedule需要安装到与Mesos master和ZooKeeper相同的节点上,执行如下命令:

wget -c https://apache.bintray.com/aurora/centos-7/aurora-scheduler-0.15.0-1.el7.centos.aurora.x86_64.rpm
sudo yum install -y aurora-scheduler-0.15.0-1.el7.centos.aurora.x86_64.rpm

默认情况下,需要初始化数据库:

sudo -u aurora mkdir -p /var/lib/aurora/scheduler/db
sudo -u aurora mkdir -p /var/lib/aurora/scheduler/db

配置文件位置为/etc/sysconfig/aurora-scheduler。
安装完成后,启动Schedule服务:sudo systemctl start aurora-schedule

安装worker components

Worker components需要安装到与Mesos slave相同的节点上,执行如下命令:

wget -c https://apache.bintray.com/aurora/centos-7/aurora-executor-0.15.0-1.el7.centos.aurora.x86_64.rpm
sudo yum install -y aurora-executor-0.15.0-1.el7.centos.aurora.x86_64.rpm

配置work components只需要注意在/etc/sysconfig/thermos里将--mesos-root的值设置设置为与Mesos slave的--work_dir相同的值,以便于observer找到正确的Mesos工作目录。
安装完成后,启动thermos服务:sudo systemctl start thermos

安装client

Client可以安装在任何机器上,执行如下命令:

wget -c https://apache.bintray.com/aurora/centos-7/aurora-executor-0.15.0-1.el7.centos.aurora.x86_64.rpm
sudo yum install -y aurora-executor-0.15.0-1.el7.centos.aurora.x86_64.rpm

默认情况下,client读取名为clusters.json的配置文件,位于/etc/aurora/clusters.json或~/.aurora/clusters.json位置。这里给出一个示例:

clusters.json
1
2
3
4
5
6
7
8
9
10
[
{
"auth_mechanism": "UNAUTHENTICATED",
"name": "aurora-cluster",
"scheduler_zk_path": "/aurora/scheduler",
"slave_root": "/var/lib/mesos",
"slave_run_directory": "latest",
"zk": "centos7-A,centos7-B,centos7-C"
}
]

所有模块安装完成并启动后,使用如下的URLs来确认schedule和observer启动并运行:

更加详细的安装方法请参考官方文档

部署应用程序

部署简单应用程序

使用Aurora部署应用,首先需要使用Aurora DSL创建配置文件。下面给出了一个示例配置文件:

outputenv.aurora
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# outputenv.aurora
# Run the OutputEnv example application on Apache Aurora.
# Assumes that Ruby and Bundler are already available on your infrastructure.
# vim: set ft=python:
# The URL to the tarball that contains the application
tarball = 'https://github.com/rji/mesos-in-action-code-samples/archive/master.tar.gz'
# Download
download = Process(name='download', cmdline=' '.join(['curl -LO', tarball]))
# Extract
extract = Process(name='extract', cmdline='tar zxf master.tar.gz')
# Run
# Note: the app expects $PORT to be set, otherwise it falls back to port 8080.
# We set $PORT using an available port, as provided by {{thermos.ports[http]}}
run = Process(name='run', cmdline="""
cd mesos-in-action-code-samples-master/output-env-app && \
bundle install --retry 3 && \
PORT={{thermos.ports[http]}} bundle exec ruby app.rb
""")
# Create a new SequentialTask that downloads, extracts, and runs the app,
# in that order.
task = SequentialTask(
processes=[download, extract, run],
resources=Resources(cpu=0.1, ram=128*MB, disk=1*GB)
)
jobs = [
Service(
cluster='aurora-cluster',
role='www-data',
environment='prod',
name='outputenv',
task=task,
instances=1)
]

上面的配置文件配置了一个name为outputenv的job,这个job包含一个名为task的task,这个task又是由3个按顺序发生的process组成,这3个process的名称分别为download,extract和run。还要注意cluster字段的名称需要和客户端clusters.json配置文件里name字段保存一致。还要注意Mesos master启动时指定了--roles=www-data选项,并且每个slave节点上存在www-data的用户。然后使用下面的命令来提交任务:

$ aurora job create aurora-cluster/www-data/prod/outputenv outputenv.aurora

如果部署成功,应该看到如下的控制台输出:

INFO] Creating job outputenv
INFO] Checking status of aurora-cluster/www-data/prod/outputenv
Job create succeeded: job url=http://192.168.71.167:8081/scheduler/www-data/prod/outputenv

这时可以查看Aurora的web界面来查看任务的状态。
“Aurora、Marathon和Chronos对比”
“Aurora、Marathon和Chronos对比”

部署基于Docker的应用程序

目前通过Aurora有两种方法可以运行Docker容器:

  • 第一种在DSL文件中的Service定义部分,指定container字段,来启动某个image。如果该容器运行的服务需要监听网络的某个端口,则可以以如下方式构建镜像:可以通过环境变量来设置监听端口(如$PORT),或者是以参数的方式传入到容器里的启动脚本中。上述方法的Aurora DSL看起来大概像是:

    1
    2
    3
    4
    5
    6
    7
    8
    p = Process(cmdline='./run_server.py --port {{thermos.ports[http]}}')
    t = Task(processes=[p])
    jobs = [
    Service(
    task=t,
    container=Container(docker=Docker(image='user/image:version'))
    )
    ]
  • 第二种方式是绕过Aurora提供的内置的Docker功能,直接运行docker run命令,毕竟它只是一个进程。这样可以使用docker run的所有功能。下面的代码演示了做法:

    docker-nginx.aurora
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # docker-nginx.aurora
    # Run the Nginx Docker container Apache Aurora by invoking the `docker run`
    # command from a process within an Aurora task.
    # vim: set ft=python:
    docker = Process(
    name='docker-run-nginx',
    cmdline='docker run -p {{thermos.ports[http]}}:80 nginx:1.9'
    )
    task = Task(
    processes=[docker],
    resources=Resources(cpu=0.1, ram=128*MB, disk=1*GB)
    )
    jobs = [
    Service(
    cluster='aurora-cluster',
    role='www-data',
    environment='prod',
    name='docker-nginx',
    task=task
    )
    ]

注意上面的例子是以www-data用户来运行的任务,如果在Mesos slave上此用户不存在或者并不在docker组中,任务会失败。必须添加此用户并且将该用户加入docker组中。

本篇我们了解了Aurora的部署程序的功能。下篇看看其对Cron任务的支持及对它的管理。