在Docker中運行你的Mesos集群

jopen 9年前發布 | 13K 次閱讀 Docker

本文介紹了在Docker中運行Apache Mesos,Mesos官方網站提供了安裝包來直接運行它,但文中嘗試使用Docker來運行Mesos,Mesosphere也提供了相應的鏡像。在Docker中運行Mesos也有它的好處,讀者可以嘗試下。

很多人都已經開始在Apache Mesos中運行容器化的應用,我們也是這樣。盡管我們嘗試在容器中運行應用,但我們還是通過傳統的安裝包來在自己的主機上安裝Mesos。盡管這是最簡單和直接的方式來安裝Mesos,大部分也都這樣做。但不知道你是否想過,在容器中安裝和運行Mesos?

在容器中安裝Mesos可以幫助我們解決一個非常實際的問題,我們可以在任意版本的主機系統上運行Mesos和它的框架,包括各種測試版本。因為基于容器,問題就轉化為只需要在主機上運行不同的Docker鏡像。

Mesos、 Marathon和Zookeeper的Docker鏡像

目前在Docker Hub上有幾個不同的Apache Mesos Docker鏡像,(注意Mesos master 和 slave是兩個鏡像)。我們選擇Mesosphere的鏡像。Redjack的倉庫同樣提供高質量、文檔豐富的Mesos鏡像。使用哪個取決于你,哪個都可以正常運行,不過需要注意配置可能有些不同。注意這篇文章中使用的是Mesosphere提供的鏡像。

上周Thijs Schnitger 創建了一個ZooKeeper 3.5的鏡像。Apache ZooKeeper在這個版本引入了動態主機重配置,一個非常酷的特性,特別是在一個經常變化的環境中特別有用,集群也是。所以我們也使用ZooKeeper容器化的解決方案。

我們還會用到Mesosphere的Marathon Docker 鏡像

容器化集群配置

我們使用Terraform啟動集群。參考terraform-mesos的GitHub倉庫并下載它的容器分支,你會找到解決方案(至少在寫這篇文章時)。不久,它會被合并到master分支。

讓我們來看一下配置過程的有趣部分,通過Docker來運行Mesos、Marathon和Zookeeper。

Mesos 主節點

QUORUM=2 # number of masters divided by 2 plus 1
CLUSTERNAME="cluster7"
ZK="zk://<quorum_string>/mesos"
MESOS_VERSION="0.22.1-1.0.ubuntu1404"

docker run -d \ -e MESOS_QUORUM=${QUORUM} \ -e MESOS_WORK_DIR=/var/lib/mesos \ -e MESOS_LOG_DIR=/var/log \ -e MESOS_CLUSTER=${CLUSTERNAME} \ -e MESOS_ZK=${ZK}/mesos \ --net="host" \ redjack/mesos-master:${MESOSVERSION} --mesosphere/mesos-master:${MESOSVERSION} </pre>
如你所見,我們僅僅傳遞給鏡像幾個相關的版本tag就能運行指定版本的Mesos。除此之外,為了Mesos正常工作還需要傳遞幾個環境變量給容器并啟用host networking

簡而言之,帶MESOS_前綴的變量保存配置的值,我們一般會寫到主機/etc/mesos*目錄下的配置文件。

在集群中的每臺主機上運行主節點容器。

Mesos從節點

ZK="zk://<quorum_string>/mesos"
HOSTNAME="host1" # use a hostname of the host
IP="10.20.30.2" # use an IP address of the host
MESOSVERSION="0.22.1-1.0.ubuntu1404"

docker run -d \ -e MESOS_LOG_DIR=/var/log/mesos \ -e MESOS_MASTER=${ZK} \ -e MESOS_EXECUTOR_REGISTRATION_TIMEOUT=5mins \ -e MESOS_HOSTNAME=${HOSTNAME} \ -e MESOS_ISOLATOR=cgroups/cpu,cgroups/mem \ -e MESOS_CONTAINERIZERS=docker,mesos \ -e MESOS_PORT=5051 \ -e MESOS_IP=${IP} \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker \ -v /sys:/sys:ro \ --net="host" \ redjack/mesos-slave --mesosphere/mesos-slave:${MESOSVERSION} </pre>
對于Mesos從節點,配置有點復雜,主要是需要確保從節點可以訪問主機上的Docker后臺進程(同一個后臺進程用來運行這個Mesos從節點實例)。通過掛載/var/run/docker.sock文件,/usr/bin/docker執行文件和/sys目錄(只讀)到Mesos從節點容器實現。請注意,這還不是一個完美的解決方案,例如當從Marathon運行另一個Mesos框架,需要再進行細微調整。

Zookeeper

# 第一個節點
docker run -d -p 2181:2181 containersol/zookeeper 1

 其它節點

MYID="2" # 3,4,5,... FIRST_NODE="cluster7-mesos-master-0" # hostname of the first node

docker run -d -p 2181:2181 containersol/zookeeper ${MYID} ${FIRST_NODE} --需要更改端口2888:2888,3888:3888</pre>
在這個配置中,運行容器化的ZooKeeper需要一點小技巧。在第一個節點以“standalone” 模式運行,等其它所有節點ZooKeeper實例能連接到它并運行正常,ZooKeeper接著會自動重新配置它自己向所有節點同步。

Marathon

因為我們想運行應用容器和其它框架,我們在Mesos之上安裝“datacenter init system” Marathon框架。

MARATHONVERSION="v0.8.2"
ZK="zk://<quorum>" # zookeeper quorum string

docker run -d \ -p 8080:8080 \ -p 5051:5051 \ mesosphere/marathon:${MARATHONVERSION} \ --master ${ZK}/mesos \ --zk ${ZK}/marathon</pre>
注意,我們指定Marathon UI 運行在8080端口,監聽5051端口。我們運行任意版本鏡像并傳遞兩個強制參數:

master– quorum hostname/ip and Mesos registration path
zk– quorum hostname/ip and Marathon registration path

這樣就可以在Docker容器中運行Mesos集群的關鍵組件了。除了運行不同版本的組件,這個我們最大的動機,這種方式自然而然的帶來在集群管理層次容器化的所有好處:快速部署,維護簡單和設備可移植性。

在這一過程,我們還需要解決haproxy-marathon bridge和Mesos DNS配置的問題。

如果你有任何問題或者要進行評論,請直接在文章下面留言或者在 GitHub上創建issues

原文鏈接:Containerized Mesos Cluster (翻譯:朱高校)

來自:http://dockone.io/article/642

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!