26.2 Mesos安装与使用
以Mesos结合Marathon应用框架为例,看一下如何快速搭建一套Mesos平台。
Marathon是可以跟Mesos一起协作的一个framework,基于Scala实现,可以实现保持应用的持续运行。
另外,Mesos默认利用ZooKeeper来进行多个主节点之间的选举,以及从节点发现主节点的过程。一般在生产环境中,需要启动多个Mesos master服务(推荐3或5个),并且推荐使用supervisord等进程管理器来自动保持服务的运行。
ZooKeeper是一个分布式集群中信息同步的工具,通过自动在多个节点中选举leader,保障多个节点之间的某些信息保持一致性。
1.安装
安装时主要需要mesos、zookeeper和marathon三个软件包。
Mesos也采用了经典的“主-从”结构,一般包括若干主节点和大量从节点。其中,mesos master服务和zookeeper需要部署到所有的主节点,mesos slave服务需要部署到所有从节点。marathon可以部署到主节点。
安装可以通过源码编译、软件源或者Docker镜像方式进行,下面分别进行介绍。
(1)源码编译方式
源码编译方式可以保障获取到最新版本,但编译过程比较费时间。
首先,从apache.org开源网站下载最新的源码:
- $ git clone https://git-wip-us.apache.org/repos/asf/mesos.git
其中,主要代码在src目录下,应用框架代码在frameworks目录下,文档在docs目录下,include中包括了跟Mesos打交道使用的一些API定义头文件。
安装依赖主要包括Java运行环境、Linux上的自动编译环境等:
- $ sudo apt-get update
- $ sudo apt-get install -y openjdk-8-jdk autoconf libtool \
- build-essential python-dev python-boto libcurl4-nss-dev \
- libsasl2-dev maven libapr1-dev libsvn-dev
后面就是常规C++项目的方法,配置之后利用Makefile进行编译和安装:
- $ cd mesos
- $ ./bootstrap
- $ mkdir build
- $ cd build && ../configure --with-network-isolator
- $ make
- $ make check && sudo make install
(2)软件源安装方式
通过软件源方式进行安装相对会省时间,但往往不是最新版本。
这里以Ubuntu系统为例,首先添加软件源地址:
- $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF
- $ DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]')
- $ CODENAME=$(lsb_release -cs)
- $ echo "deb http://repos.mesosphere.io/${DISTRO} ${CODENAME} main" | \
- sudo tee /etc/apt/sources.list.d/mesosphere.list
刷新本地软件仓库信息并安装zookeeper、mesos、marathon三个软件包:
- $ sudo apt-get -y update && sudo apt-get -y install zookeeper mesos marathon
注意,Marathon最新版本需要jdk 1.8+的支持。如果系统中有多个Java版本,需要检查配置默认的JDK版本符合要求:
- $ sudo update-alternatives --config java
安装Mesos成功后,会在/usr/sbin/下面发现mesos-master和mesos-slave两个二进制文件,分别对应主节点上需要运行的管理服务和从节点上需要运行的任务服务。
用户可以手动运行二进制文件启动服务,也可以通过service命令来方便进行管理。
例如,在主节点上重启mesos管理服务:
- $ sudo service mesos-master restart
通过service命令来管理,实际上是通过调用/usr/bin/mesos-init-wrapper脚本文件进行处理。
(3)基于Docker的方式
需要如下三个镜像。
·ZooKeeper:https://registry.hub.docker.com/u/garland/zookeeper/。
·Mesos:https://registry.hub.docker.com/u/garland/mesosphere-docker-mesos-master/。
·Marathon:https://registry.hub.docker.com/u/garland/mesosphere-docker-marathon/。
其中mesos-master镜像在后面将分别作为master和slave角色进行使用。
首先,拉取三个镜像:
- $ docker pull garland/zookeeper
- $ docker pull garland/mesosphere-docker-mesos-master
- $ docker pull garland/mesosphere-docker-marathon
导出主节点机器的地址到环境变量:
- $ HOST_IP=10.0.0.2
在主节点上启动zookeepr容器:
- docker run -d \
- -p 2181:2181 \
- -p 2888:2888 \
- -p 3888:3888 \
- garland/zookeeper
在主节点上启动mesos-master服务容器:
- docker run --net="host" \
- -p 5050:5050 \
- -e "MESOS_HOSTNAME=${HOST_IP}" \
- -e "MESOS_IP=${HOST_IP}" \
- -e "MESOS_ZK=zk://${HOST_IP}:2181/mesos" \
- -e "MESOS_PORT=5050" \
- -e "MESOS_LOG_DIR=/var/log/mesos" \
- -e "MESOS_QUORUM=1" \
- -e "MESOS_REGISTRY=in_memory" \
- -e "MESOS_WORK_DIR=/var/lib/mesos" \
- -d \
- garland/mesosphere-docker-mesos-master
在主节点上启动Marathon:
- docker run \
- -d \
- -p 8080:8080 \
- garland/mesosphere-docker-marathon --master zk://${HOST_IP}:2181/mesos --zk
- zk://${HOST_IP}:2181/marathon
在从节点上启动mesos slave容器:
- docker run -d \
- --name mesos_slave_1 \
- --entrypoint="mesos-slave" \
- -e "MESOS_MASTER=zk://${HOST_IP}:2181/mesos" \
- -e "MESOS_LOG_DIR=/var/log/mesos" \
- -e "MESOS_LOGGING_LEVEL=INFO" \
- garland/mesosphere-docker-mesos-master:latest
接下来,可以通过访问本地8080端口来使用Marathon启动任务了。
2.配置说明
下面以本地通过软件源方式安装为例,解释如何修改各个配置文件。
(1)ZooKeepr
ZooKeepr是一个分布式应用的协调工具,用来管理多个主节点的选举和冗余,监听在2181端口,推荐至少布置三个主节点来由ZooKeeper维护。
配置文件默认都在/etc/zookeeper/conf/目录下。比较关键的配置文件有两个:myid和zoo.cfg。myid文件会记录加入ZooKeeper集群的节点的序号(1~255之间)。
/var/lib/zookeeper/myid文件其实也是软连接到了该文件。
比如配置某节点序号为1,则需要在该节点上执行:
- $ echo 1 | sudo dd of=/etc/zookeeper/conf/myid
节点序号在ZooKeeper集群中必须唯一,不能出现多个拥有相同序号的节点。
另外,需要修改zoo.cfg文件,该文件是主配置文件,主要需要添加上加入ZooKeeper集群中机器的序号和对应监听地址。
例如,现在ZooKeeper集群中有三个节点,地址分别为10.0.0.2、10.0.0.3、10.0.0.4,序号分别配置为2、3、4。则配置如下的三行:
- server.2=10.0.0.2:2888:3888
- server.3=10.0.0.3:2888:3888
- server.4=10.0.0.4:2888:3888
其中第一个端口2888负责从节点连接到主节点;第二个端口3888则负责主节点进行选举时候通信。
也可以用主机名形式,则需要各个节点/etc/hosts文件中都记录地址到主机名对应的映射关系。
完成配置后,启动ZooKeeper服务:
- $ sudo service zookeeper start
(2)Mesos
Mesos的默认配置目录有三个:
·/etc/mesos/:主节点和从节点都会读取的配置文件,最关键的是zk文件存放主节点的信息;
·/etc/mesos-master/:只有主节点会读取的配置,等价于启动mesos-master命令时候的默认选项;
·/etc/mesos-slave/:只有从节点会读取的配置,等价于启动mesos-master命令时候的默认选项。
最关键的是需要在所有节点上修改/etc/mesos/zk,写入主节点集群的ZooKeeper地址列表,例如:
- zk://10.0.0.2:2181,10.0.0.3:2181,10.0.0.4:2181/mesos
此外,/etc/default/mesos、/etc/default/mesos-master、/etc/default/mesos-slave这三个文件中可以存放一些环境变量定义,Mesos服务启动之前,会将这些环境变量导入作为启动参数。格式为MESOS_OPTION_NAME。
下面分别说明在主节点和从节点上的配置。
主节点配置:一般只需要关注/etc/mesos-master/目录下的文件。默认情况目录下为空。
该目录下文件命名和内容需要跟mesos-master支持的命令行选项一一对应。可以通过mesos-master—help命令查看支持的选项。
例如某个文件key中内容为value,则在mesos-master服务启动的时候,会自动添加参数—key=value给二进制命令。
例如,mesos-master服务默认监听在loopback端口,即127.0.0.1:5050,我们需要修改主节点监听的地址,则可以创建/etc/mesos-master/ip文件,在其中写入主节点监听的外部地址。
为了正常启动mesos-master服务,还需要指定work_dir参数(表示应用框架的工作目录)的值,可以通过创建/etc/mesos-master/work_dir文件,在其中写入目录,例如/var/lib/mesos。工作目录下会生成一个replicated_log目录,会存有各种同步状态的持久化信息。以及指定quorum参数的值,该参数用来表示ZooKeeper集群中要求最少参加表决的节点数目。一般设置为比ZooKeeper集群中节点个数的半数多一些(比如三个节点的话,可以配置为2)。
此外,要修改Mesos集群的名称,可以创建/etc/mesos-master/cluster文件,在其中写入集群的别名,例如MesosCluster。
总结一下,建议在/etc/mesos-master目录下,配置至少四个参数文件:ip、quorum、work_dir、cluster。
修改配置之后,需要启动服务即可生效:
- $ sudo service mesos-master start
更多选项可以参考后面26.4节的配置项解析内容。
主节点服务启动后,则可以在从节点上启动mesos-slave服务来加入主节点的管理。
从节点配置:一般只需要关注/etc/mesos-slave/目录下的文件。默认情况下目录下为空。文件命名和内容也是跟主节点类似,对应二进制文件支持的命令行参数。
建议在从节点上,创建/etc/mesos-slave/ip文件,在其中写入跟主节点通信的地址。
修改配置之后,也需要重新启动服务:
- $ sudo service mesos-slave start
(3)Marathon
Marathon作为Mesos的一个应用框架,配置要更为简单,必需的配置项有—master和—zk。
安装完成后,会在/usr/bin下多一个marathon shell脚本,为启动marathon服务时候执行的命令。
配置目录为/etc/marathon/conf(需要手动创建),此外默认配置文件在/etc/default/marathon。
我们手动创建配置目录,并添加配置项(文件命名和内容跟Mesos风格一致),让Marathon能连接到已创建的Mesos集群中:
- $ sudo mkdir -p /etc/marathon/conf
- $ sudo cp /etc/mesos/zk /etc/marathon/conf/master
同时,让Marathon也将自身的状态信息保存到ZooKeeper中。创建/etc/marathon/conf/zk文件,添加ZooKeeper地址和路径:
- zk://10.0.0.2:2181,10.0.0.2:2181,10.0.0.2:2181/marathon
启动marathon服务:
- $ sudo service marathon start
3.访问Mesos图形界面
Mesos自带了Web图形界面,可以方便用户查看集群状态。
用户在Mesos主节点服务和从节点服务都启动后,可以通过浏览器访问主节点5050端口,看到如图26-1所示的界面,已经有两个从节点加入了。

