1. 程式人生 > >Marathon主要功能介紹(一)

Marathon主要功能介紹(一)

【摘要】Marathon是一個成熟的,輕量級的,擴充套件性很強的Apache Mesos的容器編排框架,它主要用來排程和執行常駐服務(long-running service),提供了友好的介面和Rest API來建立和管理應用。Mesosphere在最近剛剛釋出的開源的DC/OS中把Marathon作為其預設的內建應用,可見它的重要性。為了能讓大家快速的瞭解Marathon的主要的核心功能,作者將根據自己在Mesos和Marathon社群的的開發和實踐經驗,將提供一系列文章來介紹Marathon的主要的核心功能。本文是第一篇。

Marathon的安裝部署

在介紹Marathon的核心功能之前,為了讀者可以快速的體驗Marathon的主要的功能,本章節將帶領大家在Docker中快速的搭建一個Marathon的叢集。

安裝環境,作者準備了三臺Ubuntu 14.04的虛擬機器:

wangyongqiao1.eng.platformlab.ibm.com / 9.111.255.10 - Master
wangyongqiao2.eng.platformlab.ibm.com / 9.111.254.41 - Agent
wangyongqiao3.eng.platformlab.ibm.com / 9.111.255.50 - Agent

Step 1 安裝Docker

由於下文我們將介紹如何在Marathon中執行Docker容器,因此必須先在計算節點上安裝Docker,因為我們要把Marathon,ZK,Mesos服務執行在Docker中,所以我們也必須在Master節點上安裝docker,因此需要在以上三個機器上執行如下命令,來安裝docker:

 apt-get update 
 apt-get install wget
 wget -qO- https://get.docker.com/ | sh
 service docker start
 docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 10
Server Version: 1.11.1
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
  Dirs: 83
 Dirperm1 Supported: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local Network: null host bridge Kernel Version: 3.13.0-32-generic Operating System: Ubuntu 14.04.1 LTS OSType: linux Architecture: x86_64 CPUs: 2 Total Memory: 3.852 GiB Name: wangyongqiao1.eng.platformlab.ibm.com ID: RJNG:KRN6:OUXI:Z6ND:MRN6:VC4A:3JRQ:F5XZ:4YIX:GEDZ:K5IF:PVHM Docker Root Dir: /var/lib/docker Debug mode (client): false Debug mode (server): false Http Proxy: http://9.21.61.175:3128/ Registry: https://index.docker.io/v1/ WARNING: No swap limit support

Step 2 安裝Zookeeper叢集
因為Marathon會將執行時的一些狀態state儲存在Zookeeper中,同時在Marathon高可用模式下,Marathon Leader的選舉也依賴於Zookeeper,所以首先我們必須先執行一個Zookeeper叢集來為多個Marathon服務之間共享狀態和Leader的選舉。執行以下命令,在以上三個機器上安裝ZK叢集:

登陸wangyongqiao1.eng.platformlab.ibm.com執行以下命令:
# docker run -d \
  -e MYID=1 \
  -e SERVERS=9.111.255.10,9.111.254.41,9.111.255.50 \
  --name=zookeeper \
  --net=host \
  --restart=always \
  mesoscloud/zookeeper
# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
07bf2d5b3796        mesoscloud/zookeeper   "/entrypoint.sh zkSer"   2 seconds ago       Up 2 seconds                            zookeeper

登陸wangyongqiao2.eng.platformlab.ibm.com執行以下命令:
# docker run -d \
  -e MYID=2 \
  -e SERVERS=9.111.255.10,9.111.254.41,9.111.255.50 \
  --name=zookeeper \
  --net=host \
  --restart=always \
  mesoscloud/zookeeper
# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
03bf7c58ad53        mesoscloud/zookeeper   "/usr/local/bin/dumb-"   2 seconds ago       Up 1 seconds                            zookeeper

登陸wangyongqiao3.eng.platformlab.ibm.com執行以下命令:
# docker run -d \
  -e MYID=3 \
  -e SERVERS=9.111.255.10,9.111.254.41,9.111.255.50 \
  --name=zookeeper \
  --net=host \
  --restart=always \
  mesoscloud/zookeeper
# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
ac459eb2adaa        mesoscloud/zookeeper   "/usr/local/bin/dumb-"   2 seconds ago       Up 1 seconds                            zookeeper

Step 3 安裝Mesos叢集

因為Marathon是構建於Apache Mesos之上的一個框架,因此我們必須首先搭建Mesos叢集。執行以下命令,在以上三個機器上安裝Apache Mesos叢集:

登陸wangyongqiao1.eng.platformlab.ibm.com執行以下命令執行Mesos master:

# docker run -d \
   --name mesos-master \
   --net host mesosphere/mesos-master:0.28.1-2.0.20.ubuntu1404 \
   --quorum=1 \
   --work_dir=/var/log/mesos \
   --zk=zk:// wangyongqiao1.eng.platformlab.ibm.com:2181, wangyongqiao2.eng.platformlab.ibm.com:2181, wangyongqiao3.eng.platformlab.ibm.com:2181/mesos

分別登陸

wangyongqiao2.eng.platformlab.ibm.com 和wangyongqiao3.eng.platformlab.ibm.com 執行以下命令執行Mesos agent:

docker run -d \
   --privileged \
   -v /var/run/docker.sock:/var/run/docker.sock \
   --name mesos-agent \
   --net host gradywang/mesos-agent \
   --work_dir=/var/log/mesos \
   --containerizers=mesos,docker \
   --master= zk:// wangyongqiao1.eng.platformlab.ibm.com:2181, wangyongqiao2.eng.platformlab.ibm.com:2181, wangyongqiao3.eng.platformlab.ibm.com:2181/mesos

注意:Mesosphere官方所提供的Mesos Agent映象mesosphere/mesos-agent不支援Docker的容器化,所以作者在官方映象的基礎至上建立了一個新的映象gradywang/mesos-agent來同時支援Mesos和Docker的虛擬化技術。

gradywang/mesos-agent的Dockerfile如下:

#cat Dockerfile
FROM mesosphere/mesos:0.28.0-2.0.16.ubuntu1404
MAINTAINER Yongqiao Wang <[email protected].ibm.com>```

RUN apt-get update \
    && apt-get -y install curl```

#Install docker client.
RUN curl -o /usr/bin/docker https://get.docker.com/builds/Linux/x86_64/docker-1.10.2 \
    && chmod +x /usr/bin/docker 

ENTRYPOINT ["mesos-slave"]

這時後你可以通過 http://wangyongqiao1.eng.platformlab.ibm.com:5050 訪問Mesos的Portal。

Step 4 安裝Marathon

登陸wangyongqiao1.eng.platformlab.ibm.com執行以下命令執行Marathon:

# docker run -d \
    --privileged \
    --net=host mesosphere/marathon \
    --master zk:// wangyongqiao1.eng.platformlab.ibm.com:2181, wangyongqiao2.eng.platformlab.ibm.com:2181, wangyongqiao3.eng.platformlab.ibm.com:2181/mesos \
    --zk zk:// wangyongqiao1.eng.platformlab.ibm.com:2181, wangyongqiao2.eng.platformlab.ibm.com:2181, wangyongqiao3.eng.platformlab.ibm.com:2181/marathon

# curl -L http:// wangyongqiao1.eng.platformlab.ibm.com:8080/v2/info | python -m json.tool | jq '. | .version'
"1.1.1"

Marathon中重要的概念介紹

  • Application是Marathon中一個重要的核心概念,它代表了一個長服務。

  • Application definition表示一個長服務的定義,規定了一個Application啟動和執行時的所有行為。Marathon提供了兩種方式讓你來定義你的長服務,第一種通過Portal來定義,它方便終端使用者的理解和使用,另一種是通過JSON格式的檔案來定義,並通過RestAPI的方式來建立和管理這個Application,這種方式方便和第三方的系統進行整合,提供了再次的可程式設計介面。

  • Application instance表示一個Application的例項,也稱作Mesos的一個task。Marathon可以為一個Application建立和管理多個例項,並可以動態的增大和減小某個Application例項的個數,並且通過Marathon-lb實現服務發現和負載均衡。

  • Application Group:Marathon可以把多個Application組織成一棵樹的結構,Group稱為這個樹的樹枝,Application稱為這個樹的葉子。同一個Group中的Application可以被Marathon統一管理。

  • Deployments:對Application或者Group的definition的一次修改的提交稱為一次deployment。它包括建立,銷燬,擴容縮容Application或者Group等。多個deployments可以同時進行,但是對於一個應用的deployments必須是序列的,如果前一個deployment沒有結束就執行下一個deployment,那麼它將會被拒絕。

