DCOS之Marathon应用管理篇

基础应用

 

首先我们将下述代码,保存为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应用:使用Dockerpython: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,主要有containerporthostportserviceport,如图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

猜你喜欢

转载自m635674608.iteye.com/blog/2335104