如何安裝與使用docker Mesos,一步步教你


 

dockerMesos 安裝與使用[docker中文手冊]

mesos,節點,master,Mesos,marathon

Mesos 安裝與使用

以 Mesos 結合 Marathon 應用框架為例,來看下如何快速搭建一套 Mesos 平台。

Marathon 是可以跟 Mesos 一起協作的一個 framework,基於 Scala 實現,可以實現保持應用的持續運行。

另外,Mesos 默認利用 ZooKeeper 來進行多個主節點之間的選舉,以及從節點發現主節點的過程。一般在生產環境中,需要啟動多個 Mesos master 服務(推薦 3 或 5 個),並且推薦使用 supervisord 等進程管理器來自動保持服務的運行。

ZooKeeper 是一個分布式集群中信息同步的工具,通過自動在多個節點中選舉 leader,保障多個節點之間的某些信息保持一致性。
這里還要注意:光理論是不夠的。在此順便送大家十套2020最新JAVA架構項目實戰教程及大廠面試題庫,進我扣裙 :七吧傘吧零而衣零傘 (數字的諧音)轉換下可以找到了,還可以跟老架構師交流

安裝

安裝主要需要 mesos、zookeeper 和 marathon 三個軟件包。

Mesos 也采用了經典的主-從結構,一般包括若干主節點和大量從節點。其中,mesos master 服務和 zookeeper 需要部署到所有的主節點,mesos slave 服務需要部署到所有從節點。marathon 可以部署到主節點。

安裝可以通過源碼編譯、軟件源或者 Docker 鏡像方式進行,下面分別進行介紹。

源碼編譯

源碼編譯方式可以保障獲取到最新版本,但編譯過程比較費時間。

首先,從 apache.org 開源網站下載最新的源碼。

1
$ git clone https://git-wip-us.apache.org/repos/asf/mesos.git

其中,主要代碼在 src 目錄下,應用框架代碼在 frameworks 目錄下,文檔在 docs 目錄下,include 中包括了跟 Mesos 打交道使用的一些 API 定義頭文件。

安裝依賴,主要包括 Java 運行環境、Linux 上的自動編譯環境等。

1
2
3
4
$ sudo apt-get update
$ sudo apt-get install -y openjdk-8-jdk autoconf libtool
build-essential python-dev python-boto libcurl4-nss-dev
libsasl2-dev maven libapr1-dev libsvn-dev

后面就是常規 C++ 項目的方法,configure 之后利用 Makefile 進行編譯和安裝。

1
2
3
4
5
6
$ cd mesos
$ ./bootstrap
$ mkdir build
$ cd build && ../configure --with-network-isolator
$ make
$ make check && sudo make install

軟件源安裝

通過軟件源方式進行安裝相對會省時間,但往往不是最新版本。

這里以 Ubuntu 系統為例,首先添加軟件源地址。

1
2
3
4
5
$ sudo 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.io/${DISTRO} ${CODENAME} main" |
sudo tee /etc/apt/sources.list.d/mesosphere.list

刷新本地軟件倉庫信息並安裝 zookeeper、mesos、marathon 三個軟件包。

1
$ sudo apt-get -y update && sudo apt-get -y install zookeeper mesos marathon

注意,Marathon 最新版本需要 jdk 1.8+ 的支持。如果系統中有多個 Java 版本,需要檢查配置默認的 JDK 版本符合要求。

1
$ sudo update-alternatives --config java

安裝 Mesos 成功后,會在 /usr/sbin/ 下面發現 mesos-master 和 mesos-slave 兩個二進制文件,分別對應主節點上需要運行的管理服務和從節點上需要運行的任務服務。

用戶可以手動運行二進制文件啟動服務,也可以通過 service 命令來方便進行管理。

例如,在主節點上重啟 Mesos 管理服務:

1
$ sudo service mesos-master restart

通過 service 命令來管理,實際上是通過調用 /usr/bin/mesos-init-wrapper 腳本文件進行處理。

基於 Docker

需要如下三個鏡像。

  • ZooKeeper:https://registry.hub.docker.com/u/garland/zookeeper/
  • Mesos:https://registry.hub.docker.com/u/garland/mesosphere-docker-mesos-master/
  • Marathon:https://registry.hub.docker.com/u/garland/mesosphere-docker-marathon/

