Loading

Kubernetes:SDN网络模型

前言

A Guide to the Kubernetes Networking Model一文生动形象地介绍了Kubernetes中的网络模型,然而受篇幅所限,作者并没有对Pod跨节点通信时数据包在节点之间传递的细节进行过多讨论。

我们已经知道,Docker使用端口映射的方式实现不同主机间容器的通信,Kubernetes中同样也有hostPort的概念。但是当节点和Pod的数量上升后,手动管理节点上绑定的端口是十分困难的,这也是NodePort类型的Service的缺点之一。而一旦Pod不再“借用”节点的IP和端口来暴露自身的服务,就不得不面临一个棘手的问题:Pod的本质是节点中的进程,节点外的物理网络设备(交换机/路由器)并不知晓Pod的存在。它们在接收目的地址为Pod IP的数据包时,无法完成进一步的传输工作。

为此我们需要使用一些CNI(Container Network Interface)插件(如Flannel、Calico和Open vSwitch等)来优化Kubernetes集群的网络模型,这种新型的网络设计理念称为SDN(Software-defined Networking)。根据SDN实现的层级,我们可以将其分为Underlay Network和Overlay Network:

Overlay 网络允许设备跨越底层物理网络(Underlay Network)进行通信,而底层却并不知晓 Overlay 网络的存在。Underlay 网络是专门用来承载用户 IP 流量的基础架构层,它与 Overlay 网络之间的关系有点类似物理机和虚拟机。Underlay 网络和物理机都是真正存在的实体,它们分别对应着真实存在的网络设备和计算设备,而 Overlay 网络和虚拟机都是依托在下层实体使用软件虚拟出来的层级。

Underlay Network

利用Underlay Network实现Pod跨节点通信,既可以只依赖TCP/IP模型中的二层协议,也可以使用三层。但无论哪种实现方式,都必须对底层的物理网络有所要求。

二层

202105072039

如图所示,Pod与节点的IP地址均处于同一网段。当Pod1向另一节点上的Pod2发起通信时,数据包首先通过veth-paircbr0送往Node1的网卡。由于目的地址10.86.44.4与Node1同网段,因此Node1将通过ARP广播请求10.86.44.4的MAC地址。

CNI插件不仅为Pod分配IP地址,它还会将每个Pod所在的节点信息下发给SDN交换机。这样当SDN交换机接收到ARP请求时,将会答复Pod2所在节点Node2的MAC地址,数据包也就顺利地送到了Node2上。

三层

202105080143

如图所示,Pod与节点的IP地址不再处于同一网段。当Pod1向另一节点上的Pod2发起通信时,数据包首先通过veth-paircbr0进入宿主机内核的路由表(Routing Table)。CNI插件在该表中添加了若干条路由规则,如目的地址为Pod2 IP的网关为Node2的IP。这样数据包的目的MAC地址就变为了Node2的MAC地址,它将会通过交换机发送到Node2上。

由于这种实现方式基于三层协议,因此不要求Node1和Node2处于同一网段。如下图所示,此时需要将目的地址为Pod2 IP的网关设置为路由器的IP。数据包的目的MAC地址首先变为路由器的MAC地址,然后经过路由器后再变为Node2的MAC地址。

202205080146

通过上面的描述我们可以发现,想要实现三层的Underlay网络,需要在多个节点间下发和同步路由表。于是很容易想到用于交换路由信息的BGP(Border Gateway Protocol)协议:

边界网关协议(英语:Border Gateway Protocol,缩写:BGP)是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或“前缀”表来实现自治系统(AS)之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。

对于Calico的BGP模式来说,我们可以把集群网络模型视为在每个节点上都部署了一台虚拟路由器。路由器可以与其他节点上的路由器通过BGP协议互通,它们称为一对BGP Peers。Calico的默认部署方式为Full-mesh,即创建一个完整的内部BGP连接网,每个节点上的路由器均互为BGP Peers。这种方式仅适用于100个节点以内的中小型集群,在大型集群中使用的效率低下。而Route reflectors模式则将部分节点作为路由反射器,其他节点上的路由器只需与路由反射器互为BGP Peers。这样便可以大大减少集群中BGP Peers的数量,从而提升效率。

Overlay Network

Overlay网络可以通过多种协议实现,但通常是对IP数据包进行一层外部封装(Encapsulation)。这样底层的Underlay网络便只会看到外部封装的数据,而无需处理内部的原有数据。Overlay网络发送数据包的方式取决于其类型和使用的协议,如基于VxLAN实现Overlay网络,数据包将被外部封装后以UDP协议进行发送:

20210508103310

Overlay网络的实现并不依赖于底层物理网络设备,因此我们就以一个两节点不处于同一网段且Pod与节点亦处于不同网段的例子来说明Overlay网络中的数据包传递过程。集群网络使用VxLAN技术组建,虚拟网络设备VTEP(Virtual Tunnel End Point)将会完成数据包的封装和解封操作。

202105080221

Node1上的VTEP收到Pod1发来的数据包后,首先会在本地的转发表中查找目的Pod所在节点的IP,即192.168.1.100。随后它将本机IP地址10.86.44.2、Node2的IP地址192.168.1.100和Pod1的VNID(VxLAN Network Identifier)封装在原始数据包外,从Node1的网络接口eth0送出。由于新构建的数据包源/目的地址均为节点的IP,因此外部的路由器可以将其转发到Node2上。Node2中的VTEP在接收到数据包后会首先进行解封,若源VNID(Pod1的VNID)与目的VNID(Pod2的VNID)一致,便会根据原始数据包中的目的地址172.100.1.2将其发送到Pod2上。此处的VNID检查,主要是为了实现集群的网络策略管理和多租户隔离。

总结

通过对上述几种SDN网络模型的讨论,我们可以发现只有Overlay网络需要对数据包进行封装和解封,因此它的性能相比于Underlay网络较差。但Overlay网络也有以下优点:

  • 对底层网络设备的依赖性最小。即使Pod所在的节点发生迁移,依然可以通过Overlay网络与原集群实现二层网络的互通;
  • VNID共有24位,因此可以构造出约1600万个互相隔离的虚拟网络。

参考文献

About Kubernetes Networking

边界网关协议

Configure BGP peering

为什么集群需要 Overlay 网络

posted @ 2021-05-09 20:05  koktlzz  阅读(465)  评论(0编辑  收藏  举报