使用Mesos和Marathon管理Docker集羣

       分佈式系統是難於理解、設計、構建 和管理的,他們將比單個機器成倍還要多的變量引入到設計中,使應用程序的根源問題更難發現。SLA(服務水平協議)是衡量停機和/或性能降低的標準,大多數現代應用程序有一個指望的彈性SLA水平,一般按"9"的數量增長(如,每個月99.9或99.99%可用性)。每一個額外的9變得愈來愈難實現。python

   分佈式系統一般是以靜態分區,好比Akka/Play、 Spark/Hadoop、Storm和 Redis各自分區分組劃分。靜態分區帶來的缺點是增長複雜性,隨着機器數量增長,軟件管理愈來愈複雜,失敗管理維護愈來愈難。並且資源消耗很是不經濟, 下圖是靜態分區下資源利用率:linux

   Apache Mesos可以在一樣的集羣機器上運行多種分佈式系統類型,更加動態有效率低共享資源。提供失敗偵測,任務發佈,任務跟蹤,任務監控,低層次資源管理和細粒度的資源共享,能夠擴展伸縮到數千個節點。Mesos已經被Twitter用來管理它們的數據中心。web

mesos架構

Mesos架構

Mesos架構圖以下:docker

mesos架構

  Mesos框架是一個在Mesos上運行分佈式應用的應用程序,它有兩個組件:json

  1. 調度器 : 與Mesos交互,訂閱資源,而後在mesos從服務器中加載任務。
    ubuntu

  2. 執行器 : 從框架的環境變量 配置中得到信息,在mesos從服務器中運行任務。瀏覽器

  下面看看其是如何實現資源調用?Mesos經過"resources offers" 分配資源,資源實際上是當前可用資源的一個快照,調度器將使用這些資源在mesos從服務器上運行任務。服務器

Mesos主從服務器調度資源的順序圖以下:架構

  首先由Mesos主服務器查詢可用資源給調度器,第二步調度器向主服務器發出加載任務,主服務器再傳達給從服務器,從服務器向執行器命令加載任務執行,執行器執行任務之後,將狀態反饋上報給從服務器,最終告知調度器 。app

  從服務器下管理多個執行器,每一個執行器是一個容器,之前可使用Linux容器LXC,如今使用Docker容器。

 

失敗恢復和高可用性

  Mesos主服務器使用Zookeeper進行服務選舉和發現。它有一個註冊器記錄了全部運行任何和從服務器信息,使用MultiPaxos進行日誌複製實現一致性。

Mesos有一個從服務器恢復機制,不管何時一個從服務器死機了,用戶的任務仍是可以繼續運行,從服務器會將一些關鍵點信息如任務信息 狀態更新持久化到本地磁盤上,從新啓動時能夠從磁盤上恢復運行這些任務(相似Java中的鈍化和喚醒)

 

什麼是Marathon

   它是一個mesos框架,可以支持運行長服務,好比web應用等。是集羣的分佈式Init.d,可以原樣運行任何Linux二進制發佈版本,如 Tomcat Play等等,能夠集羣的多進程管理。也是一種私有的Pass,實現服務的發現,爲部署提供提供REST API服務,有受權和SSL、配置約束,經過HAProxy實現服務發現和負載平衡。

   這樣,咱們能夠如同一臺Linux主機同樣管理數千臺服務器,它們的對應原理以下圖,使用Marathon相似Linux主機內的init Systemd等外殼管理,而Mesos則不僅包含一個Linux核,能夠調度數千臺服務器的Linux核,實際是一個數據中心的內核:

 

Mesos安裝配置

首先,咱們須要設置Mesos集羣環境,下面咱們以在Ubuntu 14.04 vagrant 節點上設置Mesos master/slave 和 Zookeeper。安裝依賴:

$ apt-get install curl python-setuptools python-pip python-dev python-protobuf

安裝zookeeper:

$ apt-get install zookeeperd

安裝後,Zookeeper有一個配置,每一個Zookeeper須要知道它在quorum中的位置。

$ echo 1 | sudo dd of=/var/lib/zookeeper/myid

下面設置Docker:

$ echo "deb http://get.docker.io/ubuntu docker main" > /etc/apt/sources.list.d/docker.list

$ apt-get update && apt-get install lxc-docker

