由于Swarm和Mesos的集成刚处于起步阶段,现在网上没有一篇文章来详细的介绍基于Mesos来部署Swarm集群以及介绍相关的配置参数。Swarm社区的官方文档,也只给出了简单的说明,对于不了解Mesos的开发者来说,按照那个说明来部署也绝非易事。文本是基于作者长期贡献Mesos和Swarm社区的开发经验,站在一个开发者的角度,来带领大家实战部署基于Mesos的Swarm集群。来自IBM Platform软件工程师王勇桥将带来“Swarm和Mesos集成指南”系列文章,带大家了解Swarm和Mesos集成的架构和原理,Swarm基于Mesos集群的实战部署和配置,以及基于IBM Platform自身在资源调度、分布式计算领域方面的实践经验,向大家介绍IBM Platform对Mesos在资源调度方面的策略优化,以及以Swarm为例向大家介绍这些优化将对Mesos上层的framework和企业级用户带来哪些增强性的体验。本文为第二篇:实战部署。
搭建基于Mesos的Swarm集群
部署架构
在本文作者将用三台安装了Ubuntu 14.04的机器来给大家演示如何部署基于Mesos的Swarm集群。
另外本文是站在一个开发者的角度来部署Swarm和Mesos的集群,以下步骤会通过build Swarm和Mesos源码的方式来搭建基于此集群,因为有三个节点,为了在修改了源码之后,使修改可以快速便捷的在所有的机器上生效,我们将在master.wyq.com这个机器上假设NFS服务和build Mesos和Swarm,然后将build的binary mount到其他的计算节点上。这样在修改了Mesos或者Swarm的代码之后,只需要在master.wyq.com build然后只需要在另外两台计算节点上重启相应的服务就可以生效。
安装步骤
1.准备环境
准备三台Ubuntu 14.40的环境(物理机和虚拟机都可以),配置DNS或者/etc/hosts文件来保证相互通过机器名可以访问,并且关闭防火墙。
2.在两台计算节点上安装Docker
登陆computer1.wyq.com和computer2.wyq.com执行以下命令安装Docker:
# apt-get update # apt-get install wget # wget -qO- https://get.docker.com/ | sh
默认情况下,Docker只允许通过unix socket来访问Docker Engine,所以根据以上理论的分析,如果Swarm Manager节点master.wyq.com想要访问计算节点上的Docker Engine,我们必须修改Swarm默认配置来开启一个TCP的端口供外部访问:
编辑/etc/default/docker文件,修改DOCKER_OPTS参数如下:
# vim /etc/default/docker DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock" # service docker restart
3.在master节点安装Golang和godep
由于master.wyq.com上需要安装Swarm Manager服务,Swarm 是由GO语言编写,所以需要在master.wyq.com上安装Golang来支持Swarm Manager的运行。
注: 从Swarm 0.4版本开始,它支持Golang的最低版本为1.4,本文使用最新的版本:
/# wget https://storage.googleapis.com/golang/go1.5.3.linux-amd64.tar.gz
/# tar -C /usr/local -xzf go1.5.3.linux-amd64.tar.gz
Swarm像大多数GO语言的项目一样,使用godep来管理包的依赖,由于Swarm官方没有提供Swarm的安装包,所以需要我们自己编译,所以在编译之前我们需要安装godep来帮助下载Swarm的依赖。
首先由于godep的一些依赖使用了mercurial, 先安装mercurial
# apt-get install -y mercurial
安装godep:
# mkdir $HOME/go-tools && export GOPATH=$HOME/go-tools # go get github.com/tools/godep # ll /root/go-tools/bin/ -rwxr-xr-x 1 root root 10327064 Jan 22 16:47 godep*
在安装完Golang和godep之后,编辑/etc/profile,添加环境变量:
export PATH=$PATH:/usr/local/go/bin:$HOME/go-tools/bin
安装验证:
# go version go version go1.5.3 linux/amd64 # godep version godep v51 (linux/amd64/go1.5.3)
4.在master节点上build Mesos
Mesos官方目前没有提供Mesos的安装包,需要自己下载源码包进行build。本文以Mesos最新的版本为例进行安装。 登陆master节点master.wyq.com执行以下步骤进行build:
首先需要安装build Mesos 必须的第三方软件包:
# apt-get update # apt-get install -y openjdk-7-jdk # apt-get install -y autoconf libtool # apt-get -y install build-essential python-dev python-boto libcurl4-nss-dev libsasl2-dev maven libapr1-dev libsvn-dev
下载源码包进行编译安装:
# wget http://mirror.bit.edu.cn/apache/mesos/0.26.0/mesos-0.26.0.tar.gz # tar -xzvf mesos-0.26.0.tar.gz # cd mesos-0.26.0 # ./bootstrap # mkdir build && cd build # ../configure # make # make install DESTDIR=/opt/apache/mesos # ll /opt/apache/mesos/usr/local/sbin/ total 2632 drwxr-xr-x 2 root root 4096 Jan 28 16:41 ./ drwxr-xr-x 9 root root 4096 Jan 15 20:02 ../ -rwxr-xr-x 1 root root 406 Jan 28 16:41 mesos-daemon.sh* -rwxr-xr-x 1 root root 1698505 Jan 28 16:41 mesos-master* -rwxr-xr-x 1 root root 954864 Jan 28 16:41 mesos-slave* -rwxr-xr-x 1 root root 888 Jan 28 16:41 mesos-start-cluster.sh* -rwxr-xr-x 1 root root 1366 Jan 28 16:41 mesos-start-masters.sh* -rwxr-xr-x 1 root root 1349 Jan 28 16:41 mesos-start-slaves.sh* -rwxr-xr-x 1 root root 635 Jan 28 16:41 mesos-stop-cluster.sh* -rwxr-xr-x 1 root root 1200 Jan 28 16:41 mesos-stop-masters.sh* -rwxr-xr-x 1 root root 1185 Jan 28 16:41 mesos-stop-slaves.sh*
配置:
编辑/opt/apache/mesos/usr/local/sbin/mesos-daemon.sh文件:
•修改prefix变量的值为:/opt/apache/mesos/usr/local
•在prefix的下一行添加行:
export LD_LIBRARY_PATH=${prefix}/lib export MESOS_LAUNCHER_DIR=${prefix}/libexec/mesos export MESOS_EXECUTOR_ENVIRONMENT_VARIABLES="{"PATH": "${PATH}","LD_LIBRARY_PATH": "${LD_LIBRARY_PATH}"}"
5.在master节点上编译Swarm
下载源码包:
# mkdir /opt/docker/swarm && cd /opt/docker/swarm # wget https://github.com/docker/swarm/archive/v1.0.1.tar.gz
构建build目录结构:
# mkdir -p $PWD/src/github.com/docker # tar -C src/github.com/docker -xzf v1.0.1.tar.gz # mv src/github.com/docker/swarm-1.0.1 src/github.com/docker/swarm # export GOPATH=$PWD # cd src/github.com/docker/swarm/
编译Swarm binary:
# godep go install . # $PWD/bin total 22680 -rwxr-xr-x 1 root root 23215632 Feb 1 19:25 swarm*
注: 对于Swarm的1.0.1版本,有一个bug会导致下载依赖失败,我已经在Swarm社区log,如果你想使用这个版本,请参https://github.com/docker/swarm/issues/1720 解决。
6.在master节点上安装NFS
为了节省安装时间,我们不需要在三台机器上分别build Mesos,可以直接将build的安装目录拷贝到其他两台机器上即可。但是特别是对于一个Mesos贡献者来说,我们需要定期的和社区最新的代码进行同步和重新build,所以为了避免每次重复的拷贝,我们采用共享文件的方式。
登陆master.wyq.com执行如下命令安装配置NFS:
# apt-get install -y nfs-common nfs-kernel-server # vim /etc/exports /opt/apache/mesos *(rw,sync,no_root_squash,no_subtree_check) # /etc/init.d/nfs-kernel-server start # showmount -e localhost Export list for localhost: /opt/apache/mesos *
7.配置两台计算节点
登陆computer1.wyq.com和computer2.wyq.com,执行如下命令:
在两台计算节点上安装运行Mesos需要的安装包:
# apt-get update # apt-get install -y openjdk-7-jdk # apt-get install -y autoconf libtool # apt-get -y install build-essential python-dev python-boto libcurl4-nss-dev libsasl2-dev maven libapr1-dev libsvn-dev
Mount Mesos安装目录:
# mkdir /opt/apache/mesos # mount -t nfs -o nolock maser.wyq.com:/opt/apache/mesos /opt/apache/mesos # ll /opt/apache/mesos/usr/local/sbin/ total 2632 drwxr-xr-x 2 root root 4096 Jan 28 16:41 ./ drwxr-xr-x 9 root root 4096 Jan 15 20:02 ../ -rwxr-xr-x 1 root root 406 Jan 28 16:41 mesos-daemon.sh* -rwxr-xr-x 1 root root 1698505 Jan 28 16:41 mesos-master* -rwxr-xr-x 1 root root 954864 Jan 28 16:41 mesos-slave* -rwxr-xr-x 1 root root 888 Jan 28 16:41 mesos-start-cluster.sh* -rwxr-xr-x 1 root root 1366 Jan 28 16:41 mesos-start-masters.sh* -rwxr-xr-x 1 root root 1349 Jan 28 16:41 mesos-start-slaves.sh* -rwxr-xr-x 1 root root 635 Jan 28 16:41 mesos-stop-cluster.sh* -rwxr-xr-x 1 root root 1200 Jan 28 16:41 mesos-stop-masters.sh* -rwxr-xr-x 1 root root 1185 Jan 28 16:41 mesos-stop-slaves.sh*
8.启动服务
登陆master.wyq.com启动Mesos master和Swarm manager:
# cd /opt/apache/mesos/usr/local/sbin/ # mkdir /opt/mesoslog # ./mesos-daemon.sh mesos-master --work_dir=/var/lib/mesos --log_dir=/opt/mesoslog # cd /opt/docker/swarm/bin # ./swarm manage -c mesos-experimental --cluster-opt mesos.address=9.111.255.10 --cluster-opt mesos.port=3375 gradyhost1.eng.platformlab.ibm.com:5050
登陆computer1.wyq.com和computer2.wyq.com启动Mesos agent:
# cd /opt/apache/mesos/usr/local/sbin/ # mkdir /opt/mesoslog # ./mesos-daemon.sh mesos-slave --master=gradyhost1.eng.platformlab.ibm.com:5050 --log_dir=/opt/mesoslog --containerizers=mesos,docker
9.验证:
打开Mesos portal: http://master.wyq.com:5050 查看Slaves,Frameworks和offers的信息。
在任意一个计算节点上查看docker info:
# docker -H manager.wyq.com:2375 info Containers: 0 Images: 1 Role: primary Strategy: spread Filters: health, port, dependency, affinity, constraint Offers: 2 Offer: 98085d1e-4516-4c4c-b6a3-4f8cde32c980-O19 └ cpus: 2 └ mem: 2.851 GiB └ disk: 29.79 GiB └ ports: 31000-32000 Offer: 98085d1e-4516-4c4c-b6a3-4f8cde32c980-O20 └ cpus: 2 └ mem: 2.851 GiB └ disk: 29.79 GiB └ ports: 31000-32000 CPUs: 4 Total Memory: 5.701 GiB Name: manager.wyq.com
执行docker run, 创建hello-world container:
# docker -H manager.wyq.com:2375 run --cpu-shares 1 hello-world Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
- The Docker client contacted the Docker daemon.
- The Docker daemon pulled the “hello-world” image from the Docker Hub.
- The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading. - The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
For more examples and ideas, visit:
https://docs.docker.com/userguide/
作者简介:
王勇桥,80后的IT攻城狮,供职于IBM多年,主要从事云计算领域相关的工作,Mesos和Swarm社区的贡献者。平时喜欢在业余时间研究DevOps相关的应用, 对自动化部署,持续集成,资源调度有较深的研究。