/ 中存储网

王勇桥:Swarm和Mesos集成-实战部署

2016-03-05 09:50:28 来源:中存储网

由于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:

  1. The Docker client contacted the Docker daemon.
  2. The Docker daemon pulled the “hello-world” image from the Docker Hub.
  3. The Docker daemon created a new container from that image which runs the 
    executable that produces the output you are currently reading.
  4. 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相关的应用, 对自动化部署,持续集成,资源调度有较深的研究。