我将Qugaa bgpd和nsm二进制文件 bundle 到基于Ubuntu 3.13.0-36通用内核的docker中。现在,我在Linux服务器上运行多个这些docker。这些docker使用docker-py实例化。
我使用管道工作,并在每个 docker 上创建了一个以太网接口(interface),并分配了一种172.17.xx.xx地址。我的BGP配置使得所有docker都相对于BGP完全啮合。即, docker 上的每个BGP都与其他 docker 上运行的每个其他BGP连接。
建立BGP session ,并且BGP路由等绝对正确。现在,当 docker 的数量超过30个时,我将永远无法连接到bgp。 “top”命令显示的CPU使用率不高,内存有限,网络 Activity 也不多,我也不希望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无关。我怀疑与Docker网络有关。是否有人遇到这样的问题或想法如何解决此问题,或根本原因是什么?
最佳答案
最终,我可以找到背后的根本原因并对此进行修复。这是由于docker实例数量,我在每个docker上创建的MAC条目数量以及在我的Linux服务器上指定为1024的默认ARP缓存大小的综合原因。
以我为例,我最终将MAC条目创建为( docker 数量*我通过管道创建的以太网接口(interface)数量)。因此,当每个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”命令