Marathon主要功能介紹

定義和部署常駐服務(long-running service)

Marathon用一個JSON文字來定義描述一個常駐服務,一個簡單的Application定義如下所示:

#  cat test1.json
{
  "id": "/test1",
  "cmd": "while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done",
  "cpus": 1,
  "mem": 128,
  "disk": 0,
  "instances": 1
}

id表示一個Application的唯一標識,我們上邊說過,Marathon以一個樹的形式組織Application,所以Application /test1標識根下的一個應用。

cmd表示應用執行的內容。凡是能用shell執行的任務,理論上都可以通過Marathon在Mesos上簡單的執行和管理。預設情況下將通過Mesos的Command executor來執行,它將被包裝為:/bin/sh –c ${cmd}
cpus,mem,disk表示執行這個應用需要耗費的資源,Mesos主要通過namespace的機制來控制和隔離資源。

instances 表示這個應用第一次啟動使建立的例項的數量。

當然你可以在Marathon的Portal利用圖形介面的方式上定義Application,或者在介面上開啟JSON Mode來直接編寫JSON文字來定義。目前Marathon的Portal沒有完全實現Marathon的所有的功能,一次在用圖形介面定義之後,如果你要為Application新增其他額外的功能,你可以開啟JSON Mode,在介面定義的基礎之上繼續新增Application的其他屬性,在儲存的時候,介面會幫助你檢查JSON的格式是否合法等。

在Marathon Poratl定義完應用之後,你可以直接提交建立這個應用。

如果用JSON檔案的方式,可以用如下的REST API來提交:

#curl -X POST http:// wangyongqiao1.eng.platformlab.ibm.com:8080/v2/apps -d @test1.json -H "Content-type: application/json"

在這個應用提交執行之後,Marathon會監控這個服務的健康狀況,如果由於某個原因,這個服務意外終止,Marathon會快速的重新啟動這個應用,由於應用是執行在輕量級的容器中的,因此它的恢復速度是非常快的,保證這個應用的長時間不間斷執行。但是要注意的一點是,Marathon不是把原來的服務在原來的機器上重啟,而是會用Mesos傳送過來的任意的Offer把這個服務啟動到叢集中的任意一個機器上,所以需要兩個問題需要解決:

1.如果這個服務是有狀態的,那麼它再次在另外的機器上啟動之後,怎麼恢復它的狀態?Marathon支援本地的持久化捲來解決這個問題,請見下文的分析。

2.如果這個服務之前作為其他服務的後端,或者有外部的客戶端和它進行通訊,那麼當他啟動到別的機器上之後,IP地址發生了變化,那麼其他服務和外部的客戶端改怎麼和新的服務進行通訊?Marathon支援Service Discovery的方式來解決這個問題,請見下文分析。

長駐服務提供生命週期的管理

在建立了應用例項之後,可以通過Marathon的Portal或者Rest API來管理應用例項的生命週期:

  • Suspend: 把這個應用的所有正在執行的例項殺掉,並把這個應用定義的例項的數量減為0,這時這個應用只保留了定義,並沒有正在執行的例項。

  • Destroy:把這個應用的例項和定義全部刪除,它不可恢復。

  • Kill:選擇某個應用的某幾個例項殺掉,但是Marathon立即會重新建立等同數量的例項。

  • Kill&Scale:選擇某個應用的某幾個例項殺掉,並從這個應用定義的例項的數量中減去等同的數量,這時Marathon不會再建立這幾個例項。

  • Scale Up/Down:為某個應用增加或者減少指定數量的例項。

  • Restart:這可以稱為Rolling upgrade,它某人先建立一個新的例項,然後把老的例項殺掉。再後邊的章節單獨詳細講解。

提供了沙箱機制來管理每個應用的例項

