metallb浅析
目录
前言
网络的所有问题都是关于路由(三层)与交换(二层)的问题,一个packet,只要弄清楚了它的四元组(src_ip,dst_ip,src_mac,dst_mac)是怎么来的,自然而然地就能理解其他问题。
ARP模式
arp模式,也就是二层模式,利用的是gratuitous arp1,来向network宣告LoadBalancer的MAC地址,从而使得路由器能顺利建立起四元组。由于arp报文只存在于一个LAN内的特性,metallb的arp模式自然也就要求集群不能跨LAN。如下:
抓个包看下2:
这里的178.118.240.198就是LoadBalancer的IP,leader node通过gratuitous arp向LAN内的所有host宣告:178.118.240.198在fa:16:b2:76:f0:72。注意ARP包里的Target MAC Address不重要,取广播地址也好,取0也好,因为靠的是二层以太帧里的dst_mac来决定包的目的地。通过源码也能印证这一点:
func (a *arpResponder) Gratuitous(ip net.IP) error {
for _, op := range []arp.Operation{arp.OperationRequest, arp.OperationReply} {
pkt, err := arp.NewPacket(op, a.hardwareAddr, ip, ethernet.Broadcast, ip)
if err != nil {
return fmt.Errorf("assembling %q gratuitous packet for %q: %s", op, ip, err)
}
if err = a.conn.WriteTo(pkt, ethernet.Broadcast); err != nil {
return fmt.Errorf("writing %q gratuitous packet for %q: %s", op, ip, err)
}
stats.SentGratuitous(ip.String())
}
return nil
}
BGP模式
BGP模式算是重型武器了,因为它需要建立peer关系,所以需要路由器支持BGP。
参考资料
https://github.com/metallb/metallb/issues/172
https://www.rfc-editor.org/rfc/rfc5227
https://www.wikiwand.com/en/Border_Gateway_Protocol
https://www.dbi-services.com/blog/kubernetes-metallb-in-depth/