Mesos 是一套分布式集群管理器,旨在通過以動態方式於不同任務之間共享資源的方式改進資源使用率。Mesos 提供一種統一化資源視角,其涵蓋全部集群節點,並能夠以無縫化方式利用類似於單一計算機內操作系統內核的方式實現資源訪問。因此,Mesos 亦被稱為數據中心的內核機制。通過使用 Mesos,大家可以構建起數據中心應用,而且 Mesos 的主要組件亦可作為一種可擴展的兩段式調度工具。
以下為 Mesos 集群管理器中的各關鍵性組件:主節點:負責協調全部集群操作的集群管理器。多個主節點可同時存在以實現高可用性。 從節點(亦被稱為節點):任務運行所在的各集群成員。 框架:運行在集群之上的實際任務。目前存在多種框架,允許大家將一系列應用程序及服務組合部署在 Mesos 集群管理器之上。
以下章節將探討如何利用 Marathon 框架將應用程序與服務部署在 Mesos 之上。
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 集群的結構可抽象為以下示意圖形式:
服務的概念一項服務是指一組能夠自我容納且獨立部署與管理的功能單元。面向服務架構(簡稱 SOA)以及最近頗為流行的微服務架構鼓勵大家利用多項松散耦合的服務構建應用程序。更為現代的應用程序則由多項微服務構成,這種方式能夠帶來諸多優勢,具體包括代碼復用性、簡化 scdefauult 端口范圍 31000 到 32000,使用 followaling、故障獨立、支持多種平台、部署靈活以及出色的敏捷性等等。
Mesos 能夠處理批量、實時及其它處理框架,其執行時間一般更短。企業基礎設施運行有大量應用程序及服務,因此需要更長時間完成且對於正常運行提出了不同於數據處理框架的諸多要求。這些長期運行的服務對於業務而言可能非常關鍵,因此需要占用相當一部分基礎設施資源。因此,將服務運行在 Mesos 之上就變得非常必要。
為了以規模化方式運行服務,基礎設施需要能夠支持以下要求:
1.如果服務依賴於其它服務且對於服務的部署位置擁有嚴格要求,那麼相關部署工作將變得較為復雜。 2.配置管理與軟件包旨在確保某項服務的全部依賴性皆得到滿足,且環境應在服務啟動前配置妥當。 3.服務交付與負載均衡在同一服務的多個實例並行運行時非常重要。服務發現負責應答特定服務所運行實例的具體位置,而負載均衡則負責決定特定請求應被分配至哪個實例處。 4.在服務部署完成之後,最重要的是對服務的運行狀態加以監控。運行狀態監控信息可用於指導後續操作,例如對服務規模進行伸縮,或者在發生故障時對服務加以重啟。 5.可用性要求指定服務需要滿足的可用性,從而應對高負載與故障狀況。在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 <使用以下命令以安裝各必要軟件包:
# 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<使用以下命令以啟動 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 -reloadMarathon 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": "/mesos-dns -config= /config.json", "cpus": 1.0, "mem": 1024, "id": "mesos-dns", "instances": 1, } 直接在該主機上使用以下命令以運行 mesos-dns:
# mesos-dns -v=1 -config=利用以下格式命名該項服務:
.<framework>. </framework> <framework> </framework> 如此一來,該 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。