Flannel MAC 地址沖突導(dǎo)致 Pod 跨節(jié)點(diǎn)通信異常

問題背景
客戶在擴(kuò)容 Kubernetes 節(jié)點(diǎn)后,發(fā)現(xiàn)部分服務(wù) Pod 跨節(jié)點(diǎn)通信異常,表現(xiàn)為:
- Pod 間通信間歇性失??;
- 某些業(yè)務(wù)服務(wù)異?;蝽憫?yīng)慢;
- 懷疑是網(wǎng)絡(luò)問題引起的。
問題排查
1?? 初步排查網(wǎng)絡(luò)路由信息
我們先檢查 flannel 的路由信息是否完整,執(zhí)行如下命令查看:
# 查看所有節(jié)點(diǎn)上的 flannel 路由信息
kubectl get node -o yaml | grep -A3 flannel.alpha.coreos.com/backend-data結(jié)果發(fā)現(xiàn) 多個(gè)節(jié)點(diǎn)的 flannel.1 接口的 VtepMAC 完全相同:
flannel.alpha.coreos.com/backend-data: '{"VtepMAC":"fe:22:77:eb:2f:a1"}'?? 問題浮現(xiàn) —— MAC 地址沖突!
2?? 查看物理網(wǎng)卡 MAC 地址是否一致
ip link show enp1s0不同節(jié)點(diǎn)的物理網(wǎng)卡 MAC 地址是不同的,說明沖突不在物理網(wǎng)卡層面。
3?? 進(jìn)一步查看 flannel.1 接口 MAC
ip -d link show flannel.1可以看到 flannel.1 接口在多個(gè)節(jié)點(diǎn)上的 MAC 地址是一致的。
問題原因
?? 客戶的節(jié)點(diǎn)是通過 KVM 克隆創(chuàng)建的虛擬機(jī),未對(duì)系統(tǒng)級(jí)唯一標(biāo)識(shí)(如 /etc/machine-id)做處理,導(dǎo)致 MAC 地址生成邏輯一致,flannel 默認(rèn)使用靜態(tài)策略(非隨機(jī))生成 MAC 地址,從而出現(xiàn)沖突。
由于 flannel 使用 VXLAN 建立 overlay 網(wǎng)絡(luò),VTEP MAC 地址用于 VXLAN 建隧道,一旦多個(gè)節(jié)點(diǎn)的 MAC 相同,會(huì)導(dǎo)致 FDB 表異常,轉(zhuǎn)發(fā)路徑錯(cuò)誤,從而出現(xiàn)通信失敗。
解決方案
方式一:讓 flannel 接口 MAC 地址隨機(jī)生成
使用 systemd 的 .link 文件強(qiáng)制設(shè)置接口 MAC 策略為隨機(jī):
# /etc/systemd/network/10-flannel.1.link
[Match]
OriginalName=flannel.1
[Link]
MACAddressPolicy=random然后執(zhí)行以下操作使配置生效:
# 重啟 systemd-networkd,或重啟節(jié)點(diǎn)
systemctl restart systemd-networkd
# 或重啟 flannel 容器
docker restart flannel-xxxx這樣每次啟動(dòng)都會(huì)為 flannel.1 分配一個(gè)不同的隨機(jī) MAC,避免沖突。
問題延申:FDB 表未同步導(dǎo)致通信異常
由于MAC地址相同,還會(huì)導(dǎo)致fdb表異常,發(fā)現(xiàn)某節(jié)點(diǎn)無法訪問新增節(jié)點(diǎn)的 Pod 網(wǎng)絡(luò),進(jìn)一步排查:
/sbin/bridge fdb show flannel.1 | grep <mac地址>發(fā)現(xiàn) FDB 表存在舊的 MAC -> IP 映射,且未及時(shí)更新,導(dǎo)致節(jié)點(diǎn)pod網(wǎng)絡(luò)通過異常
此時(shí)執(zhí)行:
# 重啟 flannel 容器或服務(wù),重新注冊(cè) FDB
docker restart flannel-xxxx問題解決
總結(jié)思路
檢查項(xiàng) | 內(nèi)容 |
MAC 沖突 | 多節(jié)點(diǎn) flannel.1 接口 MAC 是否一致 |
FDB 表 | 本地 FDB 映射是否含有錯(cuò)誤記錄 |
flannel 狀態(tài) | 是否在 VXLAN 模式、路由是否同步 |
節(jié)點(diǎn)創(chuàng)建方式 | 是否通過 VM 克隆,是否處理 machine-id |
快速修復(fù) | 重啟 flannel 服務(wù)或容器 |
?? 建議
- 虛擬機(jī)克隆后建議清理
machine-id并重新生成; - 使用
MACAddressPolicy=random保證 overlay 網(wǎng)絡(luò)接口唯一; - 定期巡檢 flannel 路由表、FDB 表等底層數(shù)據(jù);
- 可使用 CNI 替代方案(如 Calico)更強(qiáng)的網(wǎng)絡(luò)控制策略。



























