最近在改造 Kubernetes 集群,将网络插件从 Calico 更换为性能更佳的 Cilium。Cilium 基于 eBPF 这一Linux 内核技术,在采用 overlay 模式时能够打破物理节点的限制,非常适合混合云场景下的集群部署。
然而,在测试过程中发现,从自建数据中心的节点访问云上某节点的大资源 Pod 时,总是出现丢包现象。

问题排查
经过多次复现,确认丢包仅发生在跨主机节点访问时。要定位此问题,首先需要理解 Cilium 的通信原理。
Cilium 核心网络接口解析
在 Cilium 宿主机上,有三个关键接口构成了核心数据通道:
-
cilium_host & cilium_net (Veth Pair)
这是一对虚拟网线,连接了宿主机网络命名空间和 Cilium 的 BPF 数据路径。
- cilium_host:位于宿主机网络命名空间,配置了 Cilium 的 Gateway IP(例如
10.4.15.28)。
- cilium_net:隐藏在容器的网络命名空间(通常是 init 命名空间),作为 BPF 程序的挂载点。
- 流量场景:宿主机与本机 Pod 通信(如健康检查)、本机 Pod 访问宿主机 IP 或 NodePort 服务。
-
cilium_vxlan (Overlay 隧道接口)
此接口专门负责处理跨节点流量的封装与解封装。
- 流量场景:跨节点 Pod 间通信。
- 发送:本机 Pod A 发往另一台主机上的 Pod B,流量经 BPF 处理后,会推送至
cilium_vxlan 进行 VXLAN 封装,再经物理网卡发出。
- 接收:物理网卡收到 VXLAN 包,解封装后通过
cilium_vxlan 交给 BPF,最终转发给目标 Pod。
| 接口名 |
角色 |
流量场景 |
| cilium_host |
宿主机网关 |
宿主机 ↔ Pod,或 Pod 访问外部 |
| cilium_net |
BPF 挂载点 |
配合 cilium_host 工作(内部管道) |
| cilium_vxlan |
隧道出入口 |
跨节点 Pod 通信 |
问题定位与解决
问题出现在跨主机节点访问,因此重点应聚焦于 cilium_vxlan 这一隧道层。凡是涉及隧道封装,往往与 MTU(最大传输单元) 设置不当有关。
首先,计算 VXLAN 封装带来的额外开销:
- VXLAN 封装开销 = UDP Header (8 字节) + VXLAN Header (8 字节) + Outer IP Header (20 字节) + Outer Ethernet Header (14 字节) = 50 字节
在标准以太网 MTU 为 1500 字节的前提下,考虑 VXLAN 开销后,Pod 内网卡的有效 MTU 应设置为 ≤ 1450 字节。
最初,我尝试直接在 Pod 内修改网卡 MTU,但并未解决问题:
nsenter -t 1999084 -n ip link set dev eth0 mtu 1400
原因何在?原来,Cilium 在初始化时,默认在路由条目中也设置了 MTU,且路由的 MTU 优先级高于网卡本身的 MTU 设置。检查路由配置后验证了这一点:
# Pod 内部路由设置
# nsenter -t 2086232 -n ip route
default via 10.4.15.28 dev eth0 mtu 1450
10.4.15.28 dev eth0 scope link
# 宿主机路由配置(片段)
...
10.4.9.0/24 via 10.4.15.28 dev cilium_host proto kernel src 10.4.15.28 mtu 1450
10.4.10.0/24 via 10.4.15.28 dev cilium_host proto kernel src 10.4.15.28 mtu 1450
...
可见,路由上已经配置了 MTU 为 1450。因此,解决方案是修改路由条目上的 MTU 值:
nsenter -t 2086232 -n ip route change default via 10.4.15.28 dev eth0 mtu 1400
再次测试访问大资源,丢包问题得以解决。
问题复盘
正常情况下,Cilium 默认的 1450 MTU 已经考虑了 VXLAN 开销,在自建机房环境中通常没有问题。
但在混合云这种复杂环境下,情况变得不可控。云厂商的 VPC 网络可能进行额外封装、其底层物理网络设备可能支持巨型帧(Jumbo Frame),这些因素都可能导致路径中实际有效的 MTU 超过 1500 字节。如果中间网络设备不支持 IP 分片,过大的数据包就会被丢弃,引发丢包。
经与云厂商沟通确认,在其Kubernetes容器化集群中,使用 Cilium 网络插件时也曾出现类似丢包问题,最终通过统一调低 MTU 值解决。
注:在我们的实践中,曾将 MTU 设为 1388 和 1300。选择 1300 是一个相对保守的值,其带来的性能衰减约为 (1500-1300)/1500 ≈ 13%,在多数场景下是可接受的,以换取更高的网络稳定性。
如何全局配置 Cilium 的 MTU
若需在安装或升级 Cilium 时直接指定 MTU,可使用 Helm 参数进行配置:
cilium upgrade \
--version 1.18.3 \
--set mtu=1300 \
--reuse-values
通过 Helm values 配置,可以确保集群内所有 Cilium 组件应用统一的 MTU 设置,从根源上避免此类问题。