Mesos在執行任務時,會在對應的Agent節點上為每一個任務建立一個沙箱目錄,用來表示這個任務的執行環境和存放相關的日誌檔案。Marathon作為Mesos的framework,對於它提交執行的任務也不例外。使用者可以在Marathon的Portal或者Mesos的Portal上從那個沙箱中下載到對應任務的stderr和stdout的日誌。這個沙箱目錄存在於每個Mesos Agent執行時所設定的work_dir中。

當然了,對於一個複雜的應用程式,不可能用幾行簡單的shell命令來描述並執行它,它一般會依賴於很多的資原始檔(例如多個shell指令碼,圖片等),針對這種情況,Marathon提供了URLs的概念來管理這些資原始檔的位置。Mesos的Fetcher將會通過這些URLs在這個應用執行之前把這些資原始檔下載到這個任務的沙箱之中,例如下列應用的定義:

{
    "id": "basic-1", 
    "cmd": "`chmod u+x cool-script.sh && ./cool-script.sh`",
    "cpus": 0.1,
    "mem": 10.0,
    "instances": 1,
    "uris": [
        "https://example.com/app/cool-script.sh"
    ]
}

在執行cmd之前,Mesos的fetcher會首先把cool-script.sh指令碼下載到任務的沙箱之中,cmd中shell指令碼的位置是以每個任務的沙箱目錄為根目錄的。當有多個資原始檔時,urls是個陣列型別,可以寫多個URL,之間以逗號分割。在Mesos 0.22之後,Mesos的fetcher會自動把下載的檔案設定為可執行。Mesos Fetcher現在支援的URL schemes 有file/http/https/ftp/ftps/hdfs/s3/s3a/s3n等。

當然了,為了提高fetcher的下載效率,這些資原始檔可以事先被壓縮為tgz/tar.gz/tbz2/tar.bz2/txz/tar.xz/zip等格式,fetcher會在下載之後將這些壓縮包自動解壓縮。

支援應用部署時之間的依賴

Marathon提供了應用組的概念,使Marathon可以一次性對一組應用進行批量deployment。並且在對應用組進行deployment時支援這些應用之間的依賴關係。

例如,一個Web應用分為前端應用和後端資料庫,我們可以用一個應用組來管理這個Web應用,並且設定依賴關係,定義如下所示:

#  cat webapp.json
{
    "id": "webapp",
    "apps": [
        {
            "id": "db",
            "cmd": "while [ true ] ; do echo `date +%s` ; sleep 5 ; done",
            "cpus": 0.1,
            "mem": 10,
            "disk": 0,
            "instances": 1
        },
        {
            "id": "web",
            "cmd": "while [ true ] ; do echo `date +%s` ; sleep 5 ; done",
            "cpus": 0.1,
            "mem": 10,
            "disk": 0,
            "instances": 1,
            "dependencies": [
                "/wepapp/db"
            ]
        }
    ]
}

如果設定了依賴關係,則在建立這個應用組的時候,Marathon會保證這個應用組中的應用按照依賴順序進行建立。比如上例中會先建立/webapp/db應用,然後再建立/webapp/web應用。

同時Dependencies也可以設定在Group的級別上,如果一個應用依賴於一個應用組,那麼這個應用組中的應用得全部建立之後,這個應用才可以被建立。

另外Marathon還可以對應用組做如下的deployments:

  • Scale:對Group進行擴容或者縮容,如果組中的應用有依賴關係,那麼先擴容被依賴的應用,再擴容依賴的應用,如果是縮容的化則相反。

  • Destroy:刪除這個應用組,如果組中的應用有依賴關係,先刪除被依賴應用的例項,然後刪除依賴應用的例項。

  • Suspend:把應用組中的所有應用例項刪除,如果組中的應用有依賴關係,先刪除被依賴應用的例項,然後刪除依賴應用的例項。

注意:Marathon對應用所定義的依賴關係,只有在對一個應用組的一次deployment時才有效。意思是,比如你對某個應用做deployment時,如果它依賴其他的應用,並且依賴的應用沒有被提前建立,那麼它仍然可以建立成功,它所定義的dependencies將會被忽略。

Rolling Upgrade的支援

