題圖:By JJ Ying From Unsplash
Mesos簡介
Apache Mesos是一個分布式系統的管理軟體,對集群的資源進行分配和管理。具體的介紹可參考 「Apache Mesos入門」一文,這裡就不再重複介紹了。
項目地址:https://github.com/mesosphere
Marathon簡介Marathon按照官方的說法是個基於Mesos的私有PaaS,它實現了Mesos的Framework。Marathon實現了服務發現和負載平衡、為部署提供提供REST API服務、授權和SSL、配置約束等功能。
Marathon支持通過Shell命令和Docker部署應用。提供Web界面、支持cpu/mem、實例數等參數設置,支持單應用的Scale,但不支持複雜的集群定義。Marathon本身是通過Scala實現的。
Marathon能夠支持運行長服務,比如Web應用等。Marathon能夠原樣運行任何Linux二進位發布版本,如Tomcat Play等等。
理解Mesos和Marathon之間的關係,如果將Mesos類比為作業系統的內核,負責資源調度。則Marathon可以類比為服務管理系統,比如是init,systemd或upstart等系統,用來管理應用的狀態信息。Marathon將應用程式部署為長時間運行的Mesos任務。
Marathon可以讓您指定每個應用程式實例需要的資源以及要運行此程序需要多少實例。它可以使用可用的集群資源對失敗的任務自動做出響應。
如果某個Mesos Slave當機或應用的某個實例退出、失敗,Marathon將會自動啟動一個新的實例,來替換掉失敗的實例。Marathon也允許用戶在部署時指定應用程式彼此間的依賴關係,這樣就可以保證某個應用程式實例不會在它依賴的資料庫實例啟動前啟動。
Marathon特性
高可用,支持多主節點(主備模式)自動切換。
支持多種容器環境。
支持有狀態服務,如資料庫。
使用Web管理界面用於配置操作和監控系統狀態。
約束規則,比如限制任務分布在特定節點。
服務發現、負載均衡。
支持健康檢查,實現容錯。
支持事件訂閱,用於集成到其它系統。
運行指標監控接口。
完善易用的REST API。
安裝Mesos和Marathon系統環境
主機名IP位址軟體環境dev-master-01192.168.2.210Mesos Master、Zookeeper、Marathondev-node-01192.168.2.211Mesos Slave、Docker我們使用mesosphere提供的安裝包進行安裝。
添加軟體安裝源
# 增加證書並設備環境變量$ apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF$ DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]')$ CODENAME=$(lsb_release -cs)# 增加倉庫$ echo "deb http://repos.mesosphere.com/${DISTRO} ${CODENAME} main"|sudo tee /etc/apt/sources.list.d/mesosphere.list$ apt-get -y update
$ rpm -Uvh http://repos.mesosphere.com/el/7/noarch/RPMS/mesosphere-el-repo-7-3.noarch.rpm$ yum -y update
註:所有安裝的機器都需要添加。
安裝Master這裡需要在Master上安裝Mesos、Marathon、ZooKeeper。
$ apt-get -y install mesos marathon zookeeperd
$ yum install -y mesos marathon mesosphere-zookeeper
ZooKeeper設定
本次配置的ZooKeeper是單節點。生產環境建議配置ZooKeeper集群,有關ZooKeeper集群安裝後面會分享相關文檔。
$ vim /etc/mesos/zkzk://dev-master-01:2181/mesos
註:這裡使用的是主機名,記得在各主機的hosts配置下映射關係。
$ vim /etc/hosts192.168.2.210 dev-master-01192.168.2.211 dev-node-02
手動建立management.properties文件
$ mkdir -p /usr/lib/jvm/java-9-openjdk-amd64/conf/management/ && touch /usr/lib/jvm/java-9-openjdk-amd64/conf/management/management.properties
如果不建立,ZooKeeper不能正確啟動。會報以下錯誤:
$ Error: Config file not found: /usr/lib/jvm/java-9-openjdk-amd64/conf/management/management.properties
這是一個OpenJDK的巨坑,生產環境建議用Oracle JDK。
配置JAVA環境變量(可選)
$ vim /etc/profile.d/zookeeper.shexport JAVA_HOME=/usr/lib/jvm/java-9-openjdk-amd64/export JER_HOME=$JAVA_HOME/jreexport CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATHexport PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
啟動相關服務
$ systemctl start zookeeper$ systemctl start mesos-master$ systemctl start marathon
驗證ZooKeeper是否啟動成功
$ systemctl status zookeeper● zookeeper.service - LSB: centralized coordination service Loaded: loaded (/etc/init.d/zookeeper; bad; vendor preset: enabled) Active: active (running) since Tue 2017-05-02 15:16:59 CST; 4min 34s ago Docs: man:systemd-sysv-generator(8) Process: 15309 ExecStop=/etc/init.d/zookeeper stop (code=exited, status=0/SUCCESS) Process: 15324 ExecStart=/etc/init.d/zookeeper start (code=exited, status=0/SUCCESS) Tasks: 26 Memory: 46.0M CPU: 12.041s CGroup: /system.slice/zookeeper.service └─15336 /usr/bin/java -cp /etc/zookeeper/conf:/usr/share/java/jline.jar:/usr/share/java/log4j-1.2.jar:/usr/share/java/xercesImpl.jar:/usr/share/java/xmlParserAPIs.jar:/usr/share/java/netty.jar:/usr/share/java/slf4j-api.jar:/usr/share/java/slf4j-log4j12.jar:/uMay 02 15:16:59 dev-master-01 systemd[1]: Starting LSB: centralized coordination service...May 02 15:16:59 dev-master-01 systemd[1]: Started LSB: centralized coordination service.
訪問Mesos的Web管理界面
Mesos安裝完畢後,Mesos Master會啟動一個Web服務,默認監聽在5050埠。通過使用http://ip:5050/來訪問。如下圖所示:
在這個界面裡,我們能看到整個集群的資源分配情況和框架的狀態。 現在所有資源還是空,也沒有任何進程。
訪問Marathon的Web管理界面
Marathon默認監聽在8080埠,通過使用http://ip:8080/來訪問。如下圖所示:
安裝SlaveMesos Master集群要真正能夠分配資源並運行任務,還需要向Master註冊Slave。Slave的所有配置都在/etc/mesos-slave目錄中。
這裡我們需要Slave上安裝Mesos、Docker。
$ apt-get install -y mesos docker
$ yum install -y mesos docker
Docker相關設定
這裡主要需要設置containerizers、executor_registration_timeout參數。設置containerizers參數是為了讓Slave支持Docker,默認是用lxc來管理容器的。executor_registration_timeout參數主要是由於Docker任務啟動的時候,需要去遠程拉取鏡像。一般首次拉取時容易超時,這裡把超時時間設得長一些,避免超時。
$ echo 'docker,mesos' > /etc/mesos-slave/containerizers$ echo '5mins' > /etc/mesos-slave/executor_registration_timeout
ZooKeeper設定
$ vim /etc/mesos/zkzk://dev-master-01:2181/mesos
註:這裡使用的是主機名,記得在各主機的hosts配置下映射關係。
$ vim /etc/hosts192.168.2.210 dev-master-01192.168.2.211 dev-node-02
啟動相關服務
$ systemctl start docker$ systemctl start mesos-slave
使用Mesos在MASTER上執行Frameworks測試框架
$ MASTER=$(mesos-resolve `cat /etc/mesos/zk`)$ mesos-execute --master=$MASTER --name="cluster-test" --command="sleep 60"
在Frameworks頁面刷新,可以查看任務的執行情況。
查看活動的框架
查看活動的任務
點擊結束的任務頁面,可以看到在哪個Slave上執行的。
下面通過Marathon調用Mesos來創建一個Nginx鏡像的Docker容器。Marathon啟動時會讀取/etc/mesos/zk配置文件,Marathon通過Zookeeper來找到Mesos Master。
創建應用
首先準備應用定義文件, 此文件為JSON格式。定義了應用的名稱(id)、命令、資源(cpu、內存等)和實例數量等信息。
$ vim nginx.json{ "id":"nginx", "cpus":0.2, "mem":20.0, "instances": 1, "constraints": [["hostname", "UNIQUE",""]], "container": { "type":"DOCKER", "docker": { "image": "nginx", "network": "BRIDGE", "portMappings": [ {"containerPort": 80, "hostPort": 0,"servicePort": 0, "protocol": "tcp" } ] } }}
在Web頁面上,點擊創建Create Application按鈕。 彈出操作窗中,切換為JSON模式。
將上一步準備的JSON內容複製到輸入框內,點擊輸入框旁的創建Create Application按鈕保存配置。 此時新建應用的信息,將出現在Web頁面的應用列表。
在dev-node-01上查看通過Marathon創建的容器
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES419fd7d23736 nginx "nginx -g 'daemon ..." 12 minutes ago Up 12 minutes 0.0.0.0:31182->80/tcp mesos-66734014-5647-47e2-9264-b5775128b01d-S0.cf1d01ec-0b7d-4f3f-a407-926794686490
現在你就可以通過http://ip:31182來訪問到nginx了。
Marathon有自己的REST API,為了方便批量化管理,我們通過API的方式來創建一個簡單應用。這裡我們使用其中的POST /v2/apps來創建應用。
創建JSON文件
$ vim busybox-demo.json{ "container": { "type": "DOCKER", "docker": { "image": "busybox" } }, "id": "busybox-demo", "instances": 2, "cpus": 0.5, "mem": 128, "uris": [], "cmd": "while sleep 10; do date -u +%T; done"}
其中的cmd欄位包含了應用將要執行的命令,instances是進程的數量。
通過API在Marathon上創建任務
# curl -X POST -H "Content-Type: application/json" http://192.168.2.210:8080/v2/apps -d@busybox-demo.json{"id":"/busybox-demo","cmd":"while sleep 10; do date -u +%T; done","args":null,"user":null,"env":{},"instances":2,"cpus":0.5,"mem":256,"disk":0,"gpus":0,"executor":"","constraints":[],"uris":[],"fetch":[],"storeUrls":[],"backoffSeconds":1,"backoffFactor":1.15,"maxLaunchDelaySeconds":3600,"container":{"type":"DOCKER","volumes":[],"docker":{"image":"busybox","network":null,"portMappings":[],"privileged":false,"parameters":[],"forcePullImage":false}},"healthChecks":[],"readinessChecks":[],"dependencies":[],"upgradeStrategy":{"minimumHealthCapacity":1,"maximumOverCapacity":1},"labels":{},"ipAddress":null,"version":"2017-05-03T03:29:46.941Z","residency":null,"secrets":{},"taskKillGracePeriodSeconds":null,"unreachableStrategy":{"inactiveAfterSeconds":300,"expungeAfterSeconds":600},"killSelection":"YOUNGEST_FIRST","ports":[0],"portDefinitions":[{"port":0,"protocol":"tcp","name":"default","labels":{}}],"requirePorts":false,"tasksStaged":0,"tasksRunning":0,"tasksHealthy":0,"tasksUnhealthy":0,"deployments":[{"id":"2f25526a-7641-4326-bd63-26eb69364838"}],"tasks":[]}
在Marathon頁面確認容器已經啟動
在Mesos頁面確認任務正在執行中
在dev-node-01節點上確認容器已經啟動
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESdb72938c7628 busybox "/bin/sh -c 'while..." 2 minutes ago Up 2 minutes mesos-66734014-5647-47e2-9264-b5775128b01d-S0.3e6e80a8-51b7-4f23-876b-6deb08671f46cbeb91ebfeca busybox "/bin/sh -c 'while..." 2 minutes ago Up 2 minutes mesos-66734014-5647-47e2-9264-b5775128b01d-S0.a8cad50d-c0b8-42ef-a986-fb99b6fe4f1b
查看容器的日誌,確認輸出的時間
$ docker logs db72938c762803:35:2803:35:3803:35:4803:35:5803:36:08
如果你想創建同樣的容器,可以點擊上圖中的Scale Application來體驗一下。同樣的,你也可以通過Marathon的Web界面來進行容器的創建、擴展和銷毀。
通過上面的部署體驗,Mesos和Marathon使得Docker集群的管理變得簡單方便,為在生產環境部署使用Docker集群提供了可能。
參考文檔http://www.google.com
https://github.com/arangodb/dcos-mini-cluster/blob/master/Dockerfile
http://www.cnblogs.com/ee900222/p/docker_2.html
http://www.xuliangwei.com/xubusi/422.html
http://biglittleant.cn/2016/12/18/mesos-marathon-docker/
更多精彩熱文: