以软件源方式安装为例,解释如何修改各个配置文件。

(1)Zookeeper

zookeeper是一个分布式应用的协调工具,用来管理多个主节点的选举和冗余,监听在2181端口,推荐至少布置三个主节点来由Zookeeper维护。
配置文件默认在/etc/zookeeper/conf目录下。
比较关键的文件有两个:myid和zoo.cfg。
myid文件会记录加入Zookeeper集群的节点的序号(1-255之间)。
节点序号在zookeeper集群中必须唯一,不能出现多个拥有相同序号的节点。
/var/lib/zookeeper/myid文件其实也是软连接到了该文件。

比如配置某节点序号为1,则需在该节点执行:
[root@adson ~]# echo 1 |dd of=/etc/zookeeper/conf/myid
0+1 records in
0+1 records out
2 bytes (2 B) copied, 8.3164e-05 s, 24.0 kB/s

另外,需要修改zoo.cfg文件,该文件是主配置文件,主要需要添加上加入zookeeper集群中机器的序号和对应监听地址。

该实验中只有一个zookeeper:
[root@adson ~]# vi /etc/zookeeper/conf/zoo.cfg
添加:
server.1=192.168.6.64:2888:3888

启动服务:
[root@adson ~]# service zookeeper start

(2)Mesos

Mesos的默认配置目录有三个:
/etc/mesos/:主节点和从节点都会读取的配置文件,最关键的是zk文件存放主节点的信息;
/etc/mesos-master/:只有主节点会读取的配置,等价于启动mesos-master命令的默认选项;
/etc/mesos-slave/:只有从节点会读取的配置,等价于启动mesos-master命令时候的默认选项。

最主要是需要在所有节点上修改/etc/mesos/zk,写入主节点集群的Zookeeper地址列表。
例如:

[root@adson ~]# vi /etc/mesos/zk
zk://adson:2181/mesos
[root@registry ~]# vi /etc/mesos/zk
zk://adson:2181/mesos
[root@docker1 ~]# vi /etc/mesos/zk
zk://adson: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。
修改配置之后,需要启动服务即可生效。

在本次实验中:
[root@adson ~]# cd /etc/mesos-master/
[root@adson mesos-master]# ls #默认存在两个
quorum work_dir
[root@adson mesos-master]# cat quorum
1
[root@adson mesos-master]# cat work_dir
/var/lib/mesos

[root@adson mesos-master]# vi ip #主节点地址
192.168.6.64
[root@adson mesos-master]# vi cluster
MesosCluster

[root@adson mesos-master]# service mesos-master start
Redirecting to /bin/systemctl start mesos-master.service

主节点启动后,则可以在从节点启动mesos-slave服务来加入主节点的管理。
从节点配置:
一般只需关注/etc/mesos-slave目录下的文件。
默认情况目录为空。文件命名和内容也跟主节点类似,对应二进制文件支持的命令行参数。
建议在从节点上,创建/etc/mesos-slave/ip文件,在其中写入跟主节点通信的地址。

[root@registry ~]# vi /etc/mesos-slave/ip
192.168.6.32
[root@registry ~]# vi /etc/mesos-slave/ip
192.168.6.41

[root@registry ~]# service mesos-slave start
Redirecting to /bin/systemctl start mesos-slave.service
[root@docker1 ~]# service mesos-slave start
Redirecting to /bin/systemctl start mesos-slave.service

(3)Marathon

Marathon作为Mesos的一个应用框架,配置更为简单,必需的配置项有–master 和–zk。
Marathon安装完成后,会在/usr/bin下多一个marathon shell脚本,为启动marathon服务时候执行的命令。
配置目录为/etc/marathon/conf(需要手动创建),此外默认配置文件在/etc/default/marathon。
我们手动创建配置目录,并添加配置项(文件命名和内容与Mesos风格一致),让Marathon能连接到已创建的Mesos集群中:
[root@adson ~]# mkdir -p /etc/marathon/conf
[root@adson ~]# cp /etc/mesos/zk /etc/marathon/conf/master

同时,让Marathon也将自身的状态信息保存在Zookeeper中。
创建/etc/marathon/conf/zk文件,添加zookeeper地址和路径:
[root@adson ~]# vi /etc/marathon/conf/zk
zk://192.168.6.64:2181/marathon

[root@adson ~]# vi /etc/default/marathon #添加mesos地址参数
MARATHON_MASTER=“zk://192.168.6.64:2181/mesos”
MARATHON_ZK=“zk://192.168.6.64:2181/marathon”
MARATHON_MESOS_USER=“root”

启动marathon服务:
[root@adson ~]# service marathon start

启动marathon时遇到问题:

[root@adson ~]# service marathon status -l
Redirecting to /bin/systemctl status -l marathon.service
â marathon.service - Scheduler for Apache Mesos
Loaded: loaded (/usr/lib/systemd/system/marathon.service; enabled; vendor preset: disabled)
Active: activating (auto-restart) (Result: exit-code) since Thu 2018-08-02 15:53:46 CST; 58s ago
Process: 21774 ExecStart=/usr/share/marathon/bin/marathon (code=exited, status=1/FAILURE)
Process: 21772 ExecStartPre=/bin/chmod 755 /run/marathon (code=exited, status=0/SUCCESS)
Process: 21769 ExecStartPre=/bin/chown marathon:marathon /run/marathon (code=exited, status=0/SUCCESS)
Process: 21767 ExecStartPre=/bin/mkdir -p /run/marathon (code=exited, status=0/SUCCESS)
Main PID: 21774 (code=exited, status=1/FAILURE)
Aug 02 15:53:46 adson systemd[1]: marathon.service: main process exited, code=exited, status=1/FAILURE
Aug 02 15:53:46 adson systemd[1]: Unit marathon.service entered failed state.
Aug 02 15:53:46 adson systemd[1]: marathon.service failed.

