如何利用OpenVSwitch在多台主机上部署Docker

本篇内容主要讲解“如何利用OpenVSwitch在多台主机上部署Docker”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何利用OpenVSwitch在多台主机上部署Docker”吧!

成都创新互联是少有的成都做网站、成都网站建设、营销型企业网站、微信小程序开发、手机APP,开发、制作、设计、外链、推广优化一站式服务网络公司,于2013年成立,坚持透明化,价格低,无套路经营理念。让网页惊喜每一位访客多年来深受用户好评

安装
docker

无需多言,遵循提供的指南就行。稍后我们将深入其配置,以便运行于服务器上的不同docker服务可相互协作。
openvswitch

糟糕的是,默认仓库里openvswitch安装包不可用(或过期了),我们需要自己构建.deb文件(一次),然后分发给不同主机。为了保持生产机的整洁,可另外找台小主机来安装开发包,并构建安装包。

执行下列命令来构建安装包(新版请按要求修改):

#获取最新存档
wget http://openvswitch.org/releases/openvswitch-2.3.1.tar.gz
tar xzvf openvswitch-2.3.1.tar.gz
cd openvswitch-2.3.1

#安装依赖
sudo apt-get install -y build-essential fakeroot debhelper \
          autoconf automake bzip2 libssl-dev \
          openssl graphviz python-all procps \
          python-qt4 python-zopeinterface \
          python-twisted-conch libtool

# 构建(不使用并行检查)
deb_build_options='parallel=8 nocheck' fakeroot debian/rules binary

# 得到最新deb文件并复制到某处
cd ..
ls -al *deb


现在你有了新的.deb安装包,接下来将其推送并安装到所有主机上。

# 复制包到各主机并ssh登录
scp -r *deb user@remote_host:~/.
ssh user@remote_host

# 安装一些依赖(后面需要)并安装包
sudo apt-get install -y bridge-utils
sudo dpkg -i openvswitch-common_2.3.1-1_amd64.deb \
     openvswitch-switch_2.3.1-1_amd64.deb

 
配置
网络

你可以使用openvswitch提供的不同命令行工具来构建网状网络(比如ovs-vsctl),不过ubuntu提供了一个辅助工具让你可以通过/etc/network/interfaces文件定义网络。

假定三台主机:1.1.1.1、2.2.2.2和3.3.3.3,可以通过上述ip相互ping通,它们是在公网或内网上并不重要。host1的/etc/network/interfaces大概如下。

...
# eth0、eth1和lo配置
...

# auto:为了有效地在主机启动时启动它
# br0=br0:防止在`ifquery --list`时被找到
auto br0=br0
allow-ovs br0
iface br0 inet manual
ovs_type ovsbridge
ovs_ports gre1 gre2
ovs_extra set bridge ${iface} stp_enable=true
mtu 1462

# 没有auto,这是ovs的一个额外配置
# 两台主机的gre名字必须相符
allow-br0 gre1
iface gre1 inet manual
ovs_type ovsport
ovs_bridge br0
ovs_extra set interface ${iface} type=gre options:remote_ip=2.2.2.2

allow-br0 gre2
iface gre2 inet manual
ovs_type ovsport
ovs_bridge br0
ovs_extra set interface ${iface} type=gre options:remote_ip=3.3.3.3

# auto:启动时创建
# 定义docker要使用的docker0,并(在可用时)连接到到openvswitch创建的br0网桥上
# 每台主机需要使用不同的ip地址(不要相互冲突!)
auto docker0=docker0
iface docker0 inet static
address 172.17.42.1
network 172.17.0.0
netmask 255.255.0.0
bridge_ports br0
mtu 1462


在其它主机上要对这个配置上做些调整:remote_ip的ip地址要相互配对。