$ docker version

 Client version: 1.0.0
     Client API version: 1.12
     Go version (client): go1.2.1
     Git commit (client): 63fe64c
     Server version: 1.0.0
     Server API version: 1.12
     Go version (server): go1.2.1
     Git commit (server): 63fe64c

 

從Docker Hub拉取一個ubuntu image

$ docker pull libmesos/ubuntu

 

配置Mesos:

$ curl -fL http://downloads.mesosphere.io/master/ubuntu/14.04/mesos_0.19.0~ubuntu14.04%2B1_amd64.deb -o /tmp/mesos.deb
$ dpkg -i /tmp/mesos.deb
$ mkdir -p /etc/mesos-master
$ echo in_memory | sudo dd of=/etc/mesos-master/registry
## Mesos Python egg for use in authoring frameworks
$ curl -fL http://downloads.mesosphere.io/master/ubuntu/14.04/mesos-0.19.0_rc2-py2.7-linux-x86_64.egg -o /tmp/mesos.egg
$ easy_install /tmp/mesos.egg
 

下載Marathon:

$ tar xvzf marathon-0.6.0.tgz

Mesos經過Deimos 管理Docker,經過pip安裝Deimos:

$ pip install deimos

配置mesos 使用Deimos

$ mkdir -p /etc/mesos-slave
$ echo /usr/local/bin/deimos | sudo dd of=/etc/mesos-slave/containerizer_path
$ echo external | sudo dd of=/etc/mesos-slave/isolation

 

啓動全部服務 :

$ initctl reload-configuration

$ service docker start

$ service zookeeper start

$ service mesos-master start

$ service mesos-slave start

##### Starting Marathon #####

$ cd marathon-0.6.0

$ ./bin/start --master zk://localhost:2181/mesos --zk_hosts localhost:2181

 

Marathon 在端口8080已經啓動偵聽,咱們能夠經過瀏覽器訪問:

curl localhost:8080/help # gives us some details about the API's

 

啓動容器

咱們經過Marathon啓動一個容器的REST API提交以下:

curl -X POST -H "Accept: application/json" -H "Content-Type: application/json" \
localhost:8080/v2/apps -d '{
"container": {"image": "docker:///libmesos/ubuntu", "options": ["--privileged"]},
"cpus": 0.5,
"cmd": "sleep 500",
"id": "docker-tester",
"instances": 1,
"mem": 300
}'

咱們經過在curl命令後選項"options"提交定製的Docker,咱們能檢查syslog ,由於mesos缺省日誌是放在syslog中。

Jun 27 07:24:58 vagrant-ubuntu-trusty-64 deimos[19227]: deimos.containerizer.docker.launch() exit 0 // docker run --sig-proxy --rm --cidfile /tmp/deimos/mesos/00d459fb-22ca-4af7-9a97-ef8a510905f2/cid -w /tmp/mesos-sandbox -v /tmp/deimos/mesos/00d459fb-22ca-4af7-9a97-ef8a510905f2/fs:/tmp/mesos-sandbox --privileged -p 31498:31498 -c 512 -m 300m -e PORT=31498 -e PORT0=31498 -e PORTS=31498 libmesos/ubuntu sh -c 'sleep 500'

咱們也能經過Marathon Rest API檢查咱們啓動任務的狀態:

curl -X GET -H "Content-Type: application/json" localhost:8080/v2/apps

下面是Marathon UI得到信息的截圖:

 

更多關於Docker任務的信息能夠經過Mesos GUI在Mesos主服務器的端口5050 ,如今咱們測試一下任務的伸縮性,好比咱們須要加入更多節點服務器,有兩種辦法,使用GUI或經過發出put請求。

curl -X PUT -H "Content-Type: application/json" localhost:8080/v2/apps/docker-tester \
"container": {"image": "docker:///libmesos/ubuntu", "options": ["--privileged"]},
"cpus": 0.5,
"cmd": "sleep 500",
"id": "docker-tester",
"instances": 2, # increasing the instance count to 2
"mem": 300
}'

Marathon能確保全部docker進程啓動運行,若是某個進程崩潰,Marathon會從新啓動一樣的進程,以確保每一個配置運行一個實例,還有其餘開源Mesos調度器如Apache Aurora, Airbnb's Chronos. 可是marathon比較直接簡單提供好的REST API用來管理容器,雖然Mesos, Marathon 和Docker還很年輕,可是提供了基於Docker的殺手級集羣管理組合。

相關文章
相關標籤/搜索