在 RHEL 7.1 上设置 Mesos/Marathon 集群
| 2016-10-26 17:04 收藏: 2
Mesos 与 Marathon
Mesos
Mesos 是一套分布式集群管理器,旨在通过以动态方式于不同任务之间共享资源的方式改进资源使用率。Mesos 提供一种统一化资源视角,其涵盖全部集群节点,并能够以无缝化方式利用类似于单一计算机内操作系统内核的方式实现资源访问。因此,Mesos 亦被称为数据中心的内核机制。通过使用 Mesos,大家可以构建起数据中心应用,而且 Mesos 的主要组件亦可作为一种可扩展的两段式调度工具。
以下为 Mesos 集群管理器中的各关键性组件:
- 主节点:负责协调全部集群操作的集群管理器。多个主节点可同时存在以实现高可用性。
- 从节点(亦被称为节点):任务运行所在的各集群成员。
- 框架:运行在集群之上的实际任务。目前存在多种框架,允许大家将一系列应用程序及服务组合部署在 Mesos 集群管理器之上。
以下章节将探讨如何利用 Marathon 框架将应用程序与服务部署在 Mesos 之上。
可用性
以下列出了 IBM PowerPC Little Endian(ppc64le)平台上的各相关软件包位置:
Linux 发行版:Red Hat Enterprise Linux (RHEL) 7.X
软件包位置:Unicamp,具体请参阅 Unicamp 库:http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/misc_ppc64el/ 。
注意:对于在 IBM PowerPC 之上运行其它发行版,大家必须从源处构建软件包。
Marathon
Marathon 是一套用于在 Mesos 之上运行长期运行应用程序或者服务的框架。这些应用程序具备高可用性要求,这意味着 Marathon 能够监控并在遭遇故障时以自动化方式重启应用实例,且可以通过弹性方式实现应用规模扩展。Marathon 亦能够运行其它框架,具体包括 Hadoop 以及 Marathon 自身。典型的 Marathon 使用工作流为在集群之内运行 N 个同一应用程序实例,且每个应用实例都需要配备 1 个处理器与 1 GB 内存容量。大家可以向 Marathon 提交请求以创建 N 个运行在各从节点之上的 Mesos 任务。
Marathon 提供一套具象状态传输(简称 REST)API 用于对服务进行启动、终止以及扩展。其同时提供基于浏览器的 GUI 与命令行客户端。其能够以高可用性方式运行在多个 Marathon 实例当中。在本篇文章中,大家将了解如何通过 Marathon 实现服务部署,以及如何将该服务使用于特定示例应用当中。这里提到的各项指令适用于英特尔与 IBM Power 架构(即OpenPOWER)服务器。这里选择的服务为 MySQL 数据库服务。
从宏观层面来看,一套 Mesos/Marathon 集群的结构可抽象为以下示意图形式:
图一: Mesos/Marathon 集群
服务的概念
一项服务是指一组能够自我容纳且独立部署与管理的功能单元。面向服务架构(简称 SOA)以及最近颇为流行的微服务架构鼓励大家利用多项松散耦合的服务构建应用程序。更为现代的应用程序则由多项微服务构成,这种方式能够带来诸多优势,具体包括代码复用性、简化 scdefauult 端口范围 31000 到 32000,使用 followaling、故障独立、支持多种平台、部署灵活以及出色的敏捷性等等。
Mesos 能够处理批量、实时及其它处理框架,其执行时间一般更短。企业基础设施运行有大量应用程序及服务,因此需要更长时间完成且对于正常运行提出了不同于数据处理框架的诸多要求。这些长期运行的服务对于业务而言可能非常关键,因此需要占用相当一部分基础设施资源。因此,将服务运行在 Mesos 之上就变得非常必要。
为了以规模化方式运行服务,基础设施需要能够支持以下要求:
-
如果服务依赖于其它服务且对于服务的部署位置拥有严格要求,那么相关部署工作将变得较为复杂。
-
配置管理与软件包旨在确保某项服务的全部依赖性皆得到满足,且环境应在服务启动前配置妥当。
-
服务交付与负载均衡在同一服务的多个实例并行运行时非常重要。服务发现负责应答特定服务所运行实例的具体位置,而负载均衡则负责决定特定请求应被分配至哪个实例处。
-
在服务部署完成之后,最重要的是对服务的运行状态加以监控。运行状态监控信息可用于指导后续操作,例如对服务规模进行伸缩,或者在发生故障时对服务加以重启。
-
可用性要求指定服务需要满足的可用性,从而应对高负载与故障状况。
在运行有 RHEL 的 OpenPOWER 服务器之上设置一套 Mesos 与 Marathon 集群
以下步骤将阐述如何在 OpenPOWER 系统之上,例如运行有 RHEL Little Endian(简称LE)的 Tyan 服务器,设置一套 Mesos/Marathon 集群。
安装并设置 Mesos 主节点与 Marathon
执行以下步骤以安装并设置 Mesos 主节点与 Marathon。
添加 Unicamp 软件包库。确保以下库被添加至将成为 Mesos 集群组成部分的全部系统当中(即 mesos-master 与mesos-slave):
# cat > /etc/yum.repos.d/unicamp-misc.repo <<EOF
[unicamp-misc]
name=Unicamp Repo for Misc Packages
baseurl=http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/misc_ppc64el/
enabled=1
gpgcheck=0
EOF
使用以下命令以安装各必要软件包:
# yum install mesos python-mesos zookeeper marathon
配置 Mesos 主节点。编辑 /etc/sysconfig/mesos-master
文件并添加以下信息:
MESOS_ip=MESOS_MASTER_IP
MESOS_ZK=zk://localhost:2181/mesos
MESOS_QUORUM=1
如果 mesos-master 的 IP 地址为 192.168.122.31,那么完整配置文件应如下所示:
# This file contains environment variables that are passed to mesos-master.
# To get a description of all options run mesos-master --help; any option
# supported as a command-line option is also supported as an environment
# variable.
# Some options you're likely to want to set:
MESOS_log_dir=/var/log/mesos
MESOS_work_dir=/var/run/mesos
MESOS_port=5050
# For isolated sandbox testing
#MESOS_ip=127.0.0.1
MESOS_ip=192.168.122.31
MESOS_ZK=zk://localhost:2181/mesos
MESOS_QUORUM=1
使用以下命令重启 ZooKeeper 以及 mesos-master 服务:
# service zookeeper start
# service mesos-master start
打开网络端口。在默认情况下,mesos-master 利用端口 5050 进行通信。确保其如下所示,从而满足本地防火墙部署需求。如果大家使用防火墙,请运行以下命令以打开面向公共区域的 TCP 端口:
# firewall-cmd --zone=public --add-port=5050/tcp --permanent
# firewall-cmd –reload
运行该 Mesos 主节点以在系统上配置 Marathon。
# cat >/etc/sysconfig/marathon<<EOF
MARATHON_MASTER=zk://localhost:2181/mesos
MARATHON_ZK=zk://localhost:2181/marathon
MARATHON_TASK_LAUNCH_TIMEOUT=600000
MESOS_NATIVE_JAVA_LIBRARY=/usr/lib64/libmesos.so.22
MESOS_NATIVE_LIBRARY=/usr/lib64/libmesos.so.22
EOF
使用以下命令以启动 marathon 服务:
# service marathon start
安装并设置 Mesos 从节点
确保全部 Mesos 从节点皆完成了 Docker 配置。欲了解更多在 RHEL LE 之上安装并配置 Docker 的细节信息,请参阅 Power 系统上的 Linux 环境 Docker 安装指南。
使用以下命令以安装必要软件包:
# yum install mesos python-mesos
配置 Mesos 从节点。在 /etc/sysconfig/mesos-slave
当中编辑 HOSTNAME
变量,将其指向 Mesos 主节点 IP,而后设置 MESOS_EXECUTOR_REGISTRATION_TIMEOUT
与 MESOS_IP
变量。
举例来说,如果 mesos-master 的 IP 地址为 192.168.122.31,而 mesos-slave 为 192.168.122.48,那么配置文件内容将如下所示:
# This file contains environment variables that are passed to mesos-slave.
# To get a description of all options run mesos-slave --help; any option
# supported as a command-line option is also supported as an environment
# variable.
# The mesos master URL to contact. Should be host:port for
# non-ZooKeeper based masters, otherwise a zk:// or file:// URL.
MESOS_master=192.168.122.31:5050
MESOS_EXECUTOR_REGISTRATION_TIMEOUT=10mins
MESOS_IP=192.168.122.48
# For isolated sandbox testing
#MESOS_master=127.0.0.1:5050
# For a complete listing of options execute 'mesos-slave --help'
MESOS_log_dir=/var/log/mesos
MESOS_work_dir=/var/run/mesos
MESOS_containerizers=docker,mesos
# systemd cgroup integration
MESOS_isolation='cgroups/cpu,cgroups/mem'
MESOS_cgroups_root='system.slice/mesos-slave.service'
MESOS_cgroups_hierarchy=/sys/fs/cgroup
使用以下命令以重启该 mesos-slave 服务:
# service mesos-slave restart
打开网络端口。在默认情况下,mesos-slave 利用端口 5051 进行通信。确保其不要被本地防火墙所屏蔽。如果大家需要使用防火墙,请运行以下命令以开启一个面向公共区域的 TCP 端口:
# firewall-cmd --zone=public --add-port=5051/tcp -permanent
# firewall-cmd -reload
Marathon UI 可通过 http://mesos_master_ip:8080 网站进行访问。举例来说,如果 mesos-master 的 IP 地址为 192.168.122.31,那么 Marathon UI 链接则可通过 http://192.168.122.31:8080 网站进行访问。
通过 Marathon 进行应用程序部署
相关源代码可通过 GitHub 网站获取。
此源代码当中包含 Docker 文件以及相关设置脚本,用于在英特尔与 Power(ppc64le)系统之上构建 MySQL Docker 镜像。
在以下示例当中,192.168.122.48 将作为运行在 Mesos 服务器与 Marathon 之上系统的 IP 地址。
大家可以利用 Marathon UI 或者 REST API 直接部署一款应用。举例来说,以下代码即利用 Marathon 的 REST API 进行应用程序部署:
curl -X POST http://192.168.122.48:8080/v2/apps -d @mysqlcontainer.json -H "Content-type: application/json"
#cat mysqlcontainer.json
{
"id": "mysql",
"cpus": 0.5,
"mem": 64.0,
"instances": 1,
"container": {
"type": "DOCKER",
"docker": {
"image": "ppc64le/mysql",
"network": "BRIDGE",
"portMappings": [
{ "containerPort": 3306, "hostPort": 0, "servicePort": 0, "protocol": "tcp" }
]
}
},
"env": {
"MYSQL_ROOT_PASSWORD" : "password",
"MYSQL_USER" : "test",
"MYSQL_PASSWORD" : "test",
"MYSQL_DB" : "BucketList"
}
}
一个非零 hostPort
会被分配给某个随机端口。当然,大家也可以明确指定 hostPort
值。确保在 hostPort
中指定的各个端口包含相关资源。举例来说,如果需要使用 7000 到 8000 范围的端口,同时将 31000 到 32000 设定为默认端口范围,则请使用以下选项:
–resources="ports(*):[7000-8000, 31000-32000]"
利用 Marathon 框架接入已部署完成的服务
本章节将探讨如何利用 MySQL 服务经由 Marathon 接入已部署完成的服务,并在示例 Web 应用中加以使用。相关源代码可通过 GitHub 网站获取。这部分示例代码包含同时面向英特尔与 PowerPC LE(即ppc64le)架构的 Docke r文件。
利用 Docker 链接接入服务
在服务部署完成之后,大家需要将其发现而后进行接入,即立足于应用程序使用接入该服务的链接。当前服务的运行可能依赖于其它服务。因此,接入容器就变得非常重要。当使用 Marathon 接入服务时,请注意以下几项要点:
Mesos/Marathon 并不具备使用 Docker 链接别名的方法。因此,如果大家的应用程序配置使用到链接别名,则其将无法正常起效。举例来说,如果 Web 应用程序依赖于一套数据库容器且使用包含数据库链接前缀(例如 DB_PORT
或者 DB_TCP_ADDR
等)的环境变更,请确保该应用配置不依赖于链接别名前缀。作为连接两端的应用及服务需要被部署在同一主机之上方可实现通信。
使用限制参数在同一节点之上部署各相连容器,具体如以下示例所示:
$ curl -X POST -H "Content-type: application/json" localhost:8080/v2/apps -d '{
"id": "sleep-cluster",
"cmd": "sleep 60",
"instances": 3,
"constraints": [["hostname", "CLUSTER", "a.specific.node.com"]]
}'
要使用以上代码,首先使用 hostname
参数启动 mesos-slave,具体如下所示:
# mesos-slave --master=zk://192.168.122.48:2181/mesos --containerizers=docker,mesos --executor_registration_timeout=10mins --ip=192.168.122.253 --hostname=Ubuntu
使用 Marathon API 启动相连容器
这部分设置以 OpenPOWER(即 PowerPC 架构)为基础环境。当然,大家也可以在英特尔环境下使用同样的指令。
将目标容器名称作为值指定给链接键。另外,使用限制参数以确保新容器被部署在目标容器运行所在的同一主机之上。
curl -X POST http://192.168.122.48:8080/v2/apps -d @flaskcontainer.json -H "Content-type: application/json"
# cat flaskcontainer.json
{
"id": "flaskappcontainer",
"cpus": 0.5,
"mem": 64.0,
"instances": 1,
"container": {
"type": "DOCKER",
"docker": {
"image": "ppc64le/flaskapp",
"network": "BRIDGE",
"portMappings": [
{ "containerPort": 80, "hostPort": 0, "servicePort": 0, "protocol": "tcp" }
],
"parameters": [
{ "key": "link", "value": "mesos-b81f9a21-3133-49de-acf6-988226eb6874-S18.5d3dcaa7-05c6-4a5b-af68-dba32b7d1835"}
]
}
},
"constraints": [
[ "hostname","CLUSTER","ubuntu" ]
]
}
使用 mesos-DNS 实现服务发现与连接
这里的 mesos-DNS 负责创建指向 IP 地址的应用,而端口编号则映射运行在 Mesos 集群之上的各应用程序。
Mesos-DNS 可通过 GitHub 网站获取。其要求配合 Go 编译器使用,并可直接构建于任何平台之上。
大家可以通过 GitHub 网站找到包含源代码的示例配置文件。
以下为用于本次设置的示例配置文件内容:
{
"zk": "zk://192.168.122.48:2181/mesos",
"masters": ["192.168.122.48:5050"],
"refreshSeconds": 60,
"ttl": 60,
"domain": "mesos",
"port": 53,
"resolvers": ["8.8.8.8"],
"timeout": 5,
"listener": "0.0.0.0",
"SOAMname": "ns1.mesos",
"SOARname": "root.ns1.mesos",
"SOARefresh": 60,
"SOARetry": 600,
"SOAExpire": 86400,
"SOAMinttl": 60,
"dnson": true,
"httpon": true,
"httpport": 8125,
"externalon": true,
"IPSources": ["netinfo", "mesos", "host"],
"EnforceRFC952": false
}
欲了解与 mesos-DNS 配置参数相关的更多细节信息,请参阅 Mesos-DNS Configuration Parameters 网站。
大家可以选择在任意主机之上运行 mesos-dns 目录,或者通过 Marathon 框架加以运行。举例来说:
curl -X POST http://192.168.122.48:8080/v2/apps -d @mesos-dns.json -H "Content-type: application/json"
此为通过 Marathon 启动 mesos-dns。
curl -X POST http://192.168.122.48:8080/v2/apps -d @mesos-dns.json -H "Content-type: application/json"
此为通过Marathon启动mesos-dns。
# cat mesos-dns.json
{
"cmd": "<path>/mesos-dns -config=<path>/config.json",
"cpus": 1.0,
"mem": 1024,
"id": "mesos-dns",
"instances": 1,
}
直接在该主机上使用以下命令以运行 mesos-dns:
# mesos-dns -v=1 -config=<path_to_config_json>
利用以下格式命名该项服务:
<service-name>.<framework>.<domain-name>
如此一来,该 MySQL 服务的 DNS 名称将为 mysql.marathon.mesos
。
Mesos-DNS 还能够为各项服务创建 DNS SRV 记录。一条 SRV 记录负责将一条服务名称与一个主机名称及一个 IP 端口相关联。 Mesos-DNS 为服务生成一条名为 _task._protocol.framework.domain
的 DNS-SRV 记录。
在这里:
Task
(即任务)代表所启动的应用/服务(在本示例中为 MySQL)。Protocol
(即协议)为 UDP 或者 TCP。framework
(框架)为 Marathon 或者任意其它框架。Domain
(域)即为集群域(在本示例中为 Mesos)。
此条 SRV 记录可由其它 Marathon 应用用于发现服务。举例来说,任何需要配合 MySQL 服务的应用都能够从 SRV 记录当中找到 _mysql_tcp.marathon.mesos
。
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e227390bfb3d ppc64le/mysql "/setup.sh" 3 seconds ago Up Less than a second 0.0.0.0:31172->3306/tcp mesos-fabb6e52-064a-425a-a501-330bc772cd55-S16.85fb3e7c-b2ca-412f-ac75-1ec314bee575
# dig _mysql._tcp.marathon.mesos -t SRV
; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7 <<>> _mysql._tcp.marathon.mesos -t SRV
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2126
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; QUESTION SECTION:
;_mysql._tcp.marathon.mesos. IN SRV
;; ANSWER SECTION:
_mysql._tcp.marathon.mesos. 60 IN SRV 0 0 31172 mysql-4huw5-s16.marathon.slave.mesos.
;; ADDITIONAL SECTION:
mysql-4huw5-s16.marathon.slave.mesos. 60 IN A 192.168.122.48
;; Query time: 1 msec
;; SERVER: 192.168.122.48#53(192.168.122.48)
;; WHEN: Mon Feb 08 14:27:38 IST 2016
;; MSG SIZE rcvd: 147
以下为利用 dnspython 模块查询 SRV 记录,从而检索对应主要及端口以访问该项服务的示例 Python 代码:
import dns.resolver
a = dns.resolver.query("_mysql._tcp.marathon.mesos",dns.rdatatype.SRV)
for i in a.response.answer:
for j in i.items:
print j.target
print j.port
以下为示例设置的输出结果:
mysql-4huw5-s16.marathon.slave.mesos.
31172
因此,可以推断出 MySQL 服务器运行在主机名称为 mysql-4huw5-s16.marathon.slave.mesos 的从节点之上,且使用端口 31172。
类似的逻辑亦可直接结合应用程序配置使用,或者将该数据用于设置应用程序配置所必需的相关环境变量。举例来说,大家可以分别将由目标及端口返回的值设置为 MYSQL_TCP_ADDR
与MYSQL_TCP_PORT
。