Application基础
Application在Marathon中是一个完整的概念。每个Application通常代表一个长期运行的服务,其中会有在多台主机上运行多个实例。一个应用实例被称为任务(An application instance is called a task)。在应用程序定义(application definition)描述了启动和维护任务所需的一切。
Hello Marathon:内联Shell脚本
让我们先从一个简单的例子:每5秒钟打印一个Hello Marathon到stdout,无限循环。你可以使用下面的JSON应用程序定义来描述应用程序:
{
"id": "basic-0",
"cmd": "while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done",
"cpus": 0.1,
"mem": 10.0,
"instances": 1
}
注意,cmd在上面的例子中是被执行的命令。它的值由通过底层Mesos executor 封装成 /bin/sh -c ${cmd}。
当你定义和启动应用程序,Marathon将执行传递给Mesos。Mesos会为每个任务创建一个sandbox目录。sandbox目录是每一个agent节点(Mesos-slave)上的目录,充当一个执行环境,并包含相关的日志文件。在stderr和stdout流也写入的sandbox目录。
在Application中使用资源
要运行任何不平凡的应用程序,通常依赖于资源的集合:文件和/或压缩包。为了管理资源分配,Marathon有URIs的概念。URIs使用Mesos fetcher做下载(和潜在)提取资源方面的辅助工作
在我们深入这个话题,让我们看一个例子:
{
"id": "basic-1",
"cmd": "`chmod u+x cool-script.sh && ./cool-script.sh`",
"cpus": 0.1,
"mem": 10.0,
"instances": 1,
"uris": [
"https://example.com/app/cool-script.sh"
]
}
上面的例子主要做了以下工作:在执行cmd前,下载资源https://example.com/app/cool-script.sh(通过Mesos),并使其在应用任务的sandbox中可用。你可以通过访问Mesos UI检查这些下载,点击进入Mesos工作节点的sandbox,你现在应该找到Mesos下载的cool-script.sh。
注:由于Mesos v0.22及以上版本,fetcher代码默认不会使下载的文件的可执行文件默认情况下。在上面的例子中,cmd首先使该文件的可执行。
正如上面已经提到的,Marathon也知道如何处理压缩包中的应用程序资源。目前,Marathon(通过Mesos,并在cmd执行前)首先尝试解压缩/提取资源具有以下扩展名的文件:
- .tgz
- .tar.gz
- .tbz2
- .tar.bz2
- .txz
- .tar.xz
- .zip
通过下面的例子来演示在实际情况下是什么样:假设在这个地址下https://example.com/app.zip,有一个可执行的应用的zip。这个zip文件包含脚本cool-script.sh,这就是要执行的脚本。具体方法如下:
{
"id": "basic-2",
"cmd": "app/cool-script.sh",
"cpus": 0.1,
"mem": 10.0,
"instances": 1,
"uris": [
"https://example.com/app.zip"
]
}
需要注意的是在对比的例子basic-1,我们现在有一个cmd看起来如下:app/cool-script.sh。这来是由于zip压缩包被下载并解压,目录app根据文件名app.zip创建的。
还需要注意的是,你还可以指定许多资源,而不是唯一的一个。所以,例如,您可以像下面一样提供一个Git仓库和一些CDN资源:
{
...
"uris": [
"https://git.example.com/repo-app.zip", "https://cdn.example.net/my-file.jpg", "https://cdn.example.net/my-other-file.css"
]
...
}
在开发和部署阶段的典型模式是,将app binary放置在一个可以通过URI下载 的自动化构建系统中。Marathon可以支持很多类型的资源,支持以下URI schemes:
- file:
- http:
- https:
- ftp:
- ftps:
- hdfs:
- s3:
- s3a:
- s3n:
一个简单的基于Docker的应用程序
用Marathon可以很简单的用Docker镜像运行应用程序。参见在Marathon上运行Docker容器了解器进一步的细节和高级选项。
在下面的示例应用程序定义中,我们将关注一个简单的Docker应用程序:一个机遇Python的的Web Server使用Python:3镜像。在容器内,Web服务器使用端口8080(containerPort的值)。将hostPort设置为0,使Marathon就可以在Mesos slave(Mesos新版本上逐步将slave的名字改为agent)上随机分配端口,并把它到映射到容器内端口8080。
{
"id": "basic-3",
"cmd": "python3 -m http.server 8080",
"cpus": 0.5,
"mem": 32.0,
"container": {
"type": "DOCKER",
"docker": {
"image": "python:3",
"network": "BRIDGE",
"portMappings": [
{ "containerPort": 8080, "hostPort": 0 }
]
}
}
}
在这个例子中,我们将使用HTTP API来部署应用程序basic-3:
curl -X POST http://10.141.141.10:8080/v2/apps -d @basic-3.json -H "Content-type: application/json"
这假定您已经将上面的JSON保存到一个名为basic-3.json的文件中,并且使用playa-mesos,一个基于Vagrant的Mesos sandbox环境,用来测试我们的部署。当您提交上述定义到Marathon,你应该会在Marathon界面上看到像下面的界面(用于任务和配置选项卡,分别对应)。
这项练习的结果是,Marathon在Docker容器中运行了一个基于Python的Web Server,通过地址http://10.141.141.10:31000就可以访问容器根目录提供的服务内容。
参考资料:
[1]: http://mesosphere.github.io/marathon/docs/application-basics.html