Marathon+Mesos+Docker实战
- Apache Mesos概述
Apache Mesos是一款基于多资源调度的开源集群管理套件,使容错和分布式系统更加容易使用实现,采用Master/Slave结构简化设计,将Master尽可能轻量级,进保存了Mesos Slave的状态信息
常见集群管理工具
工具 | 特点 | 优势 |
---|---|---|
Apache Mesos | 需要独立部署mesos-slave进程;依赖framework的功能;可管理docker容器;成本较高 | 应为经过许多互联网公司的大规模实践,稳定性具有保障 |
Docker Swarm | Docker 官方群集工具,需要Docker deamon 启用tcp端口学习;Swarm的命令兼容Docker;学习成本非常低 | 公有云环境Machine 和 Swarm 搭配使用效率更高 |
Google Kubernetes | 完全DOcker化的管理工具,功能迭代非常快;群集管理能力比mesos稍差 | 功能模块集成度高 |
Apache Mesos工作原理
请看下图:
Apache Mesos配置实战
实验环境:
实验环境 | IP地址 | 内核版本3.10以上 |
---|---|---|
master | 192.168.179.151 | 3.10.0-693.el7.x86_64 |
master1 | 192.168.179.158 | 3.10.0-693.el7.x86_64 |
master2 | 192.168.179.159 | 3.10.0-693.el7.x86_64 |
slave | 192.168.179.155 | 3.10.0-693.el7.x86_64 |
slave1 | 192.168.179.157 | 3.10.0-693.el7.x86_64 |
安装Apache Mesos
1:配置Java环境
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
mv jdk1.8.0_91/ java
#在/etc/profile配置环境变量
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
2:安装相关环境
(1)安装开发开发工具
//安装开发工具
yum groupinstall -y "Development Tools"
#有时候安装开发工具的时候会出现没有相关的软件包这时候要根据报错提示先安装相关依赖包
(2)添加Apache-maven源
//添加apache-maven源
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
(3)安装相关依赖包
//添加依赖包
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
(4)配置WANdiscoSVN网络源
//配置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
(3)配置Mesos环境变量
vim /etc/profile
export MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos.so
export MESOS_NATIVE_LIBRARY=/usr/local/lib/libmesos.so
source /etc/profile
(4)构建Mesos
这里使用源代码方式编译安装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
../configure
make //等待时间长(在线状态)
make check
make install
配置多台mesos-master
#修改主机名
hostnamectl set-hostname master
#在hosts文件里面写入三台master 两台slave的主机IP地址
vim /etc/hosts
192.168.179.151 master
192.168.179.158 master1
192.168.179.159 master2
192.168.179.155 slave
192.168.179.157 slave1
#可以直接用scp 远程复制其他四台服务器,另外两台可以在master上复制虚拟机
#建立软连接
ln -sf /root/mesos-0.25.0/build/bin/mesos-slave.sh /usr/sbin/mesos-slave
#安装docker
yum install docker -y
systemctl start docker.servicev #运行
systemctl enable docker.service #开机自启动
(1)安装Zookeeper
在三个Mesos-master节点上安装Zookeeper
tar zxvf zookeeper-3.4.6.tar.gz -C /home/q/
cd zookeeper-3.4.6/
mv conf/zoo_sample.cfg conf/zoo.cfg
cd /home/q/zookeeper-3.4.6/conf
vim zoo.cfg #修改zoo.cfg配置文件
dataDir=/home/q/zookeeper-3.4.6/data //修改位置
dataLogDir=/home/q/zookeeper-3.4.6/datalog
server.1=192.168.179.151:2888:3888
server.2=192.168.179.158:2888:3888
server.3=192.168.179.159:2888:3888
//在master主机上操作(/opt/home/zookeeper-3.4.6/中)
mkdir data datalog
echo 1 > data/myid
cat data/myid
#按照zoo.cfg配置文件的swerver1、2、3修改每台master的myid
//在master1主机上操作(/opt/home/zookeeper-3.4.6/中)
mkdir data datalog
echo 2 > data/myid
cat data/myid
//在master2主机上操作(/opt/home/zookeeper-3.4.6/中)
mkdir data datalog
echo 3 > data/myid
cat data/myid
#启动
//在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
查看zookeeper状态
在zookeeper-3.4.6 低下用./bin/zkServer.sh status
启动master服务
先启动leader服务器上的zookeeper,这是采用双选举机制先zookeeper选举出个leader然后mesos第一台启动默认就是leader
//master2
mesos-master --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.179.151:2181/mesos --quorum=2 &>/dev/null &
//master
mesos-master --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.179.158:2181/mesos --quorum=2 &>/dev/null &
//master1
mesos-master --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.179.159:2181/mesos --quorum=2 &>/dev/null &
启动mesos-slave
slave
mesos-slave --containerizers="mesos,docker" --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --master=zk://192.168.179.151:2181,192.168.179.158:2181,192.168.179.159:2181/mesos --no-hostname_lookup --ip=0.0.0.0 &>/dev/null &
slave1
mesos-slave --containerizers="mesos,docker" --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --master=zk://192.168.179.151:2181,192.168.179.158:2181,192.168.179.159:2181/mesos --no-hostname_lookup --ip=0.0.0.0 &>/dev/null &
slave2
mesos-slave --containerizers="mesos,docker" --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --master=zk://192.168.179.151:2181,192.168.179.158:2181,192.168.179.159:2181/mesos --no-hostname_lookup --ip=0.0.0.0 &>/dev/null &
部署Marathon
#用wget下载Marathon安装包
wget http://downloads.mesosphere.com/marathon/v0.15.2/marathon-0.15.2.tgz
#解压到/opt/hone目录底下
tar zxvf marathon-0.15.2.tgz -C /opt/home
#开启服务指定zk地址池
#在/opt/home/marathon-0.15.2/解压目录下开启
master
./bin/start --hostname 192.168.179.158 --master zk://192.168.175.132:2181,192.168.179.159:2181,192.168.179.151:2181/mesos --http_address 0.0.0.0 &>/dev/null &
master1
./bin/start --hostname 192.168.179.15 --master zk://192.168.175.132:2181,192.168.179.158:2181,192.168.179.151:2181/mesos --http_address 0.0.0.0 &>/dev/null &
master2
./bin/start --hostname 192.168.179.151 --master zk://192.168.175.132:2181,192.168.179.159:2181,192.168.179.158:2181/mesos --http_address 0.0.0.0 &>/dev/null &
建立test任务
查看master分配任务
执行过后在下面这个目录下
/opt/home/mesos/data/slaves/7cc2e8e7-ad03-46a6-a38d-ae1b92c78319-S0/frameworks/d82f2603-f357-4025-9574-7c511c0f435e-0000/executors
//标准错误和标准输出信息
cd test.f99a7592-a099-11e8-a6b5-52540011572d/runs/latest
//显示
stderr stdout
//查看输出字符串
cat stdout
显示以下内容
Registered executor on 192.168.175.152
Starting task test.f99a7592-a099-11e8-a6b5-52540011572d
sh -c 'echo "hello world"'
hello world
Forked command at 3493
Command exited with status 0 (pid: 3493)
以下是slave操作
//在slave1中操作
cd /root
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网站有新添加任务
curl -X POST -H "Content-type:application/json" http://192.168.175.132:8080/v2/apps [email protected]
------------再启动一台slave2-------------------------
hostnamectl set-hostname slave2
vim /etc/hosts (所有主机同步)
192.168.175.132 master
192.168.175.150 master1
192.168.175.151 master2
192.168.175.152 slave
192.168.175.153 slave2
ln -sf /root/mesos-0.25.0/build/bin/mesos-slave.sh /usr/sbin/mesos-slave
yum install docker -y
systemctl start docker.service
systemctl enable docker.service
//启动完成会看到两台slave上线,任务在两台slave中随机发布
mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.175.132:2181,192.168.175.150:2181,192.168.175.151:2181/mesos --no-hostname_lookup --ip=0.0.0.0
-----------------------使用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
}
curl -X POST -H "Content-type:application/json" http://192.168.175.132: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
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
测试
http://192.168.175.153/