config bgp
ECMP模式的优缺点几乎和Layer2模式相反
优点:
无单点故障,在开启ECMP的前提下,k8s集群内所有的节点都有请求流量,都会参与负载均衡并转发请求
支持了Linux网络栈,因此可以使用bird、quagga、frr等各种路由软件实现标准的路由协议
缺点:
条件苛刻,需要有特殊路由器支持,配置起来也更复杂;
ECMP的故障转移(failover)并不是特别地优雅,这个问题的严重程度取决于使用的ECMP算法;当集群的节点出现变动导致BGP连接出现变动,所有的连接都会进行重新哈希(使用三元组或五元组哈希),这对一些服务来说可能会有影响;
路由器中使用的哈希值通常 不稳定,因此每当后端集的大小发生变化时(例如,当一个节点的 BGP 会话关闭时),现有的连接将被有效地随机重新哈希,这意味着大多数现有的连接最终会突然被转发到不同的后端,而这个后端可能和此前的后端毫不相干且不清楚上下文状态信息。
PureLB官方只简单提及了使用路由协议的一些问题:
Depending on the router and its configuration, load balancing techniques will vary however they are all generally based upon a 4 tuple hash of sourceIP, sourcePort, destinationIP, destinationPort. The router will also have a limit to the number of ECMP paths that can be used, in modern TOR switches, this can be set to a size larger than a /24 subnet, however in old routers, the count can be less than 10. This needs to be considered in the infrastructure design and PureLB combined with routing software can help create a design that avoids this limitation. Another important consideration can be how the router load balancer cache is populated and updated when paths are removed, again modern devices provide better behavior.
不过由于都是使用ECMP,我们可以参考MetalLB官方给出的资料,下面是MetalLB给出的一些改进方案,列出来给大家参考一下
使用更稳定的ECMP算法来减少后端变动时对现有连接的影响,如“resilient ECMP” or “resilient LAG”
将服务部署到特定的节点上减少可能带来的影响
在流量低峰期进行变更
将服务分开部署到两个不同的LoadBalanceIP的服务中,然后利用DNS进行流量切换
在客户端加入透明的用户无感的重试逻辑
在LoadBalance后面加入一层ingress来实现更优雅的failover(但是并不是所有的服务都可以使用ingress)
接受现实……(Accept that there will be occasional bursts of reset connections. For low-availability internal services, this may be acceptable as-is.)
ECMP面临的问题
ECMP是一种较为简单的负载均衡策略,其在实际中面临的问题也不容忽视。
可能增加链路的拥塞 ,ECMP并没有拥塞感知的机制,只是将流分散到不同的路径上转发。对于已经产生拥塞的路径来说,很可能加剧路径的拥塞。而使用哈希的方法,产生哈皮碰撞也会增加链路拥塞的可能。
非对称网络使用效果不好,例如在图2中,A与h3之间的通信,ECMP只是均匀的将流通过B,D两条路径分别转发,但实际上,在B处可以承担更多的流量。因为B后面还有两条路径可以到达h3;
基于流的负载均衡效果不好,ECMP对于流大小相差不多的情况效果更好,而对于流大小差异较大,例如大象流和老鼠流并存的情况下,效果不好。如图2,主机h1到A的流量为15,h2到A的流量为5.那么无论为h1的流量选择哪条路径都会发生拥塞。但若将h1的流拆分成为两部分传输,可以避免拥塞的情况;