Ananta 云规模负载平衡
Ananta 是一个可扩展的软件负载均衡器及 NAT 设备,以一个独特的方式将现有的路由技术和分布系统相结合,将负载均衡器组件分为可靠的控制平面以及一个分布式可扩展的数据平面具有三个独立分开的层次(Tiers)。
1、第一层:路由器基于ECMP(Equal Cost Multi Path)路由协议提供三层负载分担。
2、第二层:由一系列可扩展的专用服务器提供的负载均衡,叫做 Mux(multiplexers);其在内存中维护连接流状态以及向应用服务提供基于四层的负载分担。
3、第三层:这一层存在于每个服务器上的 VSwitch 中,提供有状态的 NAT 功能。
基于该架构,没有任何的出站流量需要经过Mux,从而大大减少对包的处理需求。
Ananta 架构(Architecture)
Ananta 架构分为三个组件:Ananta Manager(AM)、Ananta Mux以及Host Agent(HA)。每个组件之间相互独立可扩展。
AM 整合协调 Agent 和 Muxes 之间的状态;Mux负责inbound方向的流量转发;Agent通过NAT实现outbound流量旁路绕行Mux。
Ananta Manager 组件
Ananta Manager是Ananta架构的控制平面,提供API接口用于配置负载均衡的VIP地址和SNAT。基于VIP配置文件,统一配置管理HA、Mux Pool以及DIP健康监控的任何变化。同时,AM负责Muxes和Hosts的健康监控以及为outbound连接提供SNAT端口分配服务。
VIP 配置文件
当门户用VIP创建了一个负载均衡或NAT时,将生成对应的VIP配置,如下图。
Endpoint:定义了来自该VIP的特定端口的流量将被负载分担到对于的一组DIP上;所有的数据包都要被指定到对应的Endpoint,同时完成到DIP地址/端口的NAT转换;
SNAT:定义在outbound需要进行到VIP地址转换(SNAT)的一组DIP地址;
Mux 组件
Ananta 中一个或多个 Mux 组成一个Mux Pool,每个Ananta实例中有一个或多个的Pool。Mux Pool中的Muxes具有统一的计算能力以及完全相同的配置,例如处理相同的一批VIP地址。
Mux 组件功能:路由管理
每个Mux都是一个运行BGP路由协议的设备(Host)。当一个VIP地址配置到Ananta中后,每个Mux开始向自己的第一跳路由器宣告自己是这个VIP地址路由的下一跳。同时,Mux Pool中的Muxes到DC入口的三层路由跳数都是一样,这使得流量在入口Router上经过ECMP路由协议能被负载分担到所有的Muxes上。Muxes使用TCP MD5进行BGP会话认证。
Mux 的组件功能:包处理
Ananta在Mux中维护一张叫 VIP Map 的映射表,用于决定Inbound方向的流量如何被处理转发。映射表中的每个条目定义了一个VIP endpoint和后端DIP池的对应关系。这个表项由AM计算并同步发送给Mux Pool中的所有Muxes。
当Mux收到入方向的报文时,根据基于五元组的Hash算法从后端DIP池中选择一个DIP地址/端口进行映射,并在报文外层封装上新的头部发送给该DIP所在的Host。Mux保留原有的IP报头以及载荷部分,以确保回程报文的DSR(Direct Server Return)功能。
由于所有的Mux采用统一的Hash算法,所以不同Mux上的相同的流所计算出来的DIP是相同的,并能确保流量都发送给同一个DIP。
Mux 的组件功能:流状态管理
Mux 支持有状态和无状态的两种映射记录。有状态映射针对负载均衡流量,即Inbound流量;无状态映射针对SNAT流量,即Outbound流量。
当Mux为一条Inbound流选定了一个DIP地址后会将这个映射关系形成一个流表。非TCP首包报文或者无状态连接协议的报文直接优先匹配这个流表,如果能够匹配到对于条目则直接封装并转发给DIP;这样确保即使映射表出现临时的变化都能保持相同的连接转发到同一个DIP。如果没能匹配到具体的条目,则该报文将按照首包方式查询VIP Map映射表。
同时,为了应对SYN-Flood攻击,Mux将流分为可信任流和不可信任流。其在Mux上处于两个不同的队列以及内存空间。当一个连接在该Mux上出现多个报文时,则将被定义的可信任流,具有更长的老化时间;当如果仅出现一个报文时,则将被定义为不可信任流,具有很短的老化时间。一旦Mux上的内存空间被消耗完时,Mux将停止产生新的流状态条目。
Host Agent 组件
Host Agent 是 Ananta 架构中一个与众不同的组件,存在于每个Host物理机上,是实现DSR和SNAT的关键。
HA 组件功能:为 Inbound 流量提供 NAT
HA 为所有的负载分担流量提供有状态的NAT功能。当HA收到一个Inbound入方向报文后,会先将报文进行解封装,然后按照AM配置的NAT规则进行目的地址/端口的替换,并且创建一条双向的流表条目用来匹配后续流量。当来自VM的响应报文到达HA时,将直接匹配该流表进行NAT替换,然后直接发送给Router。AM配置的NAT规则可以描述为(VIP,protocol,port1)=>(DIP,protocol,port2)
HA 组件功能:为 Outbound 流量提供 SNAT
当Outbound出方向流量首包发送到HA上时(猜想:先匹配流表,如果没有对应条目,则认为首包)将被缓存到一个队列中,然后向AM发送一个请求报文。AM根据申请分配一个(VIP、Port)响应给HA。最后,HA就可以基于五元组的唯一性使用这个(VIP、Port)为缓存列表中所有去往不同目标地址/端口的连接做SNAT转换,即采用端口复用技术,让不同的连接使用同一个(VIP、Port)。
另外,AM可以在一个响应报文中返回多个端口信息,以满足HA后续转发新连接的端口需求。通常情况下,HA上未被使用的端口会在老化时间到达后被AM回收使用。但如果HA一直存在新连接会话占用该端口的话,AM也是可以在任意时刻强制让HA释放该端口资源的。Ananta会提前基于整体架构流量优化端口分配配置,让HA的SNAT请求报文达到最小化,例如给每个HA预分配端口。
HA 的组件功能:DIP 的健康监控
Ananta 为了避免给 Mux 增加太多的附加载荷,将对DIP的健康监控放在每个Host的HA上。HA通过监控本地VM的健康情况,然后将发生健康变化的信息发送给AM;AM再将该信息转发给Mux Pool里面所有的Muxes,统一刷新Muxes的配置。
Ananta 的流量模型
Inbound 流量,对于Inbound流量,其入方向上经过Mux负载分担,出方向在HA上直接Bypass MUX发送给Router。(根据Azure的流量分析,基本上大部分的云上业务均为服务端,受访问流量远远会大于主动向外访问的流量,所以出方向上Bypass掉Mux可以极大程度上减少Mux的负载)
Inbound流量的返回包不经过Mux,这样可以节省包处理资源和网络延迟。这种在返回路径上绕过负载平衡器的技术称为直接服务器返回(DSR)。并不是所有的连接包都将在同一个Mux中结束,但是对于单个连接的所有包都必须被交付到相同的DIP。Muxes通过一种一致的哈希和状态管理来实现这一目标。
Inbound 流量转发过程:
0、外部Client主动访问云上服务,目的地址为云上服务向外暴露的VIP地址;
1、Router收到报文后根据ECMP路由协议将报文转发到某个Mux上;(此时SrcIP=Client,DestIP=VIP)
2、Mux收到一个报文后,根据负载均衡算法为该链接选择一个DIP;然后使用IP-in-IP技术对收到的报文进行封装;将选择的DIP作为目的IP地址封装为外层头部,此时为两次IP头部(outerSrcIP=Mux,outerDestIP=DIP,innerSrcIP=Client,innerDestIP=VIP);;
3、Mux将封装好的报文发送给对应的Host;此处猜想:在报文送出Mux之前还应该封装上Mux和host之间的Underlay地址以及用于隔离租户信息的NVGRE标签;
4、和目的DIP地址同在一个物理机上的HA,对这个封装后的报文进行拦截,去除外层头部,并对报文内层头部的目的IP地址和端口进行修改(此时为:SrcIP=Client,DestIP=DIP);同时记录这个NAT转换规则;(猜想应该是这样:VIP:port1 ——> DIP:port2)
5、HA将修改后的报文送给VM;
6、VM的响应报文在HA被拦截;(此时:SrcIP=DIP,DestIP=Client)
7、HA根据第4步生成的NAT转换规则对outbound的响应报文进行反向NAT,修改其源IP地址以及端口;
8、HA Bypass Mux直接将修改后的报文发送给Router;(此时:SrcIP=VIP,DestIP=Client)
Outbound流量转发过程:
Ananta的一个独特的特性是为一个outbound流量提供一个分布式的NAT功能;同样,Ananta允许Outbound流量Bypass掉Mux:
1、VM的出站流量转发到本地host的HA上(此时:SrcIP=DIP,DestIP=Server),HA识别这个报文需要进行SNAT操作(猜想:这里HA会对每一个来着VM的数据报文进行NAT规则表项的匹配,如果没有查询到由inbound流量流程中第4部产生记录的NAT表项时,则认为该报文为VM首发,需要进行SNAT操作)
2、HA将该报文缓存在队列中,并向AM发送请求报文,为该链接流量申请外部可路由的VIP地址和端口号;
3、AM从资源池中分配一个(VIP,Ports)资源信息,并配置到每个Mux中;
4、AM然后将这个资源分配发送给对应的HA(猜想:HA根据这个资源分配生成NAT规则条目);HA根据规则重新修改VM报文的源IP地址和端口;
5、HA直接将报文发送给Router;
6、Server的回程报文在Router上基于ECMP转发到一个Mux上;Mux基于第3步获得的配置信息已经明确如何进行报文的外层封装(类似于inbound流量);
7、封装完成后的流量转发给HA(此时:outerSrcIP=Mux,outerDestIP=DIP,innerSrcIP=Server,innerDestIP=VIP)
8、HA收到封装报文后,根据第4步AM分配的NAT规则,先对报文外层头部进行解封装,并进行DNAT,(此时:SrcIP=Server,DestIP=DIP);
FastPath:
Ananta为了更好的卸载intra-DC的流量,提供了FastPath技术。其关键点是让负载均衡器决定当第一个链接报文到达后如何重定向到新的DIP上。这个决定会被发送到源host以及目的host上的HA,使得其之间能够直接的通信。这样的实现使得不管在入方向上还是在出方向上都能够Bypass掉Mux,同时要求underlay网络层面上的全互联支持。
VM1和VM2需要通过各自的VIP相互通信:
1、VM1发送报文到VM2的VIP2上(DestIP=200.2.2.20,SrcIP=1.1.1.1);
2、在Host1上的HA进行SNAT后发送至Mux2(DestIP=200.2.2.20,SrcIP=100.1.1.10);
3、报文在Mux2上通过负载分担算法,封装上外层头部(outerDestIP=2.2.2.2,outerSrcIP=Mux2,innerDestIP=200.2.2.20,innerSrcIP=100.1.1.10)转发给Host2上HA;
4、HA2收到报文后进行解封装,并进行DNAT(DestIP=2.2.2.2,SrcIP=100.1.1.10),并发送给VM2;
5、VM2收到报文后,响应回程报文发送到HA2(DestIP=100.1.1.10,SrcIP=2.2.2.2);
6、HA2拦截报文后,进行SNAT后发送给Mux1的VIP1(DestIP=100.1.1.10,SrcIP=200.2.2.20);
7、Mux1收到报文后根据之前AM配置的(VIP、Ports关系),将报文进行封装,发送给HA1(outerDestIP=1.1.1.1,outerSrcIP=Mux1,innerDestIP=100.1.1.10,innerSrcIP=200.2.2.20);
8、HA1拦截报文后,进行解封装,然后DNAT后发送给VM1(DestIP=1.1.1.1,SrcIP=200.2.2.20);
在Ananta提供FastPath技术后,当一条连接已经建立后(例如TCP三次握手完成):
9、Mux2会发送一个重定向信息给处理VIP1的Mux1,通知其连接VIP2(200.2.2.20:80)特定端口的连接是映射到DIP2(2.2.2.2)的;(猜想:通知信息格式为VIP2(200.2.2.20:80)—>DIP2(2.2.2.2:80))
10、Mux1收到重定向信息后,知道来着VIP2(200.2.2.20:8080)的流所对应的是DIP1(1.1.1.1);然后分别发送重定向信息给VM1和VM2;(猜想:给VM1的是200.2.2.2:8080—>2.2.2.2:80;给VM2的是100.1.1.1:5322—>1.1.1.1:3322);
11、HA1拦截该重定向报文后,会记录后续去往200.2.2.20:8080 的报文封装为2.2.2.2:80,直接发送给2.2.2.2;HA2拦截重定向报文后,会记录后续报文去往100.1.1.10:5333的报文封装为1.1.1.1:3322,直接发送给1.1.1.1;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论