marathon参考(1)应用基础

翻译https://mesosphere.github.io/marathon/docs/application-basics.html
在marathon中,应用是一个完整的概念。每个应用是一个典型的长运行的服务,这个服务有很多实例,并且是运行在多个主机上。

Hello Marathon:一个内嵌的shell脚步

让我们开始一个简单的例子:编写一个app,打印Hello Marathon到stdout,然后sleep 5秒,周而复始。你可以使用下面的应用定义文件(json格式)来描述应用:

{
    "id": "basic-0", 
    "cmd": "while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done",
    "cpus": 0.1,
    "mem": 10.0,
    "instances": 1
}

注意:cmd是我们要执行的命令。它的值会以/bin/sh -c ${cmd}的方式执行。

mesos执行在它自己的沙箱环境执行所有的任务。这个沙箱在每个slave节点上是一个指定的目录,其中包含很多相关的日志文件。

在应用中使用资源

通常应用逗号依赖一些资源集。例如文件和压缩文件等。为了解决资源集的问题,marathon有uris的概念。它利用mesos抓取外部资源。

我们先看一个实例:

{
    "id": "basic-1", 
    "cmd": "./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 UI,点击进入这个应用运行mesos节点的沙箱,你应该可以找到cool-script.sh这个文件。

注意mesos v0.22及以上版本,默认是不能编译下载的可执行文件的,所以cmd应该修改为:chmod u+x cool-script.sh && ./cool-script.sh

marathon也可以获取驻留在压缩包中的文件。marathon在执行cmd文件之前,执行解压压缩包的操作,支持压缩包给格式为:

.tgz
.tar.gz
.tbz2
.tar.bz2
.txz
.tar.xz
.zip

下面是压缩包的实例:

{
    "id": "basic-2", 
    "cmd": "app/cool-script.sh",
    "cpus": 0.1,
    "mem": 10.0,
    "instances": 1,
    "uris": [
        "https://example.com/app.zip"
    ]
}

marathon还可以下载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"
    ]
    ...
}

marathon还支持下载其他很多资源,支持URI的协议如下:

file:
http:
https:
ftp:
ftps:
hdfs:
s3:
s3a:
s3n:

一个简单的基于docker的应用

使用marathon我们可以运行docker镜像。

下面的实例中,我们注重看一个docker应用:一个使用python编写的web服务,它使用python:3镜像。容器内部,这个web服务运行在8080端口(这个端口号使用containerPort定义)。容器的外部,marathon分配任意个接口(hostPort设置为0)。

{
  "id": "basic-3",
  "cmd": "python3 -m http.server 8080",
  "cpus": 0.5,
  "mem": 32.0,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "daocloud.io/library/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"

我们可以在marathon ui界面查看随机分配的访问端口访问应用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章