開發者和Marathon的終端使用者面臨的最常見的問題之一是如何推出新版本的應用程式。當應用通過Marathon建立之後,使用者可能會要求不要中斷服務而將應用升級到最新的版本。一般的做法是,先建立一組新版本的應用例項,然後停止老版本的應用例項。這可以通過幾種方式來實現,Marathon在應用配置的層面上提供了minimumHealthCapacity引數來定義rolling upgrade的策略,它表示應用例項數量的百分比:

  • 預設情況下minimumHealthCapacity的值為1,它表示先建立等同數量的新版本的應用的數量,在建立成功之後,再把所有老版本的應用例項刪除掉。在原來老版本的應用例項比較多的情況下,這種策略要求叢集中要有足夠多的資源先來建立新版本的例項。

  • 當minimumHealthCapacity的值為0的時候,它表示先把這個應用程式下的所有例項刪除掉,然後在建立等同數量的新版本的應用例項。這種策略一般在生產環境是不推薦的,應為它會導致服務的短時間中斷。

  • 當minimumHealthCapacity的值大於0小於1的時候,它表示先把部分的老版本的例項刪除掉,然後再建立等同數量的新版本的例項,當所有新版本的應用例項啟動成功之後,再把剩餘的所有老版本的例項刪除掉,再啟動其餘的新版的例項。例如,原來應用有7個例項,應用的minimumHealthCapacity引數的值為0.4,則在這個應用upgrade的時候,Marathon會先刪除3個(0.4*7=2.8四捨五入)老版本的例項,然後啟動3個新版的例項,當這3個新版本的例項啟動成功之後,然後把剩餘四個老版本的例項刪除,再建立四個新版本的例項。

注意:當你為某個應用設定的minimumHealthCapacity大於0.5的時候,在對這個應用做upgrade的時候你必須保證你的的叢集中有足夠的資源,否則新版本的例項將無法建立。

Marathon做upgrade的操作步驟如下:

  • 首先得先修改要升級的應用的definition來發布這個應用的新版本並儲存,或者把這個應用需要的resource替換(比如升級你的軟體包的版本)。如果你修改了definition,Marathon會自動為你儲存歷史版本。

  • 將這個應用restart,在restart的時候,Marathon會根據你為這個應用設定的策略minimumHealthCapacity來升級你的應用。

支援不同的應用部署策略

Marathon通過為應用設定約束來決定應用例項的部署策略,比如把某個應用的例項分散建立到不同的機器或者機架上來提供高容錯性,或者把應用的所有例項集中部署到同一型別的機器上。

Marathon的約束的定義分為三個部分:約束名,操作符和一個可選的約束的值:

約束名可以是hostname(表示Mesos Agent的機器名)或者Mesos Agent的一個屬性(Mesos Agent的屬性通過–attributes在啟動Mesos Agent的時候指定)的名稱。

o hostname約束將匹配每一個offer所對應的的Mesos Agent的機器名。

o hostname的約束名支援下面的所有操作符。

o 如果這個約束名不是hostname,它將匹配Mesos Agent的屬性。

o 如果指定的約束名既不是hostname,也匹配不到任何的屬性,除了UNLIKE操作符,下面所有的操作符將會匹配不到任何的offer。

o Mesos Agent屬性的約束支援所有下列的操作符。

o 注意:目前Marathon僅僅支援約束的字串值,不支援數字。

操作符:

oUNIQUE:告訴Marathon把這個應用的每一個例項部署到屬性值不同的機器上,也就是說屬性的值相同的機器上只能執行一個這個應用的例項。比如為某個應用定義如下約束的時候,表示每一個機器上只能執行一個這個應用的例項。”constraints”: [[“hostname”, “UNIQUE”]]

oCLUSTER 告訴Marathon把這個應用的所有例項部署到一組具有相同屬性的機器上。比如某個應用的例項只能跑到某些硬體平臺上或者把這些應用例項部署到同一個機架或者地域。比如把某個應用的所有例項部署到rack-1上:

"constraints": [["rack_id", "CLUSTER", "rack-1"]]

再比如把某個應用的例項部署到機器名為wangyongqiao.abc.com的機器上:

"constraints": [["hostname", "CLUSTER", "wangyongqiao.abc.com"]]

oGROUP_BY:告訴Marathon把某個應用的例項均勻的建立到屬性值不同的機器上。比如為了應用的高可用,你可以通過這個操作符把應用的例項均勻的分散部署到不同的機架或者資料中心。比如把應用的例項均勻分散部署到不同的機架上:

