在最近的一次升级中(从 Ubuntu Lucid 上的 Openstack Diablo 升级到 Ubuntu Precise 上的 Openstack Essex),我们发现 DNS 数据包经常(几乎总是)在桥接接口 (br100) 上丢失。对于我们的计算节点主机,它是使用 mlx4_en 驱动程序模块的 Mellanox MT26428。
我们找到了两种解决方法:
使用旧的 lucid 内核(例如 2.6.32-41-generic)。这会导致其他问题,特别是缺少 cgroups 和旧版本的 kvm 和 kvm_amd 模块(我们怀疑 kvm 模块版本是导致我们偶尔看到虚拟机使用 100% CPU 的错误的原因)。我们在过去几个月一直在使用这种方法,但不能永远这样。
使用较新的 Ubuntu Precise 内核 (3.2.x),我们发现,如果我们使用 sysctl 禁用网桥上的 netfilter(请参阅下面的 sysctl 设置),DNS 就会再次正常工作。我们以为这是解决问题的办法,直到我们意识到关闭网桥接口上的 netfilter 当然意味着重定向 nova-api-metadata 服务器的 VM 请求的 DNAT 规则(即将发往 169.254.169.254:80 的数据包重定向到计算节点的 IP:8775)将被完全绕过。
长话短说:使用 3.x 内核,我们可以拥有可靠的网络和损坏的元数据服务,或者我们可以拥有损坏的网络和在有虚拟机需要服务的情况下可以正常工作的元数据服务。我们还没有找到同时拥有两者的方法。
有人见过这个问题或者类似的问题吗?有解决办法吗?或者有正确的方向吗?
我们怀疑这是 Mellanox 驱动程序特有的,但我们对此并不确定(我们尝试了几个不同版本的 mlx4_en 驱动程序,从 3.2.x 内核内置的版本一直到 mellanox 网站上最新的 1.5.8.3 驱动程序。Quantal 的 3.5.x 内核中的 mlx4_en 驱动程序根本不起作用)
顺便说一句,我们的计算节点有超微 H8DGT 主板,内置 Mellanox NIC:
02:00.0 InfiniBand: Mellanox Technologies MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE] (rev b0)
我们不使用系统中的另外两个 NIC,只连接了 Mellanox 和 IPMI 卡。
桥接netfilter sysctl设置:
net.bridge.bridge-nf-call-arptables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-ip6tables = 0
自从发现这个 bridge-nf sysctl 解决方法以来,我们发现网上有几个页面推荐了这个(包括 Openstack 最新的网络故障排除页面和启动板错误报告与此相关的博客文章对问题和解决方案进行了很好的描述)....当您知道要搜索什么时,找到东西会更容易:),但我们还没有发现有关它引起的 DNAT 问题的任何信息。
更新2012-09-12:
我早该提到这一点——这种情况甚至发生在没有安装任何 openstack 或 libvirt 软件包的机器上。同样的硬件,同样的一切,但安装的 Ubuntu 12.04 基础系统没有太多变化。
在内核 2.6.32-41-generic 上,桥接器按预期工作。
在内核 3.2.0-29-generic 上,使用以太网接口,它工作正常。除非 net.bridge.bridge-nf-call-iptables=0,否则在同一网卡上使用网桥会失败
因此,很明显,问题出在 mellanox 驱动程序、更新的内核的桥接代码、netfilter 代码或它们之间的某种交互中。
有趣的是,我还有其他机器(没有 Mellanox 卡),它们带有桥接接口,但没有出现此问题。NIC 范围从便宜的 r8169 卡到某些 Sun Fire X2200 M2 服务器中质量更好的 Broadcom tg3 Gbit 卡,以及 Supermicro 主板中的英特尔 gb 卡。与我们的 OpenStack 计算节点一样,它们都使用桥接接口作为具有 IP 地址的主要(或有时是唯一)接口 - 它们以这种方式配置,因此我们可以使用 libvirt 和 kvm 使用真实 IP 地址而不是 NAT 来运行虚拟机。
因此,这表明问题特定于 mellanox 驱动程序,尽管我上面提到的博客文章与一些使用 bnx2 驱动程序的 broadcom NIC 也存在类似的问题。