问题

某k8s集群基于metallb layer2模式实现了kubernetes得lb service,目前建立了几个lb service,发现有个别的不通

排查

  1. 首先在客户端查看arp表(arp -a),发现表里的mac地址和预期中的mac地址不符

    企业微信截图_16992646608415

  2. 安装arping(apt install arping),使用该工具看看arp response的情况(arping $IP),发现对于该不通的lb ip,会有两条arp response,对应了两个mac地址。

    企业微信截图_20891277-618d-4e68-93c1-2b931d5723d3

  3. 进一步对比这两个mac地址后,发现有一个是预期内的mac,另一个是同一节点上的另一块网卡,最终不通是因为使用了这块预期外的网卡作为了目标网卡

分析

为什么会收到两个网卡的arp response?

这个环境是同事部署的,在给他报告了初步排查情况后,他说这个机器有一块网卡插了线,接通了交换机。

由于metallb layer2模式的原理,speaker启动后除了排除一些名字特殊的、明显不是真实网卡的虚拟网卡以外,会对监听到的arp request在所有网卡发送arp response。

如果不接线,那么多发的arp response无伤大雅。但是同时接通多块网卡到同一个交换机,那么就会收到多块网卡的arp response。

如果客户端学到的mac地址是错误的网卡(虽然是同一台机器的),那么数据包便会被丢弃,不会有回应,自然也就不通。

解决

把多余的网卡down掉,问题解决。

在分析metallb问题时,发现其官方网站的trouble shooting页面总结得非常到位,分门别类,层层递进,逻辑清晰,有操作有原理,适量适度,把握地非常好,简直是文档届楷模,值得学习。

参考

MetalLB, bare metal load-balancer for Kubernetes (universe.tf)

文章目录