京品吉橡胶强人线缆有限公司

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

2015-04-01  来源:新网巢  我有话说  收藏本文  阅读  次

【编者的话】当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当于写了个Hello World的入门程序,多主机的网络设置成了下一道门槛。在你尝试各种方案时不妨先看看本文,或许就会豁然开朗,发现原来也不复杂。嗯,是的,本文用到了 OpenVSwitch。

在多台主机上运行却是另外一回事……

分别在每台主机上运行Docker,在公网或内网网卡上暴露端口以便容器间相互通讯。这可能比较麻烦,而且会引发安全问题。

运行类似Deis或Flynn的Docker多主机一站式方案。这可能不在你的考虑范围内。


201533192619750.jpg (720×540)

基本上,我们将执行以下步骤:

技术

  •     Docker:嗯……这是篇关于Docker与网络的文章,所以……
  •     OpenVSwitch:非常棒的虚拟网络交换机项目,伸缩性非常好,根据本指南,你可以运行“任意”规模的网络。

我们将假定服务器运行的是Ubuntu Server 14.04.02 LTS x64,对于其它系统,你可能需要修改下面提供的各项配置。

Docker

OpenVSwitch

OpenVSwitch GitHub上有详细的构建手册。

#获取最新存档
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安装包,接下来将其推送并安装到所有主机上。

你可以使用OpenVSwitch提供的不同命令行工具来构建网状网络(比如ovs-vsctl),不过Ubuntu提供了一个辅助工具让你可以通过/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)将需要更长的时间,并且无法提供任何除了多重额外链路冗余之外的有用价值。

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

Docker

对于该示例,我们假定:


201533192746734.jpg (720×540)

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服务。

结语

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

如果将分级网桥、VLAN等包括进来,事情将更复杂,不过那超出了本文的范围。;)

(责编:tianji)
关键词: OpenVSwitch Docker

声明:原文出自//article.nxpop.com/col/2015-04-01/319.html ,文章观点仅代表原作者,转载请注明出处。

新网巢是非商业性和非盈利性的个人运营网站,文章仅供个人站长及爱好者学习交流使用,如涉及侵权,烦请告知,以便及时删除。

已有条评论
匿名评论

用微信扫一扫

新网巢