图26-1 Mesos界面查看加入的从节点
通过Slaves标签页能看到加入集群的从节点信息。
如果没有启动marathon服务,在Frameworks标签页下将看不到任何内容。
4.访问Marathon图形界面
Marathon服务启动成功后,在Mesos的Web界面的Frameworks标签页下面将能看到名称为marathon的框架出现。
同时,可以通过浏览器访问8080端口,看到Marathon的管理界面,如图26-2所示。

图26-2 Marathon图形管理界面
此时,可以通过界面或者REST API来创建一个应用,Marathon会保持该应用的持续运行。
通过界面方式可以看到各任务支持的参数(包括资源、命令、环境变量、健康检查等),同时可以很容易地修改任务运行实例数进行扩展,非常适合进行测试,参见图26-3。

图26-3 在Marathon中查看任务支持的参数
如果要更自动化地使用Marathon,则需要通过它的REST API进行操作。
一般情况下,启动新任务需要先创建一个定义模板(JSON格式),然后发到指定的API。
例如,示例任务basic-0的定义模板为:
- {
- "id": "basic-0",
- "cmd": "while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done",
- "cpus": 0.1,
- "mem": 10.0,
- "instances": 1
- }
该任务申请资源为0.1个单核CPU资源和10MB的内存资源,具体命令为每隔五秒钟用shell打印一句Hello Marathon。
可以通过如下命令发出basic-0任务到Marathon框架,框架会分配任务到某个满足条件的从节点上,成功会返回一个json对象,描述任务的详细信息:
- $ curl -X POST http://marathon_host:8080/v2/apps -d @basic-0.json -H "Content-
- type: application/json"
- {"id":"/basic-0","cmd":"while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ;
- done","args":null,"user":null,"env":{},"instances":1,"cpus":0.1,"mem":10,
- "disk":0,"executor":"","constraints":[],"uris":[],"storeUrls":[],"ports":
- [0],"requirePorts":false,"backoffSeconds":1,"backoffFactor":1.15,"maxLaunch
- DelaySeconds":3600,"container":null,"healthChecks":[],"dependencies":[],
- "upgradeStrategy":{"minimumHealthCapacity":1,"maximumOverCapacity":1},
- "labels":{},"acceptedResourceRoles":null,"version":"2015-12-28T05:33:05.805Z",
- "tasksStaged":0,"tasksRunning":0,"tasksHealthy":0,"tasksUnhealthy":0,
- "deployments":[{"id":"3ec3fbd5-11e4-479f-bd17-813d33e43e0c"}],"tasks":[]}%
Marathon的更多REST API可以参考本地自带的文档:http://marathon_host:8080/api-console/index.html。
此时,如果运行任务的从节点出现故障,任务会自动在其他可用的从节点上启动。
此外,目前也已经支持基于Docker容器的任务。需要先在Mesos slave节点上为slave服务配置—containerizers=docker,mesos参数。
例如,如下面的示例任务:
- {
- "id": "basic-3",
- "cmd": "python3 -m http.server 8080",
- "cpus": 0.5,
- "mem": 32.0,
- "container": {
- "type": "DOCKER",
- "volumes": [],
- "docker": {
- "image": "python:3",
- "network": "BRIDGE",
- "portMappings": [
- {
- "containerPort": 8080,
- "hostPort": 31000,
- "servicePort": 0,
- "protocol": "tcp"
- }
- ],
- "privileged": false,
- "parameters": [],
- "forcePullImage": true
- }
- }
- }
该任务启动一个python:3容器,执行python3-m http.server 8080命令,作为一个简单的Web服务,实际端口会映射到宿主机的31000端口。
注意区分hostPort和servicePort,前者代表任务映射到本地可用端口(可用范围由Mesos slave汇报,默认为31000~32000);后者作为服务管理的端口,可以当做一些服务发行机制使用,进行转发,在整个Marathon集群中是唯一的。
任务执行后,也可以在对应slave节点上通过Docker命令查看容器运行情况,容器将以mesos-SLAVE_ID开头:
- $ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS
- PORTS NAMES
- 1226b4ec8d7d python:3 "/bin/sh -c 'python3 " 3 days ago Up 3 days
- 0.0.0.0:10000->8080/tcp mesos-06db0fba-49dc-4d28-ad87-6c2d5a020866-
- S10.b581149e-2c43-46a2-b652-1a0bc10204b3