其中 mesos-master 鏡像在后面將分別作為 master 和 slave 角色進行使用。

首先,拉取三個鏡像。

1
2
3
$ docker pull garland/zookeeper
$ docker pull garland/mesosphere-docker-mesos-master
$ docker pull garland/mesosphere-docker-marathon

導出主節點機器的地址到環境變量。

1
$ HOST_IP=10.0.0.2

在主節點上啟動 Zookeepr 容器。

1
2
3
4
5
docker run -d 
-p 2181:2181
-p 2888:2888
-p 3888:3888
garland/zookeeper

在主節點上啟動 Mesos Master 服務容器。

1
2
3
4
5
6
7
8
9
10
11
12
docker run --net="host" 
-p 5050:5050
-e "MESOS_HOSTNAME=${HOST_IP}"
-e "MESOS_IP=${HOST_IP}"
-e "MESOS_ZK=zk://${HOST_IP}:2181/mesos"
-e "MESOS_PORT=5050"
-e "MESOS_LOG_DIR=/var/log/mesos"
-e "MESOS_QUORUM=1"
-e "MESOS_REGISTRY=in_memory"
-e "MESOS_WORK_DIR=/var/lib/mesos"
-d
garland/mesosphere-docker-mesos-master

在主節點上啟動 Marathon。

1
2
3
4
docker run 
-d
-p 8080:8080
garland/mesosphere-docker-marathon --master zk://${HOST_IP}:2181/mesos --zk zk://${HOST_IP}:2181/marathon

在從節點上啟動 Mesos slave 容器。

1
2
3
4
5
6
7
docker run -d 
--name mesos_slave_1
--entrypoint="mesos-slave"
-e "MESOS_MASTER=zk://${HOST_IP}:2181/mesos"
-e "MESOS_LOG_DIR=/var/log/mesos"
-e "MESOS_LOGGING_LEVEL=INFO"
garland/mesosphere-docker-mesos-master:latest

接下來,可以通過訪問本地 8080 端口來使用 Marathon 啟動任務了。

配置說明

下面以本地通過軟件源方式安裝為例,解釋如何修改各個配置文件。

ZooKeepr

ZooKeepr 是一個分布式應用的協調工具,用來管理多個主節點的選舉和冗余,監聽在 2181 端口。推薦至少布置三個主節點來被 ZooKeeper 維護。

配置文件默認都在 /etc/zookeeper/conf/ 目錄下。比較關鍵的配置文件有兩個:myid 和 zoo.cfg

myid 文件會記錄加入 ZooKeeper 集群的節點的序號(1-255之間)。/var/lib/zookeeper/myid 文件其實也是軟連接到了該文件。

比如配置某節點序號為 1,則需要在該節點上執行:

1
$ echo 1 | sudo dd of=/etc/zookeeper/conf/myid

節點序號在 ZooKeeper 集群中必須唯一,不能出現多個擁有相同序號的節點。

另外,需要修改 zoo.cfg 文件,該文件是主配置文件,主要需要添加上加入 ZooKeeper 集群的機器的序號和對應監聽地址。

例如,現在 ZooKeeper 集群中有三個節點,地址分別為 10.0.0.210.0.0.310.0.0.4,序號分別配置為 234

則配置如下的三行:

1
2
3
server.2=10.0.0.2:2888:3888
server.3=10.0.0.3:2888:3888
server.4=10.0.0.4:2888:3888

其中第一個端口 2888 負責從節點連接到主節點的;第二個端口 3888 則負責主節點進行選舉時候通信。

也可以用主機名形式,則需要各個節點 /etc/hosts 文件中都記錄地址到主機名對應的映射關系。

完成配置后,啟動 ZooKeeper 服務。

1
$ sudo service zookeeper start

Mesos

Mesos 的默認配置目錄有三個:

  • /etc/mesos/:主節點和從節點都會讀取的配置文件,最關鍵的是 zk 文件存放主節點的信息;
  • /etc/mesos-master/:只有主節點會讀取的配置,等價於啟動 mesos-master 命令時候的默認選項;
  • /etc/mesos-slave/:只有從節點會讀取的配置,等價於啟動 mesos-master 命令時候的默認選項。

最關鍵的是需要在所有節點上修改 /etc/mesos/zk,寫入主節點集群的 ZooKeeper 地址列表,例如:

