容器化Mesos集群
Apache Mesos系統是一套資源管理調度集群系統,可以用來管理容器化的應用。 Container Solutions團隊的Frank Scholten把他們通過容器化部署Mesos集群,如何解決運行多版本Mesos的問題進行了總結。讓我們一起來看一下吧。
我們經常為我們的客戶和自己用Apache Mesos 集群運行容器化的應用。雖然我們已經在容器中運行應用,我們還是從標準的Debian packages安裝Mesos相關的依賴和框架。雖說這是很多Mesos用戶的做法,而且是安裝Mesos最直接和保險的方式,我們想可以略微調整一下Mesos的安裝方式并嘗試在容器中運行。
除了有很大的樂趣和教育意義外,這種方式會幫助我們解決一個非常實際的問題。現在可以運行任意版本的Mesos和它的框架,包括發布的候選版本,因為在我們的設置下,這個問題變成只要運行不同版本的Docker鏡像就可以了。
當我們開發Mesos框架時,能使用不同版本的Mesos(和其它工具)是非常重要的。除此之外,這給我們更多時間進行安全問題修復,有時甚至趕在它們發布之際。
Mesos、 Marathon 和 Zookeeper Docker 鏡像
目前在Docker Hub上有幾個不同的Apache Mesos Docker鏡像可用 (注意Mesos master 和 slave是兩個鏡像)。我們選擇Mesosphere的鏡像,一個卓越的容器生態系統貢獻者(也是我們的朋友)。Redjack的倉庫同樣提供高質量、文檔豐富的Mesos鏡像。使用哪個取決于你,哪個用起來都很正常,不過需要注意配置可能有些不同,因為這篇文章是為Mesosphere鏡像而寫。上周Thijs Schnitger 創建了一個Zookeeper3.5的鏡像。Apache Zookeeper在這個版本引入了動態主機重配置,一個非常酷的特性,特別是在一個經常變化的環境中特別有用,集群也是。所以我們也使用Zookeeper容器化的解決方案。
我們還會用到Mesosphere的Marathon Docker 鏡像。
容器化集群配置
我們使用Terraform啟動集群。參考terraform-mesos的GitHub repository并下載它的容器分支,你會找到解決方案(至少在寫這篇文章時)。不久,它會被合并到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 stringdocker 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