分享

浅谈容器网络原理

 InfoRich 2024-04-11 发布于江苏

因为最近工作比较忙,这次拖更比较久,请大家谅解。原计划说一下K8S中的Service,但因为理解了K8S的网络原理之后,再去看Service的话,可以更加的清晰和简单,所以接下来的一系列文章,我们会说一下容器以及K8S的网络原理。

点关注👇👇👇不迷路

我们已经知道其实容器的产生并不是因为出现了很多新的技术,更多的是利用了Linux本身提供的能力(包括namespace的隔离机制与cgroup的限制机制以及rootfs等),容器的网络也是如此,它没有创造很多新潮的技术,更多也是利用了Linux的原生能力。

Linux的namespace机制为容器提供了隔离的功能,使得我们在容器中看到了一个新的天地,好像进入了一个新的操作系统,这个时候我们查看网络信息,会发现也是全新的(包括网卡、本地回环设备、路由表和 iptables 规则),这是怎么做到的呢?这就是利用了namespace中的Network namespace实现了网络的隔离,使得每个容器都拥有了自己的网络体系(学名叫做网络栈)。

虽然容器有自己的网络栈,但是毕竟它还是需要与外界进行通信的,要想与外界通信就要经由宿主机的网络栈,如下图所示:

Image

如何通容器的网络空间与主机的网络空间呢?Linux中有一种虚拟设备叫做veth pair,它是一种成对出现的网络设备,数据从一个veth设备发送出去,可以直接到达配对的另一个veth设备,可以简单理解为它们之间是由网线连接的,如下图所示。它们的两端可以放到不同的网络空间,实现通两个network namespace的目的。

Image

veth pair 可以连通两个网络空间,如果我们想要将多个 namespace连通的话 ,就不能只使用 veth pair 了。我们可以类比生活中的物理网络,把网络空间比作不同的主机,在物理网络中,如果需要连接多个主机,我们一般会使用交换机。而Linux 提供了交换机的虚拟实现,叫做虚拟网桥(Bridge),我们可以在主机上创建一个虚拟网桥,然后将各个容器网络空间通过veth pair 与Bridge连接,这样就实现了各个容器网络空间的打通,如下图所示。

Image

veth在容器中的一端就可以作为本容器网络空间的网卡,有了虚拟网桥,同一个宿主机的容器之间就可以相互通信了,容器内的应用也可以通过虚拟网桥,再经由宿主机网卡访问外部服务。

以上也就是Docker桥接模式的网络原理(桥接模式是Docker主要的网络模式,本文的讲述都是基于此),只不过Docker创建的虚拟网桥有自己的名字:docker0。

在 Docker 中,管理容器的网络的是Docker 守护进程(daemon)。在桥接网络模式下,Docker 守护进程会执行以下主要任务:

1.  创建和管理虚拟网络桥(docker0)Docker 守护进程在启动时会创建 docker0 虚拟网络桥,守护进程负责管理这个网桥的配置和状态,确保容器能够正常通过这个网桥进行通信。

2. 分配容器的虚拟网络接口和 IP 地址当用户创建一个新的容器时,Docker 守护进程会为该容器创建一对虚拟的网络接口,并为其容器中的一端分配一个唯一的 IP 地址,另一端连接到docker0 网桥。

在Linux下,我们通过“ifconfig”命令就可以看到,宿主机出现了以下网络接口,他们就是docker0网桥以及容器“插在”docker0网桥上的veth设备。

Image

Image

3. 执行网络地址转换(NAT)当容器需要与外部网络通信时,Docker 守护进程会执行网络地址转换。NAT 允许容器使用宿主机的 IP 地址访问外部网络,同时也允许外部网络访问容器提供的服务。

为什么要进行NAT呢?让我们考虑一种场景:假如容器要访问百度首页,百度的Server要返回给容器数据,如果百度的Server将目的地址设置为容器的IP,由于容器的IP在外部是不可见的,就会导致结果的数据包无法返回,所以在发送请求给百度Server时需要将源IP转换为宿主机的IP。

4. 管理端口映射(Port Mapping)Docker 守护进程负责管理容器内部端口与宿主机上的端口之间的映射关系。当用户定义了端口映射规则时,守护进程会在宿主机的网络命名空间中设置相应的转发规则,以实现外部网络与容器内部服务的通信。

为什么要进行端口映射呢?因为容器内部的端口在外部也是无法访问的,需要将宿主机的端口与之进行映射。

如下图所示:

Image

Docker的桥接模式下,同一宿主机的容器之间是可以相互通信的,容器也可以访问外部网络,但在这种模式下,不同宿主机的容器之间是没有关联的,他们无法进行直接通信。

所以我们就需要一种方案,可以把一个集群中多个宿主机上的容器组织起来,使得它们之间的网络可以连通,我们在后续的文章中会对这些方案进行介绍,敬请期待。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多