"constraints": [["rack_id", "GROUP_BY"]]

如果你想把你的應用均勻的分散的部署到至少三個機架上,可以把約束定義為:

"constraints": [["rack_id", "GROUP_BY",“3”]]

注:由於Marathon不能在某一個時刻獲取到叢集所有的資源,因此對於應用例項的在叢集的均勻建立還有很多的爭論,具體可以參見https://github.com/mesosphere/marathon/issues/3220 Issue。後續Marathon可能會對這個約束有所改進。

oLIKE:接收一個正則表示式,告訴Marathon,這個應用的例項只能建立在匹配這個正則表示式的機器上。比如這個應用例項只能建立在機架rack-1和rack-2上:

"constraints": [["rack_id", "LIKE", "rack-[1-2]"]]

oUNLIKE:這個操作符和LIKE正好是相反的。

支援高可用

Marathon預設支援高可用的模式,在高可用的模式下,如果某一個Marathon服務中斷,依然可以繼續保持正在執行的常駐服務不間斷執行。

Marathon的高可用模式部署非常簡單,只需要啟動多個Marathon的服務並且指定一個相同的Zookeeper路徑,Zookeeper會提供多個Marathon服務之間的Leader選舉。例如基於上文的安裝步驟,可以登陸wangyongqiao2.eng.platformlab.ibm.com和wangyongqiao2.eng.platformlab.ibm.com執行以下命令啟動第二個和第三個Marathon服務:

docker run -d \
    --privileged \
    --net=host mesosphere/marathon \
    --master zk://gradyhost1.eng.platformlab.ibm.com:2181,gradyhost2.eng.platformlab.ibm.com:2181,gradyhost3.eng.platformlab.ibm.com:2181/mesos \
    --zk zk://gradyhost1.eng.platformlab.ibm.com:2181,gradyhost2.eng.platformlab.ibm.com:2181,gradyhost3.eng.platformlab.ibm.com:2181/marathon

和Mesos的Web Portal不同的是,Marathon在高可用模式下,所有Marathon例項所提供的Web Portal都可以工作,它們不會像Mesos一樣,如果你登陸的不是Leader節點,會跳轉到當前的Leader節點。也就是說使用者仍然可以在Marathon的非Leader節點的Portal上做操作。Rest API也支援相同的行為。

使用者身份認證和許可權控制的支援

單獨的Marathon目前不支援使用者認證和許可權控制,但是在Mesosphere釋出的開源DC/OS中,這個功能已經被支援。

支援執行Docker容器

通過Marathon的Portal和Rest API,使用者可以把它們自己的應用的例項很容易的執行到Docker容器中。

例如我們通過Marathon在Docker中執行一個Web server:

 # cat docker-web-server.json
{
  "id": "/docker-web-app",
  "cmd": "python3 -m http.server 8080",
  "cpus": 1,
  "mem": 128,
  "disk": 0,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "volumes": [],
    "docker": {
      "image": "python:3",
      "network": "BRIDGE",
      "portMappings": [
        {
          "containerPort": 8080,
          "hostPort": 0,
          "protocol": "tcp",
          "name": "webserverport"
        }
      ],
      "privileged": false,
      "parameters": [],
      "forcePullImage": false
    }
  }
}

# curl -X POST http://wangyongqiao1.eng.platformlab.ibm.com:8080/v2/apps -d @docker-web-server.json -H "Content-type: application/json"

在這個例項成功之後,你可以查詢這個應用的例項,通過Marathon分配的隨機埠來訪問這個WEB服務。

Marathon在執行Docker容器的時候,僅僅支援Docker的HOST和BRIDGE的網路模式。它們最大的區別是,如果容器中執行的應用程式需要消費埠資源,在Host模式下, Marathon不支援使用者為這個應用程式自定義使用的埠,它會從Mesos傳送的Offer的埠資源中為應用程式動態的選擇使用的埠。在BRIDGE模式下,Marathon不但支援動態的埠對映,還支援靜態的埠對映。如果是動態的埠分配,在應用的例項建立成功之後,使用者可以通過Marathon的Portal或者Rest API獲取到分配的這些埠,來訪問容器中執行的服務。

