解密 Kubernetes 网络:跟随数据包的奇妙旅程

2024年 3月 9日 97.1k 0

最近对于理解 Kubernetes 中的网络有很大的兴趣。本文是我对这个话题的贡献。我会尽力用直观的方式解释,并将技术部分翻译成易懂的语言,以便任何人都能理解。

最好的学习网络的方式是通过“追踪数据包”或“数据包的生命周期”。基本上,你要跟随数据包从发送者到接收者的旅程,并在每一步停下来。我以前就用 Calico 实现的 Pod 到另一个 Pod 的通信 进行了这样的操作。这次我将使用另一个容器网络接口 (CNI) 叫做 Cilium,它基于 eBPF(了解快速和灵活的路由),并带有许多强大的功能和工具。让我们开始吧!

Kubernetes 中的传统网络

我们将从头开始。我会假设你对网络一无所知。也许你已经知道 IP 地址是什么?IP 地址是计算机网络接口的数字地址。这就是你的计算机可以连接到你的 Wi-Fi 网络并让你访问互联网的方式。如果你使用的是笔记本电脑,你的 Wi-Fi 网络接口有一个 IP 地址。这个网络接口还有另一个由硬件提供商烧录的唯一地址。这个地址称为介质访问控制 (MAC) 地址。

IP 地址属于一个组(IP 子网)。为了知道它属于哪个组,它使用一种称为子网掩码的东西。当子网掩码应用到 IP 地址时,会得到一个结果,对于属于同一组的每个 IP 地址来说,这个结果都是相同的。这就像你所在的社区一样。

让我们用下面的图来做类比:

传统网络

传统网络

房子是一台计算机、服务器或虚拟机。它的大小可以不同,根据它的 CPU 和内存,但为了简单起见,我们使用相同的大小。一栋房子有一扇门,这就是你的网络接口。门上的序列号是你的 MAC 地址,房子上的数字(通常是钉在门上的)是你的 IP 地址。只有在你换门时,你的序列号才会改变。然而,你的房子号码是由你的社区的建筑师分配的,如果有重新分配或设计更改,它可能会改变。

蓝色的第 10 个社区(使用从 10 到 19 的数字)属于同一组(同一 IP 子网),而绿色的第 20 个社区是另一组。在每个社区中,有五栋房子,所以有空间让社区成长。在每个社区里,门直接连接到一个喷泉,代表一个交换机。在喷泉处,有一个指示每条路径的标志,指示你可以到达哪扇门。是的,喷泉不知道房子号码,只知道门的序列号。对于人类来说,这不是很方便,所以我们使用一张地图(称为 ARP 表),它提供了房子号码与门的序列号之间的转换。

如果你住在 14 号房子,想拜访 15 号房子,你会使用这条路(只有一条,而且是你的,所以不会有交通堵塞!)先到达喷泉,然后看看标志。你从地图上知道哪个序列号对应哪个房子,所以你可以沿着通往 15 号房子的路线前往。在这种星形拓扑中,你总是先去喷泉,而不是直接去你想要拜访的房子,因为没有直接的路径。社区内的路径代表了第 2 层链接。你无法通过这些路径到达另一个社区。

在社区之间旅行

现在,如果从你的 14 号房子,你想要去拜访 24 号房子怎么办?这是另一个社区,这意味着 14 号的 IP 地址/子网掩码与 24 号不同。实际上,第 10 和第 20 社区是不同的。所以你知道目的地是另一个社区,这种情况下,你必须首先去找你的门卫(但总是通过喷泉,正如我们所见)。他是你社区的默认网关,他住在 11 号房子。规则是去找他,对于任何目的地在你社区之外的地方。

只有他有地图(路由表)能够到达第 20 号社区,并且知道应该走哪条路(这被称为第 3 层路由,因为你正在离开你的社区)。这张地图显示了到达 20 号社区的正确门。等一下,如果一扇门是一个网络接口,那么门卫房子是不是还有另一扇门?完全正确!11 号房子有另一扇门,门上有另一个号码(101),当然这扇门上有另一个序列号(MAC 地址)。

通过这扇门出去,你现在可以沿着路径到达第 20 号社区,这个社区有自己的门卫在 21 号房子。这个门卫的地图(路由表)指导你到达目的地的正确门。这扇门让你进入了第 20 号社区,因为你的目的地 24 属于它。门卫还给了你地图(ARP 表),所以你可以在喷泉上找到方向。现在,你可以沿着通往绿色喷泉的路径走了。从那里,你只需跟着标志和路径到达 24 号房子。当你想回家时,你沿着相反的方向走同样的路径回去。

Kubernetes 中的网络

现在你了解了网络的基础知识,让我们来看看在 Kubernetes 中它是如何工作的。是的,它稍微复杂一些,但让我们一步一步来,使用下面的图片来更好地理解:

使用 Cilium 的 Kubernetes 网络

使用 Cilium 的 Kubernetes 网络

