1. 程式人生 > >在CentOS7上配置Marathon+Mesos+Docker實戰

在CentOS7上配置Marathon+Mesos+Docker實戰

選擇 支持 配置文件 url 端口 cep var back 奇數

配置多臺Mesos-master環境

生產環境中ZooKeeper是以宕機個數過半來讓整個集群宕機的。所以Mesos-master一般選擇奇數個節點來組成集群,隨著部署的Master節點增多可靠性也就增強,但多Mesos-master集群環境只有一個Mesos-master會處於Leader狀態對外提供服務,集群中的其他服務器則會成為此Leader的Follower,處於就緒狀態。當Leadre發生故障的時候,ZooKeeper就會快速在Follower中投票選舉出下一個服務器作為Leader繼續對外提供服務。

實驗環境表

技術分享圖片

實驗步驟

1.設置四臺服務器的名稱分別是:master1、master2、master3、slave 。

[root@localhost ~]# hostnamectl set-hostname master1  
[root@localhost ~]# hostnamectl set-hostname master2
[root@localhost ~]# hostnamectl set-hostname master3
[root@localhost ~]# vim /etc/hosts  #所有主機同步
192.168.126.162 master1
192.168.126.164 master2
192.168.126.161 master3
192.168.126.165 slave1
192.168.126.166 slave2

[root@localhost ~]# hostnamectl set-hostname slave1
[root@localhost ~]# hostnamectl set-hostname slave1
[root@localhost ~]# vim /etc/hosts
192.168.126.162 master1
192.168.126.164 master2
192.168.126.161 master3
192.168.126.165 slave1
192.168.126.166 slave2

2.安裝ZooKeeper

分別在所有的Mesos-master節點上安裝ZooKeeper。

[root@master1 ~]# tar zxvf zookeeper-3.4.6.tar.gz -C /home/q/
[root@master1 ~]# cd /home/q/zookeeper-3.4.6/
[root@master1 ~]# mv conf/zoo_sample.cfg conf/zoo.cfg 

3.配置ZooKeeper

修改ZooKeeper配置文件,以server.A=B:C:D: 格式定義各個節點相關信息,其中:A 是一個數字,表示第幾號服務器;B是這個服務器的IP地址;C為與集群中的Leader服務器交換信息的端口;D是在Leader掛掉時專門進行Leader選舉時所用的端口。

dataDir=/home/q/zookeeper-3.4.6/data     #修改位置
dataLogDir=/home/q/zookeeper-3.4.6/datalog
server.1=192.168.126.162:2888:3888   #2888,信息交互端口
server.2=192.168.126.164:2888:3888   #3888,選舉端口
server.3=192.168.126.161:2888:3888

修改完的配置文件拷貝給其他Mesos-master主機:

[root@master1 zookeeper-3.4.6]# scp conf/zoo.cfg 192.168.126.164:/home/q/zookeeper-3.4.6/conf/zoo.cfg 
[root@master1 zookeeper-3.4.6]# scp conf/zoo.cfg 192.168.126.161:/home/q/zookeeper-3.4.6/conf/zoo.cfg 

每個節點還需要在配置文件zoo.cfg中定義的dataDir路徑下創建一個myid文件,myid文件存有上面提到的A的值。

Master1:
[root@master1 zookeeper-3.4.6]# mkdir data datalog
[root@master1 zookeeper-3.4.6]# echo 1 > data/myid
[root@master1 zookeeper-3.4.6]# cat data/myid 
1

Master2:
[root@master2 zookeeper-3.4.6]# mkdir data datalog
[root@master2 zookeeper-3.4.6]# echo 2 > data/myid
[root@master2 zookeeper-3.4.6]# cat data/myid 
2

Master3:
[root@master3 zookeeper-3.4.6]# mkdir data datalog
[root@master3 zookeeper-3.4.6]# echo 3 > data/myid
[root@master3 zookeeper-3.4.6]# cat data/myid 
3

分別在各Master節點上啟動ZooKeeper服務

[root@master1 zookeeper-3.4.6]# ./bin/zkServer.sh start conf/zoo.cfg 
JMX enabled by default
Using config: conf/zoo.cfg
Starting zookeeper ... STARTED

查看狀態,看到Master2被選舉為Leader,其他主機為Follower狀態。

[root@master1 zookeeper-3.4.6]# ./bin/zkServer.sh status
JMX enabled by default
Using config: /home/q/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

[root@master2 zookeeper-3.4.6]# ./bin/zkServer.sh status
JMX enabled by default
Using config: /home/q/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader

[root@master3 zookeeper-3.4.6]# ./bin/zkServer.sh status
JMX enabled by default
Using config: /home/q/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower

3.分別啟動Mesos-master

[root@master1 zookeeper-3.4.6]# mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.126.162:2181/mesos --quorum=2

[root@master2 zookeeper-3.4.6]# mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.126.164:2181/mesos --quorum=2

[root@master3 zookeeper-3.4.6]# mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.126.161:2181/mesos --quorum=2

4.啟動Mesos-slave

[root@slave ~]# mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.126.162:2181,192.168.164.164:2181,192.168.126.161:2181/mesos --no-hostname_lookup --ip=0.0.0.0

使用瀏覽器指定任意Mesos-master地址的5050端口進行驗證,如圖所示。指定的是非Leader狀態下的 Mesos-master1地址,頁面會自行跳轉至處於Leader狀態的Mesos-master2地址。
技術分享圖片

部署運行Marathon

Marathon是一個Mesos框架,能夠支持運行長服務。

1.安裝marathon到三臺Mesos-master主機上並啟動Marathon

[root@master1 ~]# tar zxvf  marathon-0.15.2.tgz -C /home/q/
[root@master1 ~]# cd /home/q/marathon-0.15.2/
[root@master1 marathon-0.15.2]# ./bin/start --hostname 192.168.126.162 --master zk://192.168.126.162:2181,192.168.126.164:2181,192.168.175.161:2181/mesos --http_address 0.0.0.0

訪問Marathon(默認使用8080端口),如圖所示:
技術分享圖片

2.使用Marathon創建測試任務

在首頁點擊Create按鈕,創建一個測試任務echo "hello world",如圖所示:
技術分享圖片

創建成功後在頁面可以看到該任務,如圖所示:
技術分享圖片

此時,Marathon會自動註冊到Mesos中,可以在Mesos Web的Framework頁面中看到該註冊信息。如圖所示:
技術分享圖片

使用命令行方式從Mesos-slave主機的data/slave目錄中可以查看到這個簡單任務的相關信息。

[root@slave latest]# pwd    #查看路徑
/home/q/mesos/data/slaves/7b2ad136-917c-4680-b582-71821ab25e9d-S0/frameworks/44c6a533-b607-40b4-9faf-bed151b1a958-0000/executors/tets.7e359839-a1ee-11e8-8161-52540083dae9/runs/latest
[root@slave latest]# ls
stderr  stdout      #標準錯誤和標準輸出信息
[root@slave latest]# cat stdout 
Registered executor on 192.168.126.165
Starting task tets.7e359839-a1ee-11e8-8161-52540083dae9
sh -c ‘echo "hello world"‘
hello world
Forked command at 6112
Command exited with status 0 (pid: 6112)

3.使用Marathon API的形式添加新任務

[root@slave1 ~]# vim demo.json

{
"id":"basic-0",
"cmd":"while [true]; do echo ‘hello Marathon‘; sleep 5; done",
"cpus":0.1,
"mem":10.0,
"instances":1
}    

查看Marathon網站有新添加任務

[root@slave1 ~]# curl -X POST -H "Content-type:application/json" http://192.168.126.162:8080/v2/apps [email protected]   

啟動第二個Mesos-slave節點slave2。在Mesos Web的Slave選項卡中可以看到加入的slave節點相關信息,如圖所示:

[root@slave2 ~]# mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.126.162:2181,192.168.126.164:2181,192.168.126.161:2181/mesos --no-hostname_lookup --ip=0.0.0.0

技術分享圖片

在Mesos Web首頁看到兩個slave主機都已經激活,如圖所示:
技術分享圖片

在Marathon中點擊Scale Application擴充16個任務,已經啟動的16個任務會發送16個echo消息,由Maarathon隨機分發給了slave1與slave2主機,如圖所示:
技術分享圖片
技術分享圖片

4.使用Mesos與Marathon創建Docker群集

使用Marathon API的形式創建Docker的Nginx請求任務。

[root@slave1 ~]# vim nginx.json

{
"id":"/nginx",
"container":{
"type":"DOCKER",
"docker":{
"image":"nginx",
"network":"HOST",
"parameters":[],
"privileged":false,
"forcePullImage":false
}
},
"cpus":0.1,
"mem":32.0,
"instances":1
}

[root@slave1 ~]# curl -X POST -H "Content-type:application/json" http://192.168.126.162:8080/v2/apps [email protected]
{"id":"/nginx","cmd":null,"args":null,"user":null,"env":{},"instances":1,"cpus":0.1,"mem":32,"disk":0,"executor":"","constraints":[],"uris":[],"fetch":[],"storeUrls":[],"ports":[0],"requirePorts":false,"backoffSeconds":1,"backoffFactor":1.15,"maxLaunchDelaySeconds":3600,"container":{"type":"DOCKER","volumes":[],"docker":{"image":"nginx","network":"HOST","privileged":false,"parameters":[],"forcePullImage":false}},"healthChecks":[],"dependencies":[],"upgradeStrategy":{"minimumHealthCapacity":1,"maximumOverCapacity":1},"labels":{},"acceptedResourceRoles":null,"ipAddress":null,"version":"2018-08-17T13:17:51.854Z","tasksStaged":0,"tasksRunning":0,"tasksHealthy":0,"tasksUnhealthy":0,"deployments":[{"id":"89c43c68-c68e-49f8-8e86-c2ffdf5ba65b"}],"tasks":[]}[root@slave1 ~]#

創建好後在Marathon頁面中查看,如圖所示:
技術分享圖片

可以在創建的Nginx任務下看到該任務發送給了192.168.126.165主機(slave1),如圖所示:
技術分享圖片

用命令行的方式可以查看到現在的slave1主機已經開始下載Docker鏡像。

[root@slave1 ~]# ps aux | grep docker
.....//省略
root      12436  0.0  0.2 264156  3912 ?        Sl   21:18   0:00 /usr/bin/docker-containerd-shim-current 7a7592e98a239f380d13393c42f20e1bc9a10359ae1306537eaaa3297b2b1b1f /var/run/docker/libcontainerd/7a7592e98a239f380d13393c42f20e1bc9a10359ae1306537eaaa3297b2b1b1f /usr/libexec/docker/docker-runc-current
root      12533  0.0  0.0 112720   968 pts/2    R+   21:23   0:00 grep --color=auto docker

使用命令行的方式查看Nginx鏡像的狀態。

[root@slave1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
7a7592e98a23        nginx               "nginx -g ‘daemon ..."   9 minutes ago       Up 9 minutes                            mesos-0d58bbf5-30b5-4353-8ea4-7f3ac3cd5ffd-S0.8b3424a2-48b2-460f-abaa-e93c8f963b03

訪問運行著的Nginx訪問,結果如圖所示:
技術分享圖片

此時,利用Apache Mesos所管理的Docker的Nginx集群搭建成功。

在CentOS7上配置Marathon+Mesos+Docker實戰