目录

metallb浅析

前言

网络的所有问题都是关于路由(三层)与交换(二层)的问题,一个packet,只要弄清楚了它的四元组(src_ip,dst_ip,src_mac,dst_mac)是怎么来的,自然而然地就能理解其他问题。

ARP模式

arp模式,也就是二层模式,利用的是gratuitous arp1,来向network宣告LoadBalancer的MAC地址,从而使得路由器能顺利建立起四元组。由于arp报文只存在于一个LAN内的特性,metallb的arp模式自然也就要求集群不能跨LAN。如下:

https://raw.githubusercontent.com/boatrainlsz/my-image-hosting/main/202304080942916.gif

抓个包看下2:

https://raw.githubusercontent.com/boatrainlsz/my-image-hosting/main/202304081002782.png

这里的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://raw.githubusercontent.com/boatrainlsz/my-image-hosting/main/202304081022546.png

参考资料

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/