docker和Quagga BGP

我将Qugaa bgpd和nsm二进制文件捆绑到一个基于Ubuntu 3.13.0-36-通用内核的docker中。 现在我在linux服务器上运行多个docker。 这些docker使用docker-py实例化。

我使用了pipework,并在每个docker上创build了一个以太网接口,并分配了一个172.17.xx.xxtypes的地址。 我的BGPconfiguration是这样的,所有的docker都相对于BGP是完全网状的。 即docker上的每个BGP都连接到运行在其他docker上的其他BGP。

BGP会话build立,BGP路由等都绝对正常。 现在,当docker工人超过30人时,我永远无法连接到bgp。 “top”命令不会显示太多的CPU使用情况,内存是有限制的,没有太多的networking活动,我也不期望在BGP过程中有太多的处理。

当我把容器上的tcpdump,这是它的样子。

9 2014-09-26 18:17:54.997861 0a:60:4a:3b:56:31 ARP 44谁有172.17.1.32? 告诉172.17.1.6

当我运行40个docker的时候,我看到了40个这样的ARP请求,如上所示,然后是一个ARP应答。

然而,这种情况不断发生,并且在短时间内大约产生了1600(40 * 40)个这样的消息。 我相信这是不允许我使用“telnet localhost bgpd”命令连接到本地bgp模块。

我不认为这是Quagga或BGP的特定任何东西。 我怀疑有些事情与dockernetworking有关。 有没有人有这样的问题或任何想法如何解决这个问题或根本原因是什么?

最后我可以find背后的根源,并解决了这个问题。 这是由于Docker实例的数量,我在每个Docker上创build的MAC条目的数量以及在我的Linux服务器上指定的默认ARPcaching大小为1024的组合。

在我的情况下,我最终创buildMAC条目(docker的数量*我通过pipe道创build的以太网接口的数量)。 因此,每个DOCKER上的MAC条目数超过默认大小1024时,就会出现问题。

在/etc/sysctl.conf文件的末尾添加下面的行,或者在/etc/sysctl.conf文件中已经有了这些条目,就可以解决这个问题。

net.ipv4.neigh.default.gc_thresh1 = 8192 net.ipv4.neigh.default.gc_thresh2 = 12288 net.ipv4.neigh.default.gc_thresh3 = 16384 

修改完成后,执行“sysctl -p”命令

Interesting Posts