手机版
你好,游客 登录 注册
背景:
阅读新闻

在 RHEL 7.1 little endian 上设置 Mesos/Marathon 集群

[日期:2016-12-23] 来源:IBM  作者:Pradipta Banerjee [字体: ]

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。

  1. 添加 Unicamp 包存储库。确保以下存储库已添加到所有将包含在 Mesos 集群中的系统上(mesos-master 和 mesos-slaves):
    1
    2
    3
    4
    5
    6
    7
    # 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
  2. 运行以下命令来安装所需的包:
    1
    # yum install mesos Python-mesos zookeeper marathon
  3. 配置 Mesos 主节点。编辑 /etc/sysconfig/mesos-master 文件并添加以下信息:
    1
    2
    3
    MESOS_ip=MESOS_MASTER_IP
    MESOS_ZK=zk://localhost:2181/mesos
    MESOS_QUORUM=1

    如果 mesos-master 的 IP 地址为 192.168.122.31,完整的配置文件如以下代码所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 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
  4. 运行以下命令来重新启动 ZooKeeper 和 mesos-master 服务:
    1
    2
    # service zookeeper start
    # service mesos-master start
  5. 打开网络端口。默认情况下,mesos-master 在端口 5050 上通信。在下一节中,将了解如何部署才能不被本地防火墙拦截。如果使用了防火墙,可以运行以下命令来打开一个针对公共区域的 TCP 端口:
    1
    2
    # firewall-cmd --zone=public --add-port=5050/tcp --permanent
    # firewall-cmd –reload
  6. 在系统上运行 Mesos 集群来配置 Marathon。
    1
    2
    3
    4
    5
    6
    7
    # 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
  7. 运行以下命令来启动 marathon 服务:
    1
    # service marathon start

安装和设置 Mesos 从属节点

确保所有 Mesos 从属节点都配置了 Docker 设置。有关在 RHEL LE 上安装和配置 Docker 的更多信息,请参阅 用于 Linux on Power Systems 的 Docker

  1. 运行以下命令来安装需要的包:# yum install mesos python-mesos
  2. 配置 Mesos 从属节点。编辑 /etc/sysconfig/mesos-slave 中的 HOSTNAME 变量来指向 Mesos 主节点 IP,然后设置 MESOS_EXECUTOR_REGISTRATION_TIMEOUTMESOS_IP 变量。
    例如,如果 mesos-master 的 IP 地址为 192.168.122.31,mesos-slave 的 IP 地址为 192.168.122.48,则配置文件类似于:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 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
  3. 运行以下命令来重新启动 mesos-slave 服务:
    # service mesos-slave restart
  4. 打开网络端口。默认情况下,mesos-slave 在端口 5051 上通信。确保它未被本地防火墙拦截。如果使用了防火墙,可以运行以下命令来打开一个针对公共区域的 TCP 端口:
    1
    2
    # 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 的 IP
  • resolver 是外部 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_ADDRMYSQL_TCP_PORT 分别设置为目标和端口返回的值。

联络相关人员

IBM Linux Technology Center (LTC) 是一个 IBM 开源软件开发人员团队,他们与 Linux 开源开发社区合作开展工作。LTC 是一个 Linux 技术能力中心。请联系我们。

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-12/138714.htm

linux
相关资讯       Marathon  Mesos集群 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款