Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?
如果你曾搭建过Kubernetes集群,就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间,你要同时应对许多变动的因素。对于许多配置而言,使用二层(L2)网络就完全能满足需求。但边界网关协议(BGP)—— 支撑互联网运行的技术 —— 也逐渐出现在有关Kubernetes的讨论中。那么,为什么人们对在Kubernetes中使用BGP而非二层网络如此兴奋呢?
让我们详细剖析一下,看看究竟为何如此。
首先,我们这里在讨论什么?
在Kubernetes中部署服务时,目标是让这些服务能从外部访问到。外部可能指其他内部服务、外部用户,或者两者皆是。而实现这种可访问性的 “方式” 归根结底在于网络配置。默认情况下,Kubernetes对这种复杂性进行了抽象处理,但当你在裸机层面进行管理时,就需要深入了解其中细节了。
二层网络是传统的以太网式网络通信方式。它在同一广播域(基本上就是你的本地网络)内运行,并使用诸如地址解析协议(ARP)等协议将IP地址映射到MAC地址。可以把它看作是服务通告的 “本地” 选项。
另一方面,边界网关协议(BGP)是一种路由协议,旨在处理不同网络之间的通信。它不局限于在本地网络内工作,而是通告哪些IP地址或子网属于何处 —— 无论是在数据中心内部还是外部。
为何在Kubernetes中使用BGP?
本质上,BGP允许你的Kubernetes集群直接向路由器通告服务IP,从而无需依赖二层网络基于广播的通信方式。这带来了一些显著的优势:
1. 更强的可扩展性
二层网络在小型集群中运行良好,但随着环境规模的扩大,广播噪声也会随之增加。想象一下,几十甚至几百个节点相互大声发送ARP请求的场景。BGP的扩展性则要好得多,因为它不依赖广播。它只是简单地告诉路由器:“嘿,我这里有这个IP。”
2. 高可用性和故障转移
使用二层网络时,如果持有服务IP的节点出现故障,Kubernetes在重新调配资源时会有延迟。BGP则能很好地解决这个问题。当一个节点发生故障时,通往其IP的路由会从网络中撤销,流量会自动流向托管该服务的另一个节点。这个过程快速且无缝。
3. 全网集成
二层网络局限于本地网络,而BGP可以突破这一限制。它直接与上游路由器和对等设备通信,使外部设备能够准确知道将流量发送到何处。这在多数据中心或混合云配置中特别有用。
为何不一直使用二层网络呢?
在你认为BGP能解决Kubernetes所有问题之前,我们也不能完全否定二层网络。对于较小的配置或家庭实验室而言,二层网络通常更易于管理和部署。像MetalLB这样的工具可以高效处理基于二层的IP通告,对许多用户来说,这就足够了。
以下是二层网络的优势所在:
- 简单性:二层网络不需要复杂的路由器配置,也无需深入了解网络协议。
- 低资源需求:无需额外的CPU周期或内存来处理路由通告和计算。
但是,当节点数量超过几个,或者需要强大的故障转移和负载均衡功能时,二层网络就会显得力不从心。这时BGP就派上用场了。
BGP为何如此重要?
可以把BGP看作是Kubernetes网络的升级版。BGP不再依赖简单的广播机制,而是通过直接与网络基础设施进行通信,让你的集群变得更智能。这就是为什么大规模部署,尤其是在生产环境中,更倾向于使用BGP。
主要优势:
- 动态路由通告: Dynamic Route Advertising
BGP动态通告哪些节点可以处理特定IP或子网的流量。如果一个节点离线,BGP几乎能立即更新网络,确保停机时间最短。 - 等价多路径路由:Equal-Cost Multi-Path Routing(ECMP)
使用BGP,你可以将流量均匀分配到多个节点或网络路径上。这意味着更好的性能和更少的瓶颈。 - 消除单点故障
BGP让你能够构建冗余的高可用网络。通过将集群中的所有节点与路由器建立对等连接,你可以避免单个节点成为所有流量的网关。
在Kubernetes中开始使用BGP
如果你准备尝试使用BGP,像MetalLB这样的工具会让这个过程更轻松。MetalLB是裸机Kubernetes集群的负载均衡器,它同时支持二层和BGP模式。
- 在二层模式下,MetalLB使用ARP在本地网络内通告IP。这是默认设置,适用于小规模配置。
- 在BGP模式下,MetalLB与你的路由器或其他网络设备建立对等连接,以便在整个网络中通告IP。
使用MetalLB配置BGP的步骤:
- 安装MetalLB
将MetalLB的清单文件添加到你的集群中,并为BGP模式配置其configMap。 - 设置BGP对等体(Peers)
你需要配置网络路由器或交换机,使其与Kubernetes节点建立对等连接。这通常涉及共享自治系统号(ASN)并设置安全措施(如MD5认证)。 - 通告IP
一切就绪后,MetalLB将动态处理IP通告。
那么,结论是什么呢?
如果你运行的是小型Kubernetes配置或家庭实验室,通常二层网络就足够了。它简单明了,且能满足需求。但如果你管理的是更大的生产环境,或者需要处理高可用性和多节点故障转移,BGP则能提供显著优势。这不仅仅是关于 “炫酷技术”,它确实能让你的网络更智能、更可靠。
归根结底,BGP和二层网络的选择取决于规模和复杂性。对许多人来说,BGP可能有些大材小用,但对另一些人来说,它是充分发挥Kubernetes集群潜力的关键。而且,一旦你完成设置,看着网络自动处理一切,还挺神奇的。
参考:
- https://medium.com/@PlanB./bgp-vs-layer-2-in-kubernetes-whats-the-big-deal-ca4269720442
- 《kubernetes in action》