我们现在没有房子,而是建筑。建筑之间的网络与传统网络仍然相同,中间有一个交换机/喷泉。建筑的入口有一扇门,上面有建筑的号码(它的 IP 地址),它是 1000 个社区的一份子。一个建筑将代表我们 Kubernetes 集群的一个节点。

你知道 Kubernetes 是一个容器编排器。一个容器包装成一个 pod。为了简单起见,让我们假设一个 pod 只有一个容器,因此这两个术语在这里是等价的。这个 pod 就像我们建筑中的一个私人部分。公寓的大小可以不同,因为它可能有 2、3 或 4 个卧室,这将是你的容器在节点上需要的 CPU 和内存容量。有些公寓是空的,所以建筑仍然有一些容量。然而,在 Kubernetes 中,pod 是根据需要创建和删除的。所以在我们的建筑中,这意味着有时会创建一个 2 卧室的公寓,当不再使用时,它可能会被从建筑物中移除。然后,如果建筑有足够的空间,可能会创建一个 5 卧室的公寓。然后想象一下,这是一座乐高建筑,里面你可以根据需要建造和拆除不同大小的公寓!这不是很棒吗?

在每个建筑物中,容器/pod 有自己的社区(IP 子网)。在 Kubernetes 中,CNI 的功能基本上是为 pod 分配号码(IP 地址),以便它们可以彼此通信。默认情况下,Cilium 为每个建筑使用不同的社区。当创建一个公寓时,Cilium 会为其分配一个号码。当删除并重新创建一个公寓时,它将获得另一个号码,因此它是临时的。这里蓝色的社区使用 10 号范围,绿色的社区使用 20 号。你可以注意到蓝色和绿色社区的数字范围与建筑物的范围不同。只是为了让你知道,这种设计被称为叠加网络。还有其他可能的,但这是常用的一种。这是一个在节点网络之上的 pod 网络。

在同一建筑中的公寓之间旅行

现在,你住在 12 号公寓,你要怎么去拜访 14 号公寓?就像我们在传统网络示例中所做的那样,你是我们要追踪的数据包!当然,你通过它的门(它的网络接口)离开公寓。与我们之前的示例不同之处在于,你现在不是离开房子,而是离开了你的公寓,但仍然在建筑物内部。然后你走过一个私人走廊,到达另一扇门(这是 LXC 接口)。

这扇门给了你进入建筑的公共空间的访问,这里进行了路由和派发。我们称之为 Cilium 大厅(蓝色矩形)。当选择 Cilium 为这个 Kubernetes 集群提供通信时,每个建筑物都安装了这个大厅的 Cilium 代理。大厅里有一个门卫,他不住在公寓里,而是在大厅的一个甲板上等待。他有一个服务人员团队,在建筑物的不同门处等候提供指导。这是因为 Cilium 使用一个叫做 eBPF 的魔法路由地图,有效地帮助旅行者。

当你到达走廊尽头的门时,你向等在这里的服务人员表示你要去 14 号。他在他的魔法 eBPF 地图中找到了一个与 14 号相匹配的项目,并直接向你展示了右上角的走廊门。你不必去大厅,他向你展示了一条秘密通道,直接到达那里。然后你打开那扇门,跟着走廊,到达了 14 号公寓。你回去到 12 号公寓,沿着相同的路径和过程,但是方向相反。

因此,这种调度与传统的交换方式不同,并且非常快速,这要归功于魔法 eBPF 地图!

在不同建筑物的公寓之间旅行

现在,从 12 号公寓,你想去拜访另一个建筑物里的 22 号公寓。你的旅行开始和以前一样,你离开你的公寓,沿着走廊,询问等待在这里的服务人员的方向。由于目的地是另一个社区的 22 号,这次他把你引导到了大厅。在这里,与传统网络一样,你需要大厅中的门卫的帮助。门卫查看他的地图(路由表),指引你去 22 号的方向,并向你展示要使用的门号码 11(cilium_host)。

当你打开那扇门时,你会看到后面有另一扇门:那就是蓝色的三角形,称为 VXLAN 接口。这扇门通向一个漂亮的透明隧道,穿过建筑物的主门。你受到雨水的保护,可以欣赏到另一个建筑物的景色。你甚至可以看到室外的喷泉!当你到达绿色建筑物时,你离开隧道,去见在绿色三角形(VXLAN 接口)处等待你的服务人员。你告诉他你的目的地,他在他的魔法 eBPF 地图中找到了与 22 号相匹配的项目,并向你展示了一条通往左上角走廊门的秘密通道。然后你跟着走廊,到达了你的目的地。和以前一样,你回去的路线将沿着相同的路径,但方向相反。

这就是第 3 层路由,因为目的社区与你的不同。你可以看到在 Kubernetes 中比传统路由稍微复杂一些。

总结

希望这有助于你理解传统网络和 Kubernetes 网络之间的区别,也希望后者现在对你来说更清晰了。如果这就是你所需要的,那么我很高兴你阅读了这篇博文,希望你喜欢它。如果你现在想了解更多关于 Kubernetes 网络的内容,请保持关注,因为我将写一篇 中级篇,你将在其中看到一个真实集群上建筑物的样子!

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论