代码级干货 | 在RHEL 7.1上设置Mesos/Marathon集群

88510199 2019-06-20

新的一周又开始啦,大家月饼有没有吃到撑?小数今天为大家带来的文章是十足的干货,以详实的代码展示了如何在企业版Linux上部署Mesos/Marathon集群,据说阅读干货更有助于消化月饼哦:)

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/ppc...

注意:对于在IBM Power之上运行其它发行版,大家必须从源处构建软件包。

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集群的结构可抽象为以下示意图形式:

代码级干货 | 在RHEL 7.1上设置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。

  1. 添加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
  2. 使用以下命令以安装各必要软件包:

    # yum install mesos python-mesos zookeeper marathon
  3. 配置Mesos主节点。编辑 /etc/sysconfig/mesos-master文件并添加以下信息:

    MESOS_ip=MESOS_MASTER_IP
    MESOS_ZK=zk://localhost:2181/mesos
    MESOS_QUORUM=1
  4. 如果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
  5. 使用以下命令重启ZooKeeper以及mesos-master服务:

    # service zookeeper start
    # service mesos-master start
  6. 打开网络端口。在默认情况下,mesos-master利用端口5050进行通信。确保其如下所示,从而满足本地防火墙部署需求。如果大家使用防火墙,请运行以下命令以打开面向公共区域的TCP端口:

    # firewall-cmd --zone=public --add-port=5050/tcp --permanent
    # firewall-cmd –reload
  7. 运行该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
  8. 使用以下命令以启动marathon服务:

    # service marathon start

安装并设置Mesos从节点

确保全部Mesos从节点皆完成了Docker配置。欲了解更多在RHEL LE之上安装并配置Docker的细节信息,请参阅Power系统上的Linux环境Docker安装指南。

  1. 使用以下命令以安装必要软件包: # yum install mesos python-mesos

  2. 配置Mesos从节点。在/etc/sysconfig/mesos-slave当中编辑HOSTNAME变量,将其指向Mesos主节点IP,而后设置MESOS_EXECUTOR_REGISTRATION_TIMEOUT与MESOS_IPvariables。

举例来说,如果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
  1. 使用以下命令以重启该mesos-slave服务::

    # service mesos-slave restart
  2. 打开网络端口。在默认情况下,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进行应用程序部署

相关源代码可通过https://github.com/bpradipt/d...网站获取。

此源代码当中包含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应用中加以使用。相关源代码可通过https://github.com/bpradipt/s... 网站获取。这部分示例代码包含同时面向英特尔与PowerPC LE(即ppc64le)架构的Docker文件。

利用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可通过https://github.com/mesosphere...网站获取。其要求配合Go编译器使用,并可直接构建于任何平台之上。

大家可以通过https://github.com/mesosphere... 网站找到包含源代码的示例配置文件。

以下为用于本次设置的示例配置文件内容:

{
  "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。

本文作者Pradipta Banerjee,版权归作者所有
原文链接:
http://www.ibm.com/developerw...

相关推荐

littleBird / 0评论 2019-10-22

世界说 / 0评论 2018-01-01