代碼級乾貨 | 在RHEL 7.1上設置Mesos/Marathon集羣

新的一週又開始啦,你們月餅有沒有吃到撐?小數今天爲你們帶來的文章是十足的乾貨,以詳實的代碼展現瞭如何在企業版Linux上部署Mesos/Marathon集羣,聽說閱讀乾貨更有助於消化月餅哦:)html

Mesos與 Marathon

Mesos

Mesos是一套分佈式集羣管理器,旨在經過以動態方式於不一樣任務之間共享資源的方式改進資源使用率。Mesos則提供一種統一化資源視角,其涵蓋所有集羣節點並可以以無縫化方式利用相似於單一計算機內操做系統內核的方式實現資源訪問。所以,Mesos亦被稱爲數據中心的內核機制。經過使用Mesos,你們能夠構建起數據中心應用,並且Mesos的主要組件亦可做爲一種可擴展的兩段式調度工具。node

如下爲Mesos集羣管理器中的各關鍵性組件:python

主節點:負責協調所有集羣操做的集羣管理器。多個主節點可同時存在以實現高可用性。
從節點(亦被稱爲節點):任務運行所在的各集羣成員。
框架:運行在集羣之上的實際任務。目前存在多種框架,容許你們將一系列應用程序及服務組合部署在Mesos集羣管理器之上。mysql

如下章節將探討如何利用Marathon框架將應用程序與服務部署在Mesos之上。git

可用性

如下列出了IBM PowerPC Little Endian(ppc64le)平臺上的各相關軟件包位置:github

Linux發行版:Red Hat Enterprise Linux (RHEL) 7.Xsql

軟件包位置:Unicampdocker

具體請參閱Unicamp庫: http://ftp.unicamp.br/pub/ppc...數據庫

注意:對於在IBM Power之上運行其它發行版,你們必須從源處構建軟件包。json

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。

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

相關文章
相關標籤/搜索