提起Docker容器化 不得不提服務編排,衆所周知目前Docker經常使用的服務編排模式有三種, Mesos DockerSwarm Kubernetes,下面將詳細介紹這三種服務編排模式的架構和環境搭建。git
下圖是在Mesos官網上對mesos架構的介紹github
即便不看下面的英文描述,從這張圖上咱們也看看出Mesos的總體架構,主體爲主從結構master/slave或者master/agent模式,對master節點來講爲了不單點,引入了多個master,多個master向Zookeeper註冊本身,用zk實現選舉。master節點運行一些任務調度器(scheduler),agent節點運行任務執行器(executor),一個agent節點能夠運行多個執行器,有執行器來執行具體任務(task)。web
任務調度以下圖:docker
從圖中能夠看出,這個調度分爲四個過程:apache
1.Mesos Agent將本身所在機器(物理機,虛擬機,容器)的資源信息(可用的處理器,內存,磁盤等資源)上報給Mesos Master的資源分配組件(Allocation Module)。vim
2.master節點向framework發送資源邀約(resource offer),通知framework在agent上可用的資源信息。設計模式
3.框架調度程序(FW Scheduler)把須要在agent上運行的兩個任務的信息發給master。bash
4.master將任務發送給agent,agent將須要的資源分配給執行器(Executor),執行器一次啓動兩個任務(task)。架構
當agent節點任務運行結束或者資源空閒時將循環此流程。app
下面的圖將Mesos和Linux操做系統作了對比,很好說明了Mesos設計模式和Mesos和Framework 及Task之間的關係。
Mesos相對於Linux,BSD系統的內核,Framework至關於Linux的系統服務或者外殼,兩者都是在此之上運行具體的任務。不一樣之處在於Mesos調度的是多臺機器。
以最簡單的多結點服務爲例,我有一個基於SpringBoot的已經打好Docker鏡像的web服務,目前的需求是咱們須要把這個服務部署在三個節點防止單點故障,而且之後隨着環境的變化(用戶訪問量的增長/減小,容災災備等)咱們還要對這個服務隨時進行擴縮容。針對當前的需求分析後設計以下基於Apache Mesos的部署架構圖。
簡單介紹一下,再生產中咱們的Mesos Framework選用Marathon,Marathon是一箇中間層的生產級容器編排平臺,能夠運行在數據中心操做系統(DC / OS)和Apache Mesos上。具體資料能夠從官方Github地址獲取:http://mesosphere.github.io/marathon。使用Marathon lb實現自動負載均衡。
首先有三臺機器分別爲 server01 server02 server03,將server01做爲Mesos master節點,server02 和 server03 做爲slave節點,因爲我的測試機器有限因此Zookeeper和Marathon Marathon lb 都部署在server01上,生產環境強烈建議部署獨立的Zookeeper集羣,Marathon也脫離Mesos獨立部署。
Mesos安裝方式有好幾種,源碼編譯安裝,二進制包安裝,使用Docker鏡像來運行Mesos。
前兩種安裝方式介紹在Mesos官網Getting Started 就能夠找到,http://mesos.apache.org/getting-started,參考文檔很容易就能夠裝好,咱們介紹第三張基於Docker的安裝方式,減小對容器環境的依賴,也方便管理。
若是不瞭解MesosDocker鏡像的話,咱們能夠先去看看DockerHub上有沒有已經作好的鏡像,https://hub.docker.com,搜索mesos,能夠看到已經有mesosphere爲咱們打好的鏡像,mesosphere爲dockerHub貢獻的不少很是實用的鏡像。
找到須要的鏡像
點擊去看看它的一些描述信息,ReadMe and Dockerfiles: https://github.com/mesosphere/docker-containers/tree/master/mesos
據此咱們大體知道如何來運行master個slave的鏡像,能夠選擇一個鏡像版本,我就選擇1.6.2了。
接下來開始安裝,登陸到master機器(server01),執行 docker version 確認docker安裝信息。
關於安裝並啓動Zookeeper,參考我這篇文章,zookeeper 安裝
新建一個放置啓動腳本的路徑,建立啓動腳本。
mkdir -p /data/mesos cd /data/mesos vim mesos-master.sh
對以前提供的啓動命令進行調整,修改zk地址,指定net模式,修改掛載日誌和臨時文件路徑,指定鏡像版本,關閉host查詢,指定hostname,具體以下(IP爲虛擬):
#!/bin/bash docker run -d --net=host \ --hostname=36.107.107.175 \ -e MESOS_PORT=5050 \ -e MESOS_ZK=zk://127.0.0.1:2181/mesos \ -e MESOS_QUORUM=1 \ -e MESOS_REGISTRY=in_memory \ -e MESOS_LOG_DIR=/var/log/mesos \ -e MESOS_WORK_DIR=/var/tmp/mesos \ -v "/data/mesos/log/mesos:/var/log/mesos" \ -v "/data/mesos/tmp/mesos:/var/tmp/mesos" \ mesosphere/mesos-master:1.6.2 --no-hostname_lookup --hostname=mesos.mrpei.cn
確認已啓動Zookeeper後,執行以下腳本便可啓動Mesos master
sh mesos-master.sh
查看容器信息
docker ps
若是啓動失敗,能夠執行
docker logs [container id]
查看日誌,定位問題。
相似的 在slave機器上也執行以上操做,下面給出slave的啓動腳本:
#!/bin/bash docker run -d --net=host --privileged \ --hostname=36.107.107.180 \ -e MESOS_PORT=5051 \ -e MESOS_MASTER=zk://36.107.107.175:2181/mesos \ -e MESOS_SWITCH_USER=0 \ -e MESOS_CONTAINERIZERS=docker,mesos \ -e MESOS_LOG_DIR=/var/log/mesos \ -e MESOS_WORK_DIR=/var/tmp/mesos \ -v "$(pwd)/log/mesos:/var/log/mesos" \ -v "$(pwd)/tmp/mesos:/var/tmp/mesos" \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /sys:/sys \ -v /usr/bin/docker:/usr/local/bin/docker \ mesosphere/mesos-slave:1.6.2 --no-systemd_enable_support
都啓動之後能夠訪問master的5050端口,能夠看到Mesos的基本信息面板。
agent信息
有了上面的經驗,咱們對這兩個組件也採用運行docker容器的方式來啓動。DockerHub查看Marathon 和 Marathon lb的鏡像。其實mesosphere已經爲咱們準備好了,咱們去看看這兩個鏡像的描述信息。
對於Marathon能夠看到以下信息:
咱們能夠根據提供的信息編寫一個啓動腳本:
#!/bin/bash docker run -d --net=host \ mesosphere/marathon:v1.5.15 \ --master zk://36.107.107.175:2181/mesos \ --zk zk://36.107.107.175:2181/marathon
啓動Marathon:
sh marathon.sh
Marathon lb鏡像信息以下:
編寫啓動腳本以下:
#!/bin/bash docker run -d -p 8090:9090 \ -e PORTS=8090 mesosphere/marathon-lb:v1.13.0 sse --group external --marathon http://36.107.107.175:8080
啓動Marathon lb:
sh marathon-lb.sh
查看鏡像啓動狀況:
訪問8090查看Marathon UI
Marathon UI裏 點擊create application 填寫id 須要的資源 和 鏡像地址,端口映射信息,因爲以前我已經把鏡像打好推到了dockerHub,因此直接填寫鏡像pull的地址便可。點擊create便可。
關於鏡像倉庫:標準企業生產環境是有本身的私有鏡像倉庫的,用的比較多的是 Vmware 開源的 Harbor,我以前在一臺機器上起着Harbor來着,因爲機器資源有限,而且三臺機器並非一家雲服務供應商,1M帶寬下 鏡像 push pull 都很慢,因此在這裏就沒有引入Docker 私有倉庫的問題。若是要使用私有倉庫,能夠直接在三臺機器上分別執行 docker login 登陸到私服就能夠了。