Kube-router:在裸机上Kubernetes集群的高可用和可扩展性


【编者的话】本文主要介绍了公司中负载均衡的解决方案和实现机制以及在裸机上如何实现Kubernetes的集群。

多年来全网规模公司已经使用基于商业Linux服务器的负载均衡解决方案设计了大量的可扩展性和高可用的服务。传统的中间设备已经完全被软件负载均衡所覆盖。在这边博客中我们将看到微软的Ananta,谷歌的Maglev,Facebook的Shiv,Github的GLB以及雅虎的L3 DSR的共用基础模块。我们将看到Kube-router是如何为Kubernetes去实现一些这样的基础模块,以及如何利用它们在裸机上部署高可用和可扩展性。

网络设计

下图显示了全网规模公司中所使用的典型的分层架构。
webscale-ingress.png

下面是一些标准机制的使用。

使用BGP(边界网关协议)和ECMP(等价路由)

你拥有第二梯队的L4转发器,每一个都是BGP的发言者和公告服务虚拟IP到BGP路由器。通过L4转发器路由器为虚拟IP提供了很多条等价路径。运行在BGP协议上的L4转发器提供自动故障检测并恢复。如果一个L4转发器失败或者意外宕机,路由器将通过BGP协议检测到该故障并自动停止发送流量到这台转发器。同理,当L4转发器恢复后,它会开始宣布路由,然后路由器就可以将开始流量转发给它。

L3和L4网络负载均衡

由于路由器有多条通往公告的虚拟IP线路,它可以执行ECMP负载均衡。在这种情况下在第三层做负载均衡时,路由器将流量分配给第2位的L4转发器。路由器也可以进行散列(在包源、目标IP和端口等)的负载均衡。与相同流向对应的流量会被路由到相同的L4转发器。即使有多个路由器(冗余),如果使用一致性哈希,流量也可以被路由器转发到相同的L4转发器。

L4转发器

L4转发器不代理连接,只是将数据包转发到选定的端点。因此L4转发器是无状态的。但是他们可以使用一致的哈希来使用等价路由来进行碎片传输,因此,每个L4转发器为特定的流选择相同的端点。因此,即使L4转发器下降,流量仍然会在相同的端点结束。Linux的LVS/IPVS被征用为L4转发器。

后台服务器直接响应用户

在典型的负载均衡器中充当代理,数据包被目标映射到真实的服务器IP。返回的流量必须要通过相同的负载均衡器,这样包就会被源映射(作为源IP的VIP)。这阻碍了扩展尤其是当路由器通过L4转发器进行分片处理时。为了突破这种限制,正如上文提到的L4转发器简单的转发数据包。它会对数据包进行隧道处理以便原始数据包就会被分发到服务点。很多解决方案(IPVS/LVS的DR模式,使用GRE/IPIP隧道等)都可以将流量发送到端点。当端点接收到数据包后,就会看到从原始客户端发送给VIP的流量(当然端点需要设置从原始客户端接收到VIP的流量)。返回的流量直接发送给客户端。

L4/L7分割设计

在上述的基本机制进行扩展实现应用程序的负载均衡。被称为L4/L7的分割设计如下所示。
webscale-ingress-l4-l7-split.png

这如何适用于Kubernetes呢?

Kubernetes提供多种凡是暴露服务:节点端口,集群IP和对外IP等。当集群运行在公共云上时这些底层机制能被连接到云负载均衡器上(类似于亚马逊的ELB/ALB),因此有些问题能被你很快解决。当涉及到裸机部署时,对外集群公开服务特别具有挑战性。

你可以用多种方式去解决这个问题。Kube-router已经有能力为集群IP和对外IP做广告去配置BGP对等点

以便在集群外很容易暴露服务。Kube-router通过使用LVS/IPVS隧道模式同样支持后台服务器直接响应用户。通过由Kube-router提供的构建模块,你可以按照上面提到的全网规模公司相同方式设计出在集群之外暴露的服务。

演示

请查看下面的演示,以了解kube-router如何将每个集群节点转换成一个L4转发器,它构建在IPVS/LVS之上。通过kube-router的每个节点也为配置的BGP路由器提供服务外部IP。在演示中,标准Linux运行的Quagga被用作路由器。演示中使用了Linux的本地流为基础的ECMP负载平衡。

视频:https://asciinema.org/a/145163

原文链接:Kube-router: Highly-available and scalable ingress for baremetal Kubernetes clusters(翻译:康良)

0 个评论

要回复文章请先登录注册