几点说明:

  •     生成树协议(spanning tree protocol):如果应用该配置,将在3台服务器中创建一个网络回路,这可不行。给br0网桥添加stp_enable=true将确保一些gre隧道被切断。同时确保网状网络的冗余,允许网络在其中一台主机下线时恢复。

  •     mtu:这是一项关键设定!没有这项,你可能获得一些意外“惊喜”:网络看起来工作正常(比如可以ping),但无法支持大数据包(比如bw测试中的iperf、大数据量请求或简单的文件复制)。注意,gre隧道需要封装多种协议:

  •         以太网:14字节——我们说的是网桥间的第2层;

  •         ipv4:20字节——容器/主机间通讯;

  •         gre:4字节——因为,嗯,这是个gre隧道;

  •         也就是物理网卡mtu减去38字节,结果是1462(基于常规的1500 mtu网卡)。

  •     在auto定义中使用“=”:对于具有固定ip的服务器这不是必需的,但有些云服务商(这里就不说是谁了……digital ocean(译者:软广再次乱入))使用了一个依靠ifquery --list --allow auto的init服务(/etc/init/cloud-init-container.conf)。不加上“=”号将包含openvswitch网卡,并延迟整个启动过程直到init脚本失败并超时。

  •     docker0网桥:每台服务器都需要自己的ip地址(比如172.17.42.1、172.17.42.2)。由于docker0网桥处在br0网桥之上,它们将(也应该!)可以相互连接。想象一下,要解决ip冲突会有多乱……这也是为什么我们要在启动时定义它,而不依赖docker服务来为我们创建这个网桥。

  •     gre隧道:你可以从gre0(而不是gre1)开始,它能完美工作。但由于某种原因,在输入ifconfig时你可以看到gre0,却看不到其他隧道。这可能是gre0作为的一个副作用。从gre1开始将让所有的gre隧道对ifconfig“隐身”(好过于只能看见一个)。别着急,你还是可以使用ovs-vsctl命令显示隧道/网桥。

  •     3台以上主机:你可以遵循相同的逻辑,并且:

  •         添加额外的隧道(iface grex)来连接新主机。

  •         在br0网桥定义中更新ovs_ports以包含interfaces文件中定义的所有gre隧道。

  •         聪明点……不要将每台服务器跟其他主机一一链接……stp收敛(convergence)将需要更长的时间,并且无法提供任何除了多重额外链路冗余之外的有用价值。


如果现在重启服务器,你将拥有一个具备冗余的网状网络,你可以运行以下命令来测试:

  •     从host1上ping 172.17.42.2或其他ip;

  •     在主机上运行iperf,通过ifconfig查看使用中的链接;

  •     在ping第三台主机时停止“中间”那台,查看网络收敛(通过stp)时ping中断了几秒钟。

docker

我们现在有了一个完善的网络,每个docker服务都可以将它们的容器挂接到docker0网桥上。让docker自动完成这步不是很棒么?答案在于docker有能力分配一个最小的ip地址池!

对于该示例,我们假定:

  •     每台主机(1.1.1.1、2.2.2.2、3.3.3.3)挂接到前面创建的docker0网桥上,其各自的ip地址是172.17.42.1、172.17.42.2、172.17.42.3;

  •     给docker0网卡指定了一个/16的ip范围;

  •     给每台主机指定了一小块docker0的ip范围,以/18 fixed-cidr的形式保存在它们的docker服务配置中。分别是172.17.64.0/18、172.17.128.0/18、172.17.192.0/18。


如果你的主机多于3台,你需要细分一个每个范围,或根据组织需要对整个网络拓扑结构进行重新考虑。

host1的配置文件(/etc/default/docker)是这样的:

bridge=docker0
cidr=172.17.64.0/18

wait_ip() {
address=$(ip add show $bridge | grep 'inet ' | awk '{print $2}')
[ -z "$address" ] && sleep $1 || :
}

wait_ip 5
wait_ip 15

docker_opts="
-h unix:///var/run/docker.sock
-h tcp://0.0.0.0:2375
--fixed-cidr=$cidr
--bridge $bridge
--mtu 1462
"


你可以根据需要修改docker_opts配置,添加镜像、不安全的registry、DNS等等。

说明:

  •     wait_ip:由于docker0网桥最后被创建,获取ip地址可能需要花点时间。使用wait_ip“功能”,你可以在返回docker init脚本前安全地等待几秒钟。该配置文件是被真正的init脚本(/etc/init/docker.conf)所引用。

  •     mtu:与前面相同原因,只是一个预防措施,用于确保每个网卡被创建时会被指定正确的mtu。

  •     -h tcp://……:如果你不想通过0.0.0.0将其“公开”(或绑定到服务器“真实”网卡之一),你也可以将它安全地绑定到……该主机的docker0 ip地址(比如172.17.42.2)!这样,你可以从任何一台主机访问到私有网状网络里的任何一个docker服务。

结语

重启一下(至少保证启动时所有东西都会自动上线)。

你可以试试以下命令看看一切是否正常。

# 访问host1
ssh user@host1

# 运行一个新容器
docker run -ti ubuntu bash

# 检查ip(在容器内运行)
ip add | grep eth0


#
# 在其他窗口中
#
# 访问另一台主机(host2或3)
ssh user@host2

# 运行一个新容器
docker run -ti ubuntu bash

# ping其他的容器!
ping $ip

到此,相信大家对“如何利用OpenVSwitch在多台主机上部署Docker”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


分享标题:如何利用OpenVSwitch在多台主机上部署Docker
本文网址:http://scyanting.com/article/jhhgjp.html