Flannel MAC 地址冲突导致 Pod 跨节点通信异常
问题背景
客户在扩容 Kubernetes 节点后,发现部分服务 Pod 跨节点通信异常,表现为:
Pod 间通信间歇性失败;某些业务服务异常或响应慢;怀疑是网络问题引起的。问题排查
1️⃣ 初步排查网络路由信息我们先检查 flannel 的路由信息是否完整,执行如下命令查看:
结果发现 多个节点的 flannel.1 接口的 VtepMAC 完全相同:
🔍 问题浮现 —— MAC 地址冲突!
2️⃣ 查看物理网卡 MAC 地址是否一致不同节点的物理网卡 MAC 地址是不同的,说明冲突不在物理网卡层面。
3️⃣ 进一步查看 flannel.1 接口 MAC可以看到 flannel.1 接口在多个节点上的 MAC 地址是一致的。
问题原因
💡 客户的节点是通过 KVM 克隆创建的虚拟机,未对系统级唯一标识(如 /etc/machine-id)做处理,导致 MAC 地址生成逻辑一致,flannel 默认使用静态策略(非随机)生成 MAC 地址,从而出现冲突。
由于 flannel 使用 VXLAN 建立 overlay 网络,VTEP MAC 地址用于 VXLAN 建隧道,一旦多个节点的 MAC 相同,会导致 FDB 表异常,转发路径错误,从而出现通信失败。
解决方案
方式一:让 flannel 接口 MAC 地址随机生成使用 systemd 的 .link 文件强制设置接口 MAC 策略为随机:
然后执行以下操作使配置生效:
这样每次启动都会为 flannel.1 分配一个不同的随机 MAC,避免冲突。
问题延申:FDB 表未同步导致通信异常
由于MAC地址相同,还会导致fdb表异常,发现某节点无法访问新增节点的 Pod 网络,进一步排查:
发现 FDB 表存在旧的 MAC -> IP 映射,且未及时更新,导致节点pod网络通过异常
此时执行:
问题解决
总结思路
检查项
内容
MAC 冲突
多节点 flannel.1 接口 MAC 是否一致
FDB 表
本地 FDB 映射是否含有错误记录
flannel 状态
是否在 VXLAN 模式、路由是否同步
节点创建方式
是否通过 VM 克隆,是否处理 machine-id
快速修复
重启 flannel 服务或容器