marathon參考(1)應用基礎
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介面檢視隨機分配的訪問埠訪問應用。