注:由於Marathon對埠資源的管理比較複雜,將在下文中單獨剖析。

在Marathon中執行Docker 容器,在環境部署的時候需要注意一下幾點:

  • 必須在所有的Mesos Agent事先安裝Docker(>1.0.0);

  • 啟動每一個Mesos Agent服務的時候要指定Docker的容器化方式:–containerizers=mesos,docker;

  • 應為建立Docker container之前需要先pull Docker image,因此需要把Mesos Agent的–executor_registration_timeout引數改大一點,防止應用例項啟動超時報錯。這個時間預設是1分鐘;

  • 同理,也需要把Marathon的–task_launch_timeout引數改大一點。

同時Marathon支援使用一個私有的需要認證的Docker映象倉庫。在Docker 1.6之前,為了從一個私有的需要認證的映象倉庫拉去映象,Marathon需要在定義應用時通過urls指定.dockercfg檔案的位置,在應用的例項建立的時候,這個檔案會被fetch到它的沙箱中,並且沙箱的目錄$MESOS_SANDBOX會設定成執行任務的 HOME目錄,然後Docker在PULL的時候就可以使用這個配置檔案。在Docker 1.6之後,需要把docker.tar.gz檔案通過urls指定到應用的定義檔案中,這個檔案包含如下內容:

$ tar -tvf ~/docker.tar.gz
 drwx------ root/root         0 2015-07-28 02:54 .docker/
 -rw------- root/root       114 2015-07-28 01:31 .docker/config.json

本文到此結束,下篇文章中我們將繼續分析Marathon的服務發現,負載均衡,監控機制等功能。

作者簡介:王勇橋,80後的IT工程師,供職於IBM多年,主要從事雲端計算領域相關的工作,Mesos和Swarm社群的貢獻者。平時喜歡在業餘時間研究DevOps相關的應用, 對容器化技術,自動化部署,持續整合,資源排程有較深的研究。

相關推薦

Marathon主要功能介紹

【摘要】Marathon是一個成熟的,輕量級的,擴充套件性很強的Apache Mesos的容器編排框架,它主要用來排程和執行常駐服務(long-running service),提供了友好的介面和Rest API來建立和管理應用。Mesosphere在最近剛剛釋

FreeSWITCH第三方庫音頻的簡單介紹

優勢 帶寬 blog 網絡 ndt 目標 領域 合成 通道 FreeSWITCH使用了大量的第三方庫,本文檔主要介紹音頻相關庫的信息: 視頻相關庫的信息介紹參考:http://www.cnblogs.com/yoyotl/p/5488890.html 其他相關庫的信

23種設計模式介紹---- 創建型模式

接口 ret static 深復制 return 對象 相互 object c png 由於設計模式篇幅比較大,如果在一篇文章講完所有的設計模式的話不利於閱讀。於是我把它分為三篇文章 23種設計模式介紹(一)---- 創建型模式 23種設計模式介紹(二)---- 結構型模

android application類簡單介紹

cati theme text color raw sdn water bsp public 每次應用程序執行時。應用程序的application類保持實例化的狀態。通過擴展applicaiton類,能夠完畢下面3項工作: 1.對android執行時廣播的應用程序

Spring Data 介紹

tin 可能 動態 javac 行高 spec 增加 核心概念 一個 簡介   Spring Data是什麽       Spring Data是一個用於簡化數據庫訪問,並支持雲服務的開源框架。其主要目標是使得對數據的訪問變得方便快捷 Spring Data JPA能幹什麽

Nginx之基本介紹

動靜分離 quit 共享內存 oct bytes err 配置文件 默認頁 日誌格式 這是一篇介紹Nginx基本信息和配置文件詳情的文章,適合入門者,如果你想深入了解Nginx請繞道 什麽是Nginx?   Nginx是輕量級,高性能,跨平臺的web服務器 Nginx的特點

機器學習之numpy庫中常用的函數介紹

做的 string idt 維度 數據 round float 數值 array 1. mat() mat()與array的區別: mat是矩陣,數據必須是2維的,是array的子集,包含array的所有特性,所做的運算都是針對矩陣來進行的。 array是數組,數據可以是多

javascript中的DOM介紹

