最近,我在虚拟机上运行 kubernetes 从属服务器时遇到了一个问题,该虚拟机使用 calico ipip 隧道作为网络连接协议来连接 kubernetes 节点。当前的症状(经 tcpdump 确认)是,当向虚拟机上的 k8s 从属节点发起 tcp 流量时,到达 vmbr0(虚拟机主机上的桥接接口)的所有数据包(大小大于虚拟机 MTU)都会被丢弃,并且在连接到 qemu 虚拟机的 tap 接口上找不到这些数据包。当发起流量时没有 ipip 标头,数据包可以在 tcp 级别正确分段并转发到虚拟机。
笔记:链路上的 MTU 为 1500,vmbr0 上大于 VM MTU 的数据包是由于 GRO 造成的。解决此问题的一种方法是禁用 VM 主机物理接口上的 GRO,但在处理高吞吐量流量时,这可能会引发性能问题。