Marathon 是运行在 Mesos 之上的应用管理平台、运维平台。 本文将学习 Marathon 的基本概念、部署管理和使用方法。

前文中我们已通过Mesos 实战-1:Mesos 起步部署一套 Mesos 集群,通过Mesos 实战-2:Mesos 框架初探了解 Mesos 框架的基本结构。 在框架的基础上,Marathon 平台的出现使得往 Mesos 上部署应用更加便捷。

本文主要学习内容有:

  • Marathon 安装
    • Marathon UI
  • Marathon API
    • 创建一个 Demo,运行 dstat
  • 运维部署流程讨论

Why Marathon?

我们知道了 Mesos 平台能提供资源调度的功能。

但是具体采用什么样的策略调度,优先级怎么区分,异常情况如何处理,都需要在 Mesos 框架中实现。 实际生产中使用的计算任务,调度需求类型相对比较固定,每个业务需求去都实现一个框架的负担会比较重。 因此需要有一套通用的平来实现这些基本调度需求,又可以大大降低开发和运维工作量。

Marathon 就是这样一套通用型的应用管理框架/平台。

特性

  • 高可用,支持多主节点(主备模式)自动切换
  • 支持多种容器环境
  • 支持有状态服务,如数据库
  • 使用 Web 管理界面用于配置操作和监控系统状态
  • 约束规则,比如限制任务分布在特定节点
  • 服务发现、负载均衡
  • 支持健康检查,实现容错
  • 支持事件订阅,用于集成到其它系统
  • 运行指标监控接口
  • 完善易用的 REST API

安装 Marathon

使用 Mesosphere 的软件仓库安装是比较简单的选择。

yum install -y http://repos.mesosphere.com/el-testing/7/noarch/RPMS/mesosphere-el-repo-7-3.noarch.rpm && \
yum update -y && \
yum install -y marathon

# 启动
systemctl start marathon

还可以下载安装包手动安装。 (本文写作时版本为 1.1.1)

$ curl -O http://downloads.mesosphere.com/marathon/v1.1.1/marathon-1.1.1.tgz
$ tar xzf marathon-1.1.1.tgz

# 启动
$ ./bin/start --master zk://127.0.0.1:2181/mesos --zk zk://127.0.0.1:2181/marathon

Marathon UI 介绍

默认情况下,Marathon 在 8080 端口上启动了 web 管理界面。

Marathon UI 展示了应用的状态。

Marathon UI

创建应用

从最基本的任务开始,创建一个简单的应用,执行 dstat 命令。

应用定义文件

首先,准备应用定义文件。 此文件为 JSON 格式,定义了应用的名称(id)、命令、资源(cpu、内存等)和实例数量等信息。

先来看下这个文件等内容:

{
  "id": "dstat-demo",
  "cmd": "dstat -tapm",
  "cpus": 0.01,
  "mem": 32,
  "instances": 2
}

注意, 其中的 cmd 字段包含了应用将要执行的命令行。 进程的数量 instances 为 2。

通过 Marathon UI 创建应用

在 Web 页面上,点击创建(’Create Application’)按钮。 弹出操作窗中,切换为 JSON 模式(’JSON Mode’)。

Create Application, JSON Mode

将上一步准备的 JSON 内容复制的输入框内。 点击输入框旁的创建(’Create Application’)按钮,保存配置。 此时新建应用的信息,将出现在 Web 页面的应用列表。

伸缩(Scale)

便捷的操作界面,是 Marathon 的一大优势。 让我们体验一下扩容操作,为刚创建的应用分配更多的计算资源。

应用列表中,点击应用最右侧的图标,下拉菜单选择 Scale

Scale Application 1

修改应用实例数量,此时我们由 2 改为 4:

Scale Application 2

等待几秒钟,在应用列表中可以看到应用实例数量已经更新。 你可以随意修改数量,来体验伸缩的操作。

使用 Marathon API 操作(create/scale)

为了方便批量化管理,以上操作都可以通过 API 来实现。

API 文档可以参考 Marathon REST API documentation

我们使用其中的 POST /v2/apps 来创建应用,用 PUT /v2/apps/{app_id} 来对应用进行操作。 其中,PUT /v2/apps/{app_id} 也可以用来创建应用,仅限该 app_id 还不存在的情况下。

POST /v2/apps

Create and start a new application. Note: This operation will create a deployment. The operation finishes, if the deployment succeeds. You can query the deployments endoint to see the status of the deployment.


PUT /v2/apps/{app_id}

Replaces parameters of a running application. If no application with the given id exists, it will be created. If there is an application with this id, all running instances get upgraded to the new definition.

Note: This operation will create a deployment. The operation finishes, if the deployment succeeds. You can query the deployments endoint to see the status of the deployment.

应用部署流程

使用 Marathon 部署应用时,所有应用应尽量做到无状态(本地不保存数据),配置集中管理(本地不保存配置),支持随时迁移到其它节点(服务发现)。

一个比较理想的流程是:

  1. 创建应用/配置更新
  2. 应用环境变量设置
  3. 安装系统/应用环境依赖
  4. 获取应用配置文件
  5. 获取应用二进制文件
  6. 启动应用进程,服务节点注册
  7. 服务节点注销,下线应用进程

这个流程中,有两个重要组件:CMDB 和 Service Registry。

其中, CMDB 定义应用角色数据,如每个计算资源、进程属于哪组角色;Service Registry 保存服务状态,如每个服务有哪些进程。

关于 CMDB 和 Service Registry 的方案选型,是另一个较大的话题,以后做微服务方面分享时会涉及。

Next

作为运维平台,可用性也是重要的方面。 关于这个话题,Mesos/Marathon 可用性方面所做的工作,后面的文章将详细介绍。