最近公有云比较火,公司也在尝试使用多个公有云,IDC也仍然在使用,这样给运维工作带来了很多麻烦。我想对IDC、公有云资源进行统一管理,发现Mesos比较适合干这事。先整一个搞清楚它能做什么。
我准备了三个节点来构建一个MINI平台,OS是Centos6.6, 规划架构如下:
node1:mesos-master,marathon,zookeeper
node2:mesos-slave,docker
node3:haproxy
第一步,在node1和node2上安装mesos
1.安装mesos支持环境
计划安装mesos-0.22.1, mesos 0.21.0以后的版本需求C++11,GCC版本必须大于4.8,需要安装devtoolset-2.
#下载devtoolset-2 repo文件
$ sudo wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo
#导入 CERN GPG key.
$ sudo rpm --import http://linuxsoft.cern.ch/cern/centos/7/os/x86_64/RPM-GPG-KEY-cern
# 下载 Apache Maven repo file.
$ sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
# 'Mesos > 0.21.0' 要求 'subversion > 1.8' devel 包,新增WANdisco SVN repo文件“/etc/yum.repos.d/wandisco-svn.repo”,并写入如下内容。
[WANdiscoSVN]
name=WANdisco SVN Repo 1.8
enabled=1
baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/$basearch/
gpgcheck=1
gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
# 安装开发工具包.
$ sudo yum groupinstall -y "Development Tools"
如果安装过程中出现以下错误,说明出现在包冲突,这个有点麻烦。
#Error: Package: rpm-build-4.8.0-37.el6.x86_64 (c6-media)
# Requires: rpm = 4.8.0-37.el6
# Installed: rpm-4.8.0-38.el6_6.x86_64 (@Updates/$releasever)
# rpm = 4.8.0-38.el6_6
# Available: rpm-4.8.0-37.el6.x86_64 (c6-media)
# rpm = 4.8.0-37.el6
直接下载需要的RPM包,并安装就行了:)
$ wget ftp://rpmfind.net/linux/centos/6.6/updates/x86_64/Packages/rpm-build-4.8.0-38.el6_6.x86_64.rpm
$ sudo yum localinstall -y rpm-build-4.8.0-38.el6_6.x86_64.rpm
# 安装 'devtoolset-2-toolchain' ,这个包里面包括了GCC 4.8.2和相关的一些软件包。
$ sudo yum install -y devtoolset-2-toolchain
你可能会遇到如下错误提示,同样是包冲突的问题。
####Error: Package: policycoreutils-python-2.0.83-19.47.el6.x86_64 (c6-media)
# Requires: policycoreutils = 2.0.83-19.47.el6
# Installed: policycoreutils-2.0.83-19.47.el6_6.1.x86_64 (@Updates/$releasever)
# policycoreutils = 2.0.83-19.47.el6_6.1
# Available: policycoreutils-2.0.83-19.47.el6.x86_64 (c6-media)
# policycoreutils = 2.0.83-19.47.el6
这次应该轻车熟路了,下载一下装上就行。
$ wget ftp://rpmfind.net/linux/centos/6.6/updates/x86_64/Packages/policycoreutils-python-2.0.83-19.47.el6_6.1.x86_64.rpm
$ sudo yum localinstall -y policycoreutils-python-2.0.83-19.47.el6_6.1.x86_64.rpm
还有这些包也是mesos需要的。
$ sudo yum install -y apache-maven python-devel java-1.7.0-openjdk-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel subversion-devel apr-util-devel
很不幸,我有遇到了包冲突,还是用同样的方法去解决。
####Error: Protected multilib versions: nss-util-3.16.1-3.el6.i686 != nss-util-3.16.2.3-2.el6_6.x86_64
####Error: Protected multilib versions: nss-3.16.1-14.el6.i686 != nss-3.16.2.3-3.el6_6.x86_64
####Error: Protected multilib versions: libcurl-7.19.7-37.el6_5.3.i686 != libcurl-7.19.7-40.el6_6.3.x86_64
####Error: Protected multilib versions: nss-softokn-freebl-3.14.3-17.el6.i686 != nss-softokn-freebl-3.14.3-18.el6_6.x86_64
####Error: Protected multilib versions: openssl-1.0.1e-30.el6.i686 != openssl-1.0.1e-30.el6_6.4.x86_64
####Error: Protected multilib versions: nss-softokn-3.14.3-17.el6.i686 != nss-softokn-3.14.3-18.el6_6.x86_64
下载并安装冲突包。
$ wget ftp://195.220.108.108/linux/centos/6.6/updates/x86_64/Packages/libcurl-devel-7.19.7-40.el6_6.3.x86_64.rpm
$ sudo yum localinstall -y libcurl-devel-7.19.7-40.el6_6.3.x86_64.rpm
$ wget ftp://195.220.108.108/linux/centos/6.6/updates/x86_64/Packages/openssl-devel-1.0.1e-30.el6_6.4.x86_64.rpm
$ sudo yum localinstall -y openssl-devel-1.0.1e-30.el6_6.4.x86_64.rpm
到些该装的都装完了,还有最后一步就是在shell中激活devtoolset-2.
$ scl enable devtoolset-2 bash
$ g++ --version
如果GCC版本大于4.8,恭喜你,mesos运行环境搞定!!
2.安装mesos
从APACHE网站下载mesos-0.22.1,并解压。
$ wget http://www.apache.org/dist/mesos/0.22.1/mesos-0.22.1.tar.gz
$ tar -zxf mesos-0.22.1.tar.gz
编译并进行安装
$ mkdir build
$ cd build
$ ../configure --prefix=/usr/local/mesos
$ make
$ make install
全是坑啊,安装过程中报以下错误,原因是code.google.com被天朝屏蔽了,真TM想骂人。
#### Download error on http://code.google.com/p/google-apputils-python: [Errno 101] Network is unreachable
还有其它网站上有下载。
$ wget https://pypi.python.org/packages/source/p/python-gflags/python-gflags-2.0.tar.gz
$ python setup.py install
$ wget https://pypi.python.org/packages/source/g/google-apputils/google-apputils-0.4.0.tar.gz
$ python setup.py install
装完后再次make install,顺利搞定。
第二步,在node1上安装Zookeeper
下载zookeeper包,并启动服务。
$ wget http://apache.fayea.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
$ tar xzf zookeeper-3.4.6.tar.gz
$ cd zookeeper-3.4.6
$ cp conf/zoo_sample.cfg conf/zoo.cfg
$ bin/zkServer.sh start
第三步,在node1上启动mesos master
$ mesos-master --ip=master-ip --work_dir=/var/lib/mesos --zk=zk://master-ip:2181/mesos --quorum=1 > /dev/null 2>&1 &
在浏览器中输入URL http://master-ip:5050访问master管理页面。
第四步,在node1上安装marathon
从mesosphere网站下载marathon包,并启动marathon服务,注意如果hostname无法dns解析,请在/etc/hosts中加上。
$ wget http://downloads.mesosphere.com/marathon/v0.9.0/marathon-0.9.0.tgz
$ tar xzf marathon-0.9.0.tgz
$ MESOS_NATIVE_JAVA_LIBRARY=/usr/local/mesos/lib/libmesos.so ./bin/start --master zk://master-ip:2181/mesos --zk zk://master-ip:2181/marathon > /dev/null 2>&1 &
在浏览器中输入URL http://master-ip:8080访问marathon 管理页面。
第五步,在node2上安装docker, 并启动docker服务
$ yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ yum install -y docker-io
$ service docker start
$ chkconfig docker on
第六步,在node2上启动mesos slave服务
$ mesos-slave --master=zk://master-ip:2181/mesos --ip=slave-ip --containerizers=docker,mesos --executor_registration_timeout=5mins > /dev/null 2>&1 &
第七步,通过marathon分配计算资源
通过marathon的REST API 调用来申请创建docker容器。先用一个json文件来说明申请的计算资源 mara-nginx.json内容如下:
{
"id":"run-a-nginx-cluster-v111",
"cpus":0.3,
"mem":128.0,
"instances":2,
"container":{
"type":"DOCKER",
"docker":{
"image":"nginx",
"parameters":[
{ "key":"detach","value":"true" }],
"network":"BRIDGE",
"portMappings":[
{ "containerPort":80,"servicePort":80,"protocol":"tcp"}]
},
"healthChecks":[
{
"protocol": "HTTP",
"portIndex":0,
"path":"/",
"gracePeriodSeconds":5,
"intervalSeconds":20,
"maxConsecutiveFailures":3
}
]
}
}
通过curl直接调用REST API. mesos将在slave机器上启动docker容器运行nginx服务。如果需要对计算资源进行调整,如果更改实例个数,只要在json文件中修改,并调用PUT API.
$curl -X POST -H "Content-Type:application/json" [email protected] http://master-ip:8080/v2/apps
第八步,在node3上安装haproxy
haproxy帮助我们对外发布服务,用YUM安装
$ yum install -y haproxy
通过 marathon脚本生成haproxy.conf文件
$ marathon/bin/haproxy-marathon-bridge http://master-ip:8080 > /etc/haproxy/haproxy.conf
启动haproxy服务
$ service haproxy start