item 檢測 turn 及其 篩選 層次 proto nbsp log 一、基礎知識點 1、DOM是文檔對象模型,是針對HTML和XML文檔的一個API(應用程序接口) 2、DOM描繪了一個層次化的節點數,允許開發人員進行添加,移除個修改等操作 3、IE瀏覽器中所有的DO

WebSocket 介紹

ive w3c 使用 src 風格 減少 在線遊戲 知識 正在 WebSocket 發起單個請求,服務端不需要等待客服端,客戶端在任何時候也能發消息到服務端,減少了輪詢時候的延遲.經歷一次連接後,服務器能給客戶端發多次。下圖是輪詢與WebSocket的區別。 基於ht

硬件系列之超聲波模塊介紹

返回 精度 就是 包括 發送 平時 自動 距離 c-s HC-SR04模塊可提供2cm-40cm的非接觸式距離感測功能,測距精度可達3mm: 模塊包括超聲波發生器,接收器與控制器,檢測角度30度。 控制方式: 采用IO口TRIG觸發測距,給最少10us的高電平信號 模塊自動

Quartz學習——Quartz大致介紹

方法 clust mark 開始 包含 text fill map 只有一個 1. 介紹Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,是完全由java開發的一個開源的任務日程管理系統,“任務進度管理器”就是一個在預先確定(被

PyQt介紹

mil 用戶界面 XML 描述 wid cor 客戶端和服務器 core模塊 桌面 PyQt5模塊PyQt5的類分為幾個模塊,包括: QtCore QtCore模塊包含核心非GUI功能。此模塊用於處理時間,文件和目錄,各種數據類型,流,URL,MIME類型,線程

Spring Data Redis整體介紹

目前 擴展 刪除 依據 實例化 -m doc 不同的 SDR 為什麽使用Spring Data Redis 首先Spring Data Redis 是Spring 框架提供的用於操作Redis的客戶端。 Spring框架是一個全棧Java程序框架,通過DI、AOP和便攜的服

[數據分析工具] Pandas 功能介紹

技術 describe 索引 sum cat std 簡單 方法 nbsp 條件過濾 我們需要看第一季度的數據是怎樣的,就需要使用條件過濾 體感的舒適適濕度是40-70,我們試著過濾出體感舒適濕度的數據 最後整合上面兩種條件,在一季度體感濕度比較舒適的數據

Fork-Join分治編程介紹

會有 post 就會 override 大於 uri nco xtend fork 一、Fork-Join 框架介紹 1. 什麽是 Fork-Join 分治編程框架 ??Fork/Join框架是Java7提供了的一個用於並行執行任務的框架,是一個把大任務分割成若幹個小任務,

ABP總體介紹 - 入門介紹

通知 模式 5.0 control 技術 BE lock erp 支持 ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。 ASP.NET Boilerplate是一個用最佳實踐和流行技術開發現代WEB應用程序的新起點,它

scim 跨域身份管理介紹

light 場景 特定 for ear iii 全部 AS ID SCIM 全稱 System for Cross-domain Identity Management,主要用於多租戶的雲應用身份管理。 概覽 SCIM 2.0建立在一個對象模型上,所有SCIM對象都繼承Re

splunk工具介紹

大數據splunk最近測試產品需要與splunk對接,順便就安裝了splunk的環境,並使用了一下。splunk是一款可以收集,索引和利用任何數據的“大數據平臺”。如今互聯網的普及,數據是一個大爆發的時代,對於應用程序和系統來講會產生各種各樣的數據,其中很重要的一類數據就是“LOG”。一個商店的售賣情況會產生

MongoDB復制集成員及架構介紹

bit not -o 服務 復制 誤操作 存儲 帶來 影響 MongoDB復制集介紹 MongoDB支持在多個機器中通過異步復制達到提供了冗余,增加了數據的可用性。MongoDB有兩種類型的復制,第一種是同於MySQL的主從復制模式(MongoDB已不再推薦此方案);第二

Spring Boot介紹

work 度量 3.2 https 級別 boot star 自動 tom 一、介紹   Spring Boot可以輕松創建獨立的、基於產品級別Spring的應用程序,您可以“直接運行”。   Spring Boot是由Pivotal團隊提供的全新框架,為我們以最少的麻煩開