共计 10666 个字符,预计需要花费 27 分钟才能阅读完成。
Mesos 和 Marathon
Mesos 是一个分布式集群管理器,旨在通过在多个任务之间动态共享资源来改善资源使用。Mesos 提供了所有集群节点上的资源的统一视图,支持无缝地访问这些资源,访问方式与操作系统内核访问单个计算机的资源的方式类似。因此,Mesos 也被称为数据中心的内核。通过使用 Mesos,您可以掌握构建数据中心应用程序的核心要点,Mesos 的主要组件是一个可扩展的 2 阶段调度程序。
以下是 Mesos 集群管理器的关键组件:
- 主节点:协调所有集群操作的集群管理器。可以提供多个主节点来实现高可用性。
- 从属节点(或节点):运行任务的集群成员。
- 框架:在集群中运行的实际任务。许多现有的框架允许将各种各样的应用程序和服务部署在 Mesos 集群管理器上。
请参阅 Mesos 架构 了解更多信息。
下一节将介绍如何使用 Marathon 框架将应用程序和服务部署在 Mesos 上。
可用性
下表列出了针对 IBM PowerPC® Little Endian (ppc64le) 平台的相关包的位置:
请参阅 Unicamp 存储库,地址为:http://ftp.unicamp.br/pub/ppc64el/rhel/7_1/misc_ppc64el/
备注:对于 IBM Power® 上的其他发行版,您必须用源代码来构建包。
Marathon
Marathon 是一个用于在 Mesos 上运行长应用或长服务的框架。这些应用程序具有高可用性需求,这意味着 Marathon 可以监视故障并在发生故障时自动重新启动应用程序实例,还能够灵活地扩展应用程序。Marathon 可运行其他框架(比如 Hadoop)和它自己的框架。典型的 Marathon 使用工作流是在集群内的某个地方运行一个应用程序的 N 个实例,每个应用程序实例需要一个处理器和 1 GB 内存。您可以向 Marathon 提交此请求来创建 N 个要在从属节点上运行的 Mesos 任务。
Marathon 提供了一个具象状态传输 (REST) API 来启动、停止和扩展服务。有一个基于浏览器的 GUI,也有一个命令行客户端。它可以通过运行多个 Marathon 实例在一种高度可用的模式下运行。
在本文中,您将看到如何通过 Marathon 部署服务,并在示例应用程序中使用该服务。这里提及的操作说明也适用于基于 Intel® 和 IBM Power 架构 (OpenPOWER) 的服务器。该服务是一个 MySQL 数据库服务。
下图大体演示了一个 Mesos/Marathon 集群:
图 1. Mesos/Marathon 集群
点击查看大图
服务介绍
服务是一个自成一体的、独立部署和管理的功能单元。面向服务的架构 (SOA) 和最近的微服务架构鼓励应用程序包含松散耦合的服务。更加现代的应用程序包含多个微服务,因为它们提供了一些优势,比如代码重用、31000 到 32000 的容易扩展的默认端口范围、容易理解、独立的故障、支持多个平台、部署灵活性和更高的敏捷性。
Mesos 处理批处理、实时和其他处理框架,通常需要更少的时间即可完成操作。企业基础架构运行大量应用程序和服务,它们需要更长时间才能处理完成,而且具有与数据处理框架不同的需求。这些长期运行的服务对业务至关重要,也会使用很大一部分基础架构资源。因此,在 Mesos 上运行服务的能力很重要。
要大规模运行服务,基础架构需要能够支持以下需求:
- 如果一个服务依赖于其他服务,而且对服务可部署到的地方存在限制,那么部署该服务可能很复杂。
- 配置管理和打包是为了确保服务的所有依赖关系都得到满足,而且在服务启动前已为服务正确配置了环境。
- 在运行着一个服务的多个实例时,服务发现和负载平衡会变得很重要。服务发现可以回答特定服务的实例在何处运行的问题,负载平衡旨在决定特定请求应发送到哪个实例。
- 部署服务后,对服务执行健康监视很重要。可利用健康监视信息采取进一步措施,比如扩展或精减服务,或者在发生故障时重新启动服务。
- 可用性需求要求在具有高负载和发生故障时,服务需要处于可用状态。
在运行 RHEL 的 OpenPOWER 服务器上设置 Mesos 和 Marathon 集群
以下说明介绍了如何在 OpenPOWER 系统(比如运行 RHEL little endian (LE) 的 Tyan)上设置 Mesos/Marathon 集群。
安装和设置 Mesos 主节点和 Marathon
执行以下步骤来安装和设置 Mesos 主节点和 Marathon。
- 添加 Unicamp 包存储库。确保以下存储库已添加到所有将包含在 Mesos 集群中的系统上(mesos-master 和 mesos-slaves):1234567
# 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
- 运行以下命令来安装所需的包:1
# yum install mesos Python-mesos zookeeper marathon
- 配置 Mesos 主节点。编辑 /etc/sysconfig/mesos-master 文件并添加以下信息:123
MESOS_ip=MESOS_MASTER_IP
MESOS_ZK=zk://localhost:2181/mesos
MESOS_QUORUM=1
如果 mesos-master 的 IP 地址为 192.168.122.31,完整的配置文件如以下代码所示:
1234567891011121314# 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 服务:12
# service zookeeper start
# service mesos-master start
- 打开网络端口。默认情况下,mesos-master 在端口 5050 上通信。在下一节中,将了解如何部署才能不被本地防火墙拦截。如果使用了防火墙,可以运行以下命令来打开一个针对 公共 区域的 TCP 端口:12
# firewall-cmd --zone=public --add-port=5050/tcp --permanent
# firewall-cmd –reload
- 在系统上运行 Mesos 集群来配置 Marathon。1234567
# 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 服务:1
# service marathon start
安装和设置 Mesos 从属节点
确保所有 Mesos 从属节点都配置了 Docker 设置。有关在 RHEL LE 上安装和配置 Docker 的更多信息,请参阅 用于 Linux on Power Systems 的 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 的 IP 地址为 192.168.122.48,则配置文件类似于:12345678910111213141516171819# 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 端口:12
# 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,那么可以在 http://192.168.122.31:8080 网站上访问 Marathon UI 链接。
通过 Marathon 部署应用程序
源代码可在 https://github.com/bpradipt/docker-mysql.git 网站上找到。
源代码包含用于在 Intel 和 Power (ppc64le) 系统上构建 MySQL Docker 镜像的 Docker 文件和相关设置脚本。
在以下示例中,192.168.122.48 是运行 Mesos 服务器和 Marathon 的系统的 IP 地址。
您可以使用 Marathon UI 或直接使用 REST API 部署应用程序。例如,以下命令使用了 Marathon 的 REST API 部署应用程序::
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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
中指定的端口包含在一些资源信息中。例如,如��除了默认端口范围 31000 到 32000 外,还需要使用端口范围 7000 到 8000,可使用以下选项:–resources="ports(*):[7000-8000, 31000-32000]"
连接到使用 Marathon 框架部署的服务
本节将介绍如何使用 MySQL 服务来连接和使用通过 Marathon 部署的服务,并在一个示例 Web 应用程序中使用它。
源代码可在 https://github.com/bpradipt/sampleflaskapp.git 网站上获得。示例代码拥有针对 Intel 和 PowerPC LE (ppc64le) 架构的 Docker 文件。
使用 Docker 链接连接到一个服务
部署服务后,必须发现和连接该服务,也就是说,必须从一个应用程序链接到该服务。一个服务可依赖于另一个服务。因此,链接容器很重要。
在使用 Marathon 链接服务时,请注意以下几点:
- Mesos/Marathon 没有一种方法来使用 Docker 链接别名。因此,如果您的应用程序配置依赖于一个链接别名,它可能不起作用。例如,如果 Web 应用程序依赖于一个数据库容器,而且为环境变量使用数据库链接前缀(DB_PORT、DB_TCP_ADDR 等),请确保应用程序配置不依赖于链接别名前缀。
- 链接的应用程序和服务需要部署在同一个主机上,它们才能通信。
使用 constraints
参数将链接的容器部署在同一个节点上,如下面的示例所示:
1 2 3 4 5 6 | $ 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,如下面的示例所示:
1 | # 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 架构)的环境中进行的。但是,您可以为基于 Intel 的环境使用相同的指令。
将目标容器名称指定为 link 键的值。此外,使用 constraints
参数确保新容器部署在运行目标容器的同一个主机上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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 创建应用程序来对 Mesos 集群中运行的每个应用程序建立 IP 地址和端口号映射。
Mesos-DNS 可在 https://github.com/mesosphere/mesos-dns 网站上获得。它需要 Go 编译器,如果 Go 编译器可用,在任何平台上构建它都很简单。
源代码本身包含一个示例配置文件,该文件可在 https://github.com/mesosphere/mesos-dns/blob/master/config.json.sample 网站上找到。
以下是用于该设置的示例配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | { "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 } |
其中:
zk
是运行 ZooKeeper 的位置masters
是运行主节点的位置domain
是 Mesos 集群的域名port
是 Mesos DNS 端口listener
是绑定到 mesos-dns 的 IPresolver
是外部 DNS 服务器httpport
:将运行 mesos-dns HTTP API 的端口
有关 mesos-DNS 配置参数的更多信息,请参阅 Mesos-DNS 配置参数 网站。
您可以在任何主机上运行 mesos-dns 目录或通过 Marathon 框架运行它。例如:
1 | curl -X POST http://192.168.122.48:8080/v2/apps -d @mesos-dns.json -H "Content-type: application/json" |
这将通过 Marathon 启动 mesos-dns。
1 | curl -X POST http://192.168.122.48:8080/v2/apps -d @mesos-dns.json -H "Content-type: application/json" |
这将通过 Marathon 启动 mesos-dns。
1 2 3 4 5 6 7 8 | # cat mesos-dns.json { "cmd": "< path >/mesos-dns -config=< path >/config.json", "cpus": 1.0, "mem": 1024, "id": "mesos-dns", "instances": 1, } |
使用以下命令直接在主机上运行 mesos-dns:
1 | # mesos-dns -v=1 -config=< path_to_config_json > |
使用以下格式对该服务命令:
1 | < service-name >.< framework >.< domain-name > |
因此,MySQL 服务 DNS 名称将是 mysql.marathon.mesos
Mesos-DNS 也会为服务创建 DNS SRV 记录。SRV 记录将服务名称与主机名和 IP 端口相关联。Mesos-DNS 为服务名称生成一条 DNS-SRV 记录 _task._protocol.framework.domain。
其中:
- 任务是启动的应用程序 / 服务(在本例中为 MysSQL)
- 协议是 UDP 或 TCP,框架是 Marathon 或其他任何框架
- 域是集群域(在本例中为 Mesos)。
其他 Marathon 应用程序可使用此 SRV 记录来发现服务。
例如,需要 MySQL 服务的任何应用程序都可以查找 _mysql_tcp.marathon.mesos 的 SRV 记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 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 |
有关 mesos-dns 命名的更多信息,请参阅 服务命名。
下面的示例 Python 代码使用 dnspython
模块查询 SRV 记录,检索访问该服务所需的主机和端口:
1 2 3 4 5 6 7 | 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 |
以下是示例设置中的输出:
1 2 | mysql-4huw5-s16.marathon.slave.mesos. 31172 |
因此,可以推断 MySQL 服务在主机名为 mysql-4huw5-s16.marathon.slave.mesos 的从属节点的端口 31172 上运行。
可将一种类似逻辑直接包含在应用程序配置中,或者可以使用该数据设置应用程序配置所需的相关环境变量。例如,可以将 MYSQL_TCP_ADDR
和 MYSQL_TCP_PORT
分别设置为目标和端口返回的值。
联络相关人员
IBM Linux Technology Center (LTC) 是一个 IBM 开源软件开发人员团队,他们与 Linux 开源开发社区合作开展工作。LTC 是一个 Linux 技术能力中心。请联系我们。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-12/138714.htm