#journalctl -u marathon
解决:
[root@adson ~]# vi /etc/default/marathon #添加mesos地址参数
MARATHON_MASTER=“zk://192.168.6.64:2181/mesos”
MARATHON_ZK=“zk://192.168.6.64:2181/marathon”
MARATHON_MESOS_USER=“root”
[root@adson ~]# service marathon restart
Redirecting to /bin/systemctl restart marathon.service
[root@adson ~]# service marathon status
Redirecting to /bin/systemctl status marathon.service
â marathon.service - Scheduler for Apache Mesos
Loaded: loaded (/usr/lib/systemd/system/marathon.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2018-08-02 16:03:25 CST; 5s ago

访问Mesos和Marathon图形界面:

Mesos自带了Web图形界面,可以方便用户查看集群状态。
用户在mesos主从节点服务都启动后,可通过浏览器访问主节点5050端口(这里的实验我用localhost:5050是无法访问的):

通过agents标签页可以看到节点信息。
在frameworks标签可以看到名称为marathon的框架出现:
在这里插入图片描述访问Marathon图形界面
通过8080端口可以看到marathon的管理界面:
在这里插入图片描述

REST API操作

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

如果要更自动化的使用Marathon,则需要通过它的REST API进行操作。
一般情况下,启动新任务需要先创建一个定义模板(JSON格式),然后发到指定的API。

例如,实例任务basic-0的定义模板为:
[root@adson ~]# vi basic-0.json
{
“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对象,描述任务的详细信息:
[root@adson ~]# curl -X POST http://192.168.6.64:8080/v2/apps -d @basic-0.json -
H “content-type: application/json”
{“id”:"/basic-0",“backoffFactor”:1.15,“backoffSeconds”:1,“cmd”:“while [true]; do echo ‘Hello Marathon’; sleep 5; done”,“cpus”:0.1,“disk”:0,“executor”:"",“instances”:1,“labels”:{},“maxLaunchDelaySeconds”:3600,“mem”:10,“gpus”:0,“networks”:[{“mode”:“host”}],“portDefinitions”:[{“port”:0,“name”:“default”,“protocol”:“tcp”}],“requirePorts”:false,“upgradeStrategy”:{“maximumOverCapacity”:1,“minimumHealthCapacity”:1},“version”:“2018-08-02T09:22:11.776Z”,“killSelection”:“YOUNGEST_FIRST”,“unreachableStrategy”:{“inactiveAfterSeconds”:0,“expungeAfterSeconds”:0},“tasksStaged”:0,“tasksRunning”:0,“tasksHealthy”:0,“tasksUnhealthy”:0,“deployments”:[{“id”:“a2fde18e-238d-41c9-ad4e-87aede843427”}],“tasks”:[]}[root@adson ~]#

此时通过8080端口可以看到正在运行的basic-0任务。
在这里插入图片描述
如果任务的从节点出现故障,任务会自动在其他可用的从节点上启动。

Marathon的更多REST API可以参考本地自带的文档:http://192.168.6.64:8080/api-console/index.html

基于Docker容器的任务

此外,目前也已支持基于Docker容器的任务。
需要先在Mesos slave节点上为slave服务配置–containerizers=docker,mesos参数
例如:
[root@docker1 ~]# echo ‘docker,mesos’ >/etc/mesos-slave/containerizers
[root@docker1 ~]# service mesos-slave restart

实例任务:
[root@adson ~]# vi basic-3.json
{
“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
}
}
}

[root@adson ~]# curl -X POST http://192.168.6.64:8080/v2/apps -d @basic-3.json -H “content-type: application/json”
{“id”:"/basic-3",“backoffFactor”:1.15,“backoffSeconds”:1,“cmd”:“python3 -m http.server 8080”,“container”:{“type”:“DOCKER”,“docker”:{“forcePullImage”:true,“image”:“python:3”,“parameters”:[],“privileged”:false},“volumes”:[],“portMappings”:[{“containerPort”:8080,“hostPort”:31000,“labels”:{},“protocol”:“tcp”,“servicePort”:0}]},“cpus”:0.5,“disk”:0,“executor”:"",“instances”:1,“labels”:{},“maxLaunchDelaySeconds”:3600,“mem”:32,“gpus”:0,“networks”:[{“mode”:“container/bridge”}],“requirePorts”:false,“upgradeStrategy”:{“maximumOverCapacity”:1,“minimumHealthCapacity”:1},“version”:“2018-08-02T10:17:46.662Z”,“killSelection”:“YOUNGEST_FIRST”,“unreachableStrategy”:{“inactiveAfterSeconds”:0,“expungeAfterSeconds”:0},“tasksStaged”:0,“tasksRunning”:0,“tasksHealthy”:0,“tasksUnhealthy”:0,“deployments”:[{“id”:“2b761eff-3ef5-43d7-90e5-615c459865a6”}],“tasks”:[]}[root@adson ~]#

该任务启动一个python:3容器,执行python3 -m http.server 8080命令,作为一个简单的web服务,实际端口会映射到执行任务的宿主机的31000端口。

注意区分hostPort和servicePort,前者代表任务映射到本地可用端口(可用范围由Mesos slave汇报,默认为31000-32000);后者作为服务管理的端口,可以当做一些服务发行机制使用,进行转发,在整个marathon集群中是唯一的。

任务执行后,可以在对应的slave节点查看容器,容器将以mesos-SLAVE_ID开头:

[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4171e329a57a python:3 “/bin/sh -c 'pytho…” About a minute ago Up About a minute 0.0.0.0:31000->8080/tcp mesos-1efbd384-fcb1-4664-8e09-a6ac39d0e84a

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