SciRui 2016-11-03
基础应用
首先我们将下述代码,保存为shell.json:
{ “id”: "shell", "cmd": "while [true];do echo 'DCOS shell';sleep 5;done", "cpus": "0.1", "mem": "10.0", "instances": "1" }
执行下述命令行:
curl 10.134.29.134:5000/v2/apps -d @shell.json -H "Content-type:application/json"
其将json文件通过marathon api传递给调度器,请求创建一个实例,资源需求为0.1cpu、10M内存、执行shell命令行。cmd将被发送给Mesos底层执行器进行执行,最终通过/bin/bash -c ${cmd}。
打开DCOS控制面板,选择Marathon管理界面,如图所示,可以发现名为shell的App正在运行,App在Marathon创建中是一对多的关系,即一个App可以有多个Task。
图 3-1
通过上图可以发现,Marathon提供App手动扩缩功能、健康检查、日志管理以及App生命周期的管理等功能。
首先,我们介绍Marathon对App实现手动扩缩的功能,选择Scale Application进行快速扩容,如下图所示,填写10,即可将App扩展到10个Task。
图 3-2
如下图所示,shell App扩展到10个Task:
图 3-3
既然可以扩展,那么当然可以收缩,选择你要销毁的Task,点击Kill&scale即可。除了上述通过curl命令创建App以外,Marathon提供Web UI创建App,点击主界面的create,在选框中填入相应参数即可,具体如下图所示。
图 3-4
这一小节,关于Marathon的基础应用部分介绍完毕,下面我们将介绍Marathon如何应用远程资源。
运行远程资源
对于复杂应用,无法通过简单的cmd命令传递所以操作,对于此类情况,Marathon提供uri参数,在执行调度前,利用Mesos fetcher来下载、解压操作,提取资源。在深入探讨此话题前,我们通过实例来了解应用场景:
{ “id”: "resource", "cmd": "./shell.sh", "cpus": "0.1", "mem": "10.0", "instances": "1", "uris": [ "http://10.128.3.75/images/shell.sh" ] }
上述实例执行cmd之前,会通过Mesos下10.128.3.75/images/shell.sh,之后会在所选slave节点的应用沙箱中执行该资源,可以通过web界面查看该任务的沙箱,单击进入页面,可以查看到Mesos下载的shell.sh脚本。
需要注意的是,Mesos v0.22及以上版本在默认情况下执行cmd的方式,是先设权限后执行,因此,cmd命令类似于chmod u+x shell.sh &&sh shell.sh。
除了上述提及的功能之外,Marathon框架自身清楚框架内的应用资源。当然,Marathon对于下述文件将首先尝试解压并提取资源:
· .tgz
· .tar.gz
· .tbz2
· .tar.bz2
· .txz
· .tar.xz
· .zip
uris对资源进行定位下载,Marathon支持多种协议类型,种类如下所示:
· file:
· http:
· https:
· ftp:
· ftps:
· hdfs:
· s3:
· s3a:
· s3n:
uri的值是数组类型,可以支持同时输入多个资源:
{ ...
"uris": [
"https://github.com/zouyee/repo.zip",
"http://10.128.3.75/images/shell.sh",
"ftp://10.128.3.75/images/my-other-file.css"
]
...
}
容器运行
1、简单应用
Marathon可以使用docker对应用进行高效快捷的部署,在下述应用实例中,使用docker部署一简单web应用:使用Docker的python:3镜像,启动一个容器内部端口8080的服务,网络模式选择bridge,因此有portMapping选项,在其字段中,hostport值设为0,意味着Marathon任意分配映射到外部的端口,json内容如下所示:
{ "id": "web", "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接口启动该应用:
curl -X POST http://10.134.29.134:8080/v2/apps -d web.json -H "Content-type: application/json"
通过dcos client启动该用,dcos marathon app add web.json
通过Marathon web UI界面可以看到名为web的应用已运行。
图 3-5
2、端口分配
Marathon涉及到端口配置或者端口概念的地方有三处,第一部分是在应用配置的container中的portMapping,主要有containerport、hostport、serviceport,如图3-6所示,第二处在应用配置的Optional settings中的Ports,如图3-7所示,第三处在实际App中某一Task分配的port(s),如下图3-8所示。
图3-6 container中的端口映射
图 3-7 可选项中的端口
图 3-8 Task分配到的端口
通过图3-6可以发现,Port Mappings包括Container Port、Host Port、Service Port、Protocol等字段,图3-7可以发现,Optional settings包含Ports字段。
containerPort:container Port指定在容器内部的端口,它适用于docker的bridge网络做port mapping。
hostPort:host Port指定主机绑定端口,当使用BRIDGE网络,需要指定从主机端口到容器端口的port mapping,当使用HOST网络,请求端口默认为主机端口。
BRIDGE网络:docker应用可以使用BRIDGE网络。在此网络环境中,container port(容器内部端口)对应host port(主机上的端口)。
HOST网络:HOST网络可用于非docker的Marathon应用和docker应用,此模式中,应用直接绑定主机的一或者多个端口。
ports:这个port需要被视作一种资源,在使用HOST网络时,就需要设定。
protocol:协议指定使用的端口(比如tcp、udp)
servicePort:Marathon不绑定此端口,其被用作服务发现。
如果在portMapping中containerPort设为0,它的值将会与hostPort一致,hostPort将随机分配,默认范围在31000-32000之间。
关于DCOS的Marathon应用篇先介绍这么多,下一篇将介绍应用群组以及健康检查相关内容,谢谢您的阅读!
http://sanwen8.cn/p/1f0EGer.html