1
zk://10.0.0.2:2181,10.0.0.3:2181,10.0.0.4:2181/mesos

此外,/etc/default/mesos/etc/default/mesos-master/etc/default/mesos-slave 這三個文件中可以存放一些環境變量定義,Mesos 服務啟動之前,會將這些環境變量導入進來作為啟動參數。格式為 MESOS_OPTION_NAME

下面分別說明在主節點和從節點上的配置。

主節點

一般只需要關注 /etc/mesos-master/ 目錄下的文件。默認情況下目錄下為空。

該目錄下文件命名和內容需要跟 mesos-master 支持的命令行選項一一對應。可以通過 mesos-master --help 命令查看支持的選項。

例如某個文件 key 中內容為 value,則在 mesos-master 服務啟動的時候,會自動添加參數 --key=value 給二進制命令。

例如,mesos-master 服務默認監聽在 loopback 端口,即 127.0.0.1:5050,我們需要修改主節點監聽的地址,則可以創建 /etc/mesos-master/ip 文件,在其中寫入主節點監聽的外部地址。

為了正常啟動 mesos-master 服務,還需要指定 work_dir 參數(表示應用框架的工作目錄)的值,可以通過創建 /etc/mesos-master/work_dir 文件,在其中寫入目錄,例如 /var/lib/mesos。工作目錄下會生成一個 replicated_log 目錄,會存有各種同步狀態的持久化信息。

以及指定 quorum 參數的值,該參數用來表示 ZooKeeper 集群中要求最少參加表決的節點數目。一般設置為比 ZooKeeper 集群中節點個數的半數多一些(比如三個節點的話,可以配置為 2)。

此外,要修改 Mesos 集群的名稱,可以創建 /etc/mesos-master/cluster 文件,在其中寫入集群的別名,例如 MesosCluster

總結下,建議在 /etc/mesos-master 目錄下,配置至少四個參數文件:ipquorumwork_dircluster

修改配置之后,需要啟動服務即可生效。

1
$ sudo service mesos-master start

 

更多選項可以參考后面的配置項解析章節。

主節點服務啟動后,則可以在從節點上啟動 mesos-slave 服務來加入主節點的管理。

從節點

一般只需要關注 /etc/mesos-slave/ 目錄下的文件。默認情況下目錄下為空。

文件命名和內容也是跟主節點類似,對應二進制文件支持的命令行參數。

建議在從節點上,創建 /etc/mesos-slave/ip 文件,在其中寫入跟主節點通信的地址。

修改配置之后,也需要重新啟動服務。

1
$ sudo service mesos-slave start

更多選項可以參考后面的配置項解析章節。

Marathon

Marathon 作為 Mesos 的一個應用框架,配置要更為簡單,必需的配置項有 --master 和 --zk

安裝完成后,會在 /usr/bin 下多一個 marathon shell 腳本,為啟動 marathon 時候執行的命令。

配置目錄為 /etc/marathon/conf(需要手動創建),此外默認配置文件在 /etc/default/marathon

我們手動創建配置目錄,並添加配置項(文件命名和內容跟 Mesos 風格一致),讓 Marathon 能連接到已創建的 Mesos 集群中。

1
2
$ sudo mkdir -p /etc/marathon/conf
$ sudo cp /etc/mesos/zk /etc/marathon/conf/master

同時,讓 Marathon 也將自身的狀態信息保存到 ZooKeeper 中。創建 /etc/marathon/conf/zk 文件,添加 ZooKeeper 地址和路徑。

1
zk://10.0.0.2:2181,10.0.0.2:2181,10.0.0.2:2181/marathon

啟動 marathon 服務。

1
$ sudo service marathon start

訪問 Mesos 圖形界面

Mesos 自帶了 Web 圖形界面,可以方便用戶查看集群狀態。

用戶在 Mesos 主節點服務和從節點服務都啟動后,可以通過瀏覽器訪問主節點 5050 端口,看到類似如下界面,已經有兩個 slave 節點加入了。

mesos 界面查看加入的 slave 節點

通過 Slaves 標簽頁能看到加入集群的從節點的信息。

如果沒有啟動 Marathon 服務,在 Frameworks 標簽頁下將看不到任何內容。

訪問 Marathon 圖形界面

Marathon 服務啟動成功后,在 Mesos 的 web 界面的 Frameworks 標簽頁下面將能看到名稱為 marathon 的框架出現。

同時可以通過瀏覽器訪問 8080 端口,看到 Marathon 自己的管理界面。

marathon 圖形管理界面

此時,可以通過界面或者 REST API 來創建一個應用,Marathon 會保持該應用的持續運行。

marathon 查看任務支持的參數

通過界面方式可以看到各任務支持的參數(包括資源、命令、環境變量、健康檢查等),同時可以很容易地修改任務運行實例數進行擴展,非常適合進行測試。

如果要更自動化地使用 Marathon,則需要通過它的 REST API 進行操作。

一般的,啟動新任務需要先創建一個定義模板(JSON 格式),然后發到指定的 API。

例如,示例任務 basic-0 的定義模板為:

1
2
3
4
5
6
7
{
"id": "basic-0",
"cmd": "while [ true ] ; do echo "Hello Marathon" ; sleep 5 ; done",
"cpus": 0.1,
"mem": 10.0,
"instances": 1
}

該任務申請資源為 0.1 個單核 CPU 資源和 10 MB 的內存資源,具體命令為每隔五秒鍾用 shell 打印一句 Hello Marathon

可以通過如下命令發出 basic-0 任務到 Marathon 框架,框架會分配任務到某個滿足條件的從節點上,成功會返回一個 json 對象,描述任務的詳細信息。

1
2
$ curl -X POST http://marathon_host:8080/v2/apps -d @basic-0.json -H "Content-type: application/json"
{"id":"/basic-0","cmd":"while [ true ] ; do echo "Hello Marathon" ; sleep 5 ; done","args":null,"user":null,"env":{},"instances":1,"cpus":0.1,"mem":10,"disk":0,"executor":"","constraints":[],"uris":[],"storeUrls":[],"ports":[0],"requirePorts":false,"backoffSeconds":1,"backoffFactor":1.15,"maxLaunchDelaySeconds":3600,"container":null,"healthChecks":[],"dependencies":[],"upgradeStrategy":{"minimumHealthCapacity":1,"maximumOverCapacity":1},"labels":{},"acceptedResourceRoles":null,"version":"2015-12-28T05:33:05.805Z","tasksStaged":0,"tasksRunning":0,"tasksHealthy":0,"tasksUnhealthy":0,"deployments":[{"id":"3ec3fbd5-11e4-479f-bd17-813d33e43e0c"}],"tasks":[]}%

Marathon 的更多 REST API 可以參考本地自帶的文檔:http://marathon_host:8080/api-console/index.html

此時,如果運行任務的從節點出現故障,任務會自動在其它可用的從節點上啟動。

此外,目前也已經支持基於 Docker 容器的任務。需要先在 Mesos slave 節點上為 slave 服務配置 --containerizers=docker,mesos 參數。

例如如下面的示例任務:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
"id": "basic-3",
"cmd": "python3 -m http.server 8080",
"cpus": 0.5,
"mem": 32.0,
"container": {
"type": "DOCKER",
"volumes": [],
"docker": {
"image": "python:3",
"network": "BRIDGE",
"portMappings": [
{
"containerPort": 8080,
"hostPort": 31000,
"servicePort": 0,
"protocol": "tcp"
}
],
"privileged": false,
"parameters": [],
"forcePullImage": true
}
}
}

該任務啟動一個 python:3 容器,執行 python3 -m http.server 8080 命令,作為一個簡單的 web 服務,實際端口會映射到宿主機的 31000 端口。

注意區分 hostPort 和 servicePort,前者代表任務映射到的本地可用端口(可用范圍由 Mesos slave 匯報,默認為 31000 ~ 32000);后者作為服務管理的端口,可以被用作一些服務發行機制使用進行轉發,在整個 Marathon 集群中是唯一的。

任務執行后,也可以在對應 slave 節點上通過 Docker 命令查看容器運行情況,容器將以 mesos-SLAVE_ID 開頭。

1
2
3
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1226b4ec8d7d python:3 "/bin/sh -c "python3 " 3 days ago Up 3 days 0.0.0.

最后注意:光理論是不夠的。在此順便送大家十套2020最新JAVA架構項目實戰教程及大廠面試題庫,進我扣裙 :七吧傘吧零而衣零傘 (數字的諧音)轉換下可以找到了,還可以跟老架構師交流
本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM