1. 程式人生 > >【Docker篇四】Mesos+Zookeeper+Marathon+Docker實戰實驗

【Docker篇四】Mesos+Zookeeper+Marathon+Docker實戰實驗

開發工具 簡化 mark too 資源調度 ext 網絡 上線 root

Apache Mesos概述

不同的分布式運算框架(spark,hadoop,ES,MPI,Cassandra,etc.)中的不同任務往往需要的資源(內存,CPU,網絡IO等)不同,它們運行在同一個集群中,會相互幹擾,為此,應該提供一種資源隔離機制避免任務之間由資源爭用導致效率下降,考慮到資源利用率,運維成本,數據共享等因素,公司一般希望將所有這些框架部署到一個公共的集群中,讓它們共享集群的資源,並對資源進行統一使用,這樣,便誕生了資源統一管理與調度平臺,典型的代表就是mesos.

Apache Mesos工作原理

Apache Mesos采用了master/slave結構來簡化設計,將master盡可能做的輕量級,僅保存了各種計算框架(Farmemork)和mesos slave的狀態信息,這些狀態容易在出現故障的時候被重構,除此之外,mesos還可以使用zookeeper解決master單點故障問題。

Mesos Master充當全局資源調度器角色,采用某種策略算法將某個slave上的空閑資源分配給某個Farmework,而各種Farmework則是通過自己的調度器向master註冊進行接入Mesos Slave則是收集任務狀態和啟動各個Farmework和Executor。原理圖如下:

技術分享圖片

實驗環境

技術分享圖片

安裝Apache Mesos

在每一臺服務器上安裝Apache Mesos服務,由於mesos安裝等待時間較長,本文在實驗環境下選擇使用一臺安裝好mesos的虛擬機進行克隆,然後進行後續操作。

1、配置Java環境

  • 由於軟件需求,mesos運行環境需要在Linux內核版本為3.10以上才可使用。

cat /etc/redhat-release //查看Linux版本
uname -r/a //查看內核版本

  • 解壓jdk軟件包

tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
cd /usr/local
mv jdk1.8.0_91/ java

  • 配置jdk環境變量

vim /etc/profile

export JAVA_HOME=/usr/local/java    //末尾追加
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar

source /etc/profile

2、安裝相關環境包

  • 安裝開發工具

yum groupinstall -y "Development Tools"

  • 添加apache-maven源,為Mesos提供項目管理和構建自動化工具的支持。

wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo

  • 安裝相關依賴包

yum install -y apache-maven python-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel apr-util-devel subversion-devel

  • 配置WANdiscoSVN網絡源

vim /etc/yum.repos.d/wandisco-svn.repo

[WANdiscoSVN]
name=WANdisco SVN Repo 1.9
enabled=1
baseurl=http://opensource.wandisco.com/centos/7/svn-1.9/RPMS/$basearch/
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
  • 配置Mesos環境變量

vim /etc/profile

export MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos.so
export MESOS_NATIVE_LIBRARY=/usr/local/lib/libmesos.so

3、構建Mesos

wget http://www.apache.org/dist/mesos/0.25.0/mesos-0.25.0.tar.gz

tar zxvf mesos-0.25.0.tar.gz -C /opt/
mv mesos-0.25.0/ /root/
cd /root/mesos-0.25.0
mkdir build
cd /build 創建build為編譯安裝目錄
../configure 執行安裝程序

make 等待時間較長(需要服務器保持在線狀態)
make check
make install

  • 此處安裝好mesos軟件後即可克隆主機。

配置單臺Mesos-master與Mesos-Slave

Mesos-Master負責維護slave群集的心跳,從slave提取資源信息。配置之前需要做好相應的解析工作。

1、配置Mesos-master

  • 修改主機名稱

hostnamectl set-hostname master

vim /etc/hosts

192.168.144.114 master    //此時只做單臺master與slave,若遇多臺則解析內容需要增加
192.168.144.119 slave1

bash 刷新生效主機名,或者重啟服務器

  • 創建master啟動命令軟連接

ln -sf /root/mesos-0.25.0/build/bin/mesos-master.sh /usr/sbin/mesos-master

  • 啟動mesos-master

mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0

--work_dir 指定工作目錄
--log_dir  指定日誌生成位置
--no-hostname_lookup 不指定域名解析
--ip=0.0.0.0 任意網段均可訪問
  • 本地驗證訪問mesos開啟狀態,瀏覽器打開http://192.168.144.114:5050/

技術分享圖片

2、配置Mesos-slave

  • 修改主機名稱

hostnamectl set-hostname slave1
vim /etc/hosts

192.168.144.114 master    //此時只做單臺master與slave,若遇多臺則解析內容需要增加
192.168.144.119 slave1
  • 創建slave啟動命令軟連接

ln -sf /root/mesos-0.25.0/build/bin/mesos-slave.sh /usr/sbin/mesos-slave

  • 安裝docker,由於slave需要接受master的調度執行容器運行,因此需要安裝docker

yum install docker -y
systemctl start docker.service
systemctl enable docker.service

  • 啟動slave

mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=192.168.175.132:5050 --no-hostname_lookup --ip=0.0.0.0

--containerizers="mesos,docker"  添加容器參數,使docker的容器可以被配置去執行任務或者執行器。
  • 啟動slave後,再次訪問mesos-matser,可以看到已有一臺slave上線,且可看到詳細信息。

技術分享圖片

技術分享圖片

配置多臺Mesos-Master+Slave+zookeeper+marathon

1、配置多臺Mesos-master

  • 配置多臺master方式與單臺方式相同,唯一區別在於修改域名解析文件/etc/hosts
  • 三臺mesos-master配置完全相同,只是最後啟動時需要指定本身IP這點不同

vim /etc/hosts

192.168.144.114 master
192.168.144.117 master1
192.168.144.118 master2
192.168.144.119 slave1
192.168.144.120 slave2
  • 使用hostnamectl將主機名修改成master、master1和master2
  • mesos-master配置完成暫時不要啟動,當後面配置完、啟動zookeeper後再啟動

2、配置多臺Mesos-slave

  • 配置方式如同單臺slave配置方式,只有/etc/hosts文件需要添加,並且也需要安裝docker,並且啟動服務。

vim /etc/hosts

192.168.144.114 master
192.168.144.117 master1
192.168.144.118 master2
192.168.144.119 slave1
192.168.144.120 slave2

3、在所有master上安裝zookeeper

  • 每一臺master上的zookeeper配置文件都相同,配置文件修改也相同,需要指定有哪一些master安裝了zookeeper

tar zxvf zookeeper-3.4.13.tar.gz -C /home/q/

cd zookeeper-3.4.13/

mv conf/zoo_sample.cfg conf/zoo.cfg 註意sample.cfg與zoo.cfg只能存在一個,只能識別一個cfg

  • 在其中一臺master上操作

cd /home/q/zookeeper-3.4.13/conf

vim zoo.cfg

dataDir=/home/q/zookeeper-3.4.6/data            //修改數據存放目錄
dataLogDir=/home/q/zookeeper-3.4.6/datalog      //日誌文件位置
server.1=192.168.144.114:2888:3888              //server後面跟上區分每一臺master標識
server.2=192.168.144.117:2888:3888
server.3=192.168.144.118:2888:3888
  • 將修改好的配置文件傳輸給其他master,切記先將原有sample配置文件重命名或者刪除

scp zoo.cfg 192.168.144.117:/home/q/zookeeper-3.4.13/conf/
scp zoo.cfg 192.168.144.118:/home/q/zookeeper-3.4.13/conf/

  • 為每臺master設置標識
//在master主機上操作(/home/q/zookeeper-3.4.13/中)
mkdir data datalog 
echo 1 > data/myid
cat data/myid

//在master1主機上操作(/home/q/zookeeper-3.4.13/中)
mkdir data datalog 
echo 2 > data/myid
cat data/myid 

//在master2主機上操作(/home/q/zookeeper-3.4.13/中)
mkdir data datalog 
echo 3 > data/myid
cat data/myid
  • 啟動所有master上的zookeeper
cd /home/q/zookeeper-3.4.13/
//在master主機上啟動服務
./bin/zkServer.sh start conf/zoo.cfg 

//在master1主機上啟動服務
./bin/zkServer.sh start conf/zoo.cfg

//在master2主機上啟動服務
./bin/zkServer.sh start conf/zoo.cfg

//查看leader
./bin/zkServer.sh status
  • 啟動所有master和slave上的mesos服務
//master
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.144.114:2181/mesos --quorum=2   //想要在後臺運行後面加上&>/dev/null &即可

//master1
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.144.117:2181/mesos --quorum=2

//master2
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.144.118:2181/mesos --quorum=2

-----------------------
//在slave1上
mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.144.114:2181,192.168.144.117:2181,192.168.144.118:2181/mesos --no-hostname_lookup --ip=0.0.0.0

//在slave2上
mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.144.114:2181,192.168.144.117:2181,192.168.144.118:2181/mesos --no-hostname_lookup --ip=0.0.0.0

4、在所有master上安裝marathon

  • 下載marathon軟件壓縮包

wget http://downloads.mesosphere.com/marathon/v0.15.2/marathon-0.15.2.tgz

tar zxvf marathon-0.15.2.tgz -C /home/q/

  • marathon軟件包不需要安裝,解壓後即可使用,所有master上安裝好marathon後,每臺啟動方式如下
  • 每臺mastermarathon啟動hostname後面跟上自己ip以及zookeeper區域所有服務器ip
./bin/start --hostname 192.168.144.114 --master zk://192.168.144.114:2181,192.168.144.117:2181,192.168.144.118:2181/mesos --http_address 0.0.0.0

./bin/start --hostname 192.168.144.117 --master zk://192.168.144.114:2181,192.168.144.117:2181,192.168.144.118:2181/mesos --http_address 0.0.0.0

./bin/start --hostname 192.168.144.118 --master zk://192.168.144.114:2181,192.168.144.117:2181,192.168.144.118:2181/mesos --http_address 0.0.0.0
  • 測試
    http://192.168.144.114:8080/

  • 建立test任務

查看任務執行情況。

技術分享圖片

技術分享圖片

使用mesos與marathon創建docker集群

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
}
  • 在其中一臺master上新建終端執行

curl -X POST -H "Content-type:application/json" http://192.168.144.114:8080/v2/apps [email protected]

  • 在任務發布指定的slave上使用命令 ps aux | grep docker 查看到nginx正在下載
root       3668  0.0  0.6 121912 12872 pts/0    Sl+  10:20   0:00 /usr/bin/docker-current -H unix:///var/run/docker.sock pull nginx:latest
  • 此時也可去master上的marathon網站去查看任務是已下發執行。

技術分享圖片

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/nginx     latest              c82521676580        3 weeks ago         109 MB

docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
9940ac858a3b        nginx               "nginx -g ‘daemon ..."   3 minutes ago       Up 3 minutes                            mesos-0d21cffd-8a12-450d-b6ff-4d4befcdaad0-S1.89e29728-37cb-4ea3-9518-2d9741ba7618

測試其中一臺slave

http://192.168.144.119訪問到Nginx首頁即實驗完成。

【Docker篇四】Mesos+Zookeeper+Marathon+Docker實戰實驗