Apache Mesos(6)-使用Marathon部署程序
作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/
本篇文章我们来安装Marathon框架,并且使用它来进部署一个简单的基于命令行的程序和一个基于Docker容器的程序。
安装和配置Marathon
对于安装较新的Marathon版本(Version 1.1.2),需要满足以下的一些先决条件:
- Apache Mesos 0.28.0+
- Apache ZooKeeper
- JDK 1.8+
如果需要Marathon框架高可用,需要将它部署到几个节点上,就像部署Mesos master时一般需要奇数个节点一样。部署有3个实例的Marathon可以满足大多数环境的要求,这些实例使用ZooKeeper ensemble进行领导者的选举和状态的保持。
对于简单的安装,可以将Marathon部署到与Mesos master相同的机器上。
安装Marathon
通过包管理器
安装Marathon的最简单的方法是通过Mesosphere提供的安装源,使用包管理器进行安装。根据Linux的发行版,使用如下命令安装Marathon:
- RHEL/CentOS:
sudo yum install marathon
- Ubuntu:
sudo apt-get install marathon
通过Tarball
下载和解压最新的Marathon版本:
$ curl -O http://downloads.mesosphere.com/marathon/v1.1.2/marathon-1.1.2.tgz
$ tar xzf marathon-1.1.2.tgz
当然也可以从源代码编译安装,请参考https://github.com/mesosphere/marathon
配置Marathon
与Mesos类似,Marathon也可以通过基于文件、环境变量和命令行参数的方式来配置。基于文件的配置在/etc/marathon/conf/文件夹。下表列举了一些比较重要的配置:
完整的配置参数,可以参考http://mesosphere.github.io/marathon/docs/command-line-flags.html。
当Marathon安装配置完成后,可以使用sudo service marathon start
启动服务。如果使用的是Tarball进行的安装,需要进入Tarball的解压目录,使用如下方式启动:
$ ./bin/start --master zk://zk1.foo.bar:2181,zk2.foo.bar:2181,zk3.foo.bar:2181/mesos --zk zk://zk1.foo.bar:2181,zk2.foo.bar:2181,zk3.foo.bar:2181/marathon
上面的命令行参数,--master
用来寻找Mesos masters,--zk
用来寻找ZooKeeper来存储状态信息。它们是分开的配置选项的原因是Mesos master可以通过其它方式来发现。
服务启动起来后,可以通过http://marathon-ip:8080来访问其web界面。
创建应用程序实例
在Marathon框架下,每一个应用程序都代表着一个长期运行的服务,它可以是在不同主机上运行的多个实例。一个应用程序实例被称为一个任务。应用程序的定义描述了启动和维护该任务的所有内容。
部署一个简单的程序
Marathon安装完成后,可以通过其web界面部署程序;也可以使用JSON描述应用,然后通过REST的API进行部署。
通过web界面部署
如下图所示,首先点击创建应用程序的按钮,在出现的新应用程序对话框中,填入要运行程序的命令等信息,最后点创建应用按钮。新程序便部署成功:
{% asset_img 2.png “Marathon web界面部署应用”%}
{% asset_img 3.png “Marathon web界面部署应用”%}
通过JSON描述部署
在刚才相同的部署界面,右上角有一个JSON Mode,点击后便切换为JSON模式,可以在其中填入JSON的描述,最后点击创建应用按钮。新程序便部署成功:
{% asset_img 4.png “Marathon JSON描述部署应用”%}
{% asset_img 5.png “Marathon JSON描述部署应用”%}
在使用JSON进行部署时,还可以不通过web界面,使用curl命令调用Marathon提供的REST的API,例如上面的例子,可以将上面的JSON描述存为一个文本文件,文件名为hello-marathon.json,然后执行下面的命令:
curl -H 'Content-type: application/json' -d @hello-marathon.json http://marathon-ip:8080/v2/apps"
注意:上面例子中Command输入框的值或JSON描述中的cmd
的值是需要执行的命令。它由底层的Mesos executor通过/bin/sh -c ${cmd}
包装。
部署一个基于Docker容器的应用程序
使用Marathon运行基于docker的程序,需要首先在每个slave节点安装配置好docker(版本1.0.0+),并且每个slave上的containerizers选项配置了’docker,mesos’,以及把executor_registration_timeout选项的超时延长,详细配置信息请参考http://mesosphere.github.io/marathon/docs/native-docker.html。
之后可以使用与上面介绍的方法类似的步骤来部署基于docker的程序。例如下面的basic-3.json
文件包含了描述docker程序的信息,一个基于Python的web服务器,使用了python:3的镜像。在容器的内部,web服务器运行在8080端口上(containerPort
的值)。hostPort
的值设置为0表示Marathon将会在此Mesos slave上分配一个随机端口,来映射到容器内部的8080端口上。
下面可以使用HTTP API来部署basic-3
程序:
curl -X POST http://marathon-ip:8080/v2/apps -d @basic-3.json -H "Content-type: application/json"