说说 Ulti-Network Ns 在Underlay下的应用
发布时间:2022-06-17 14:43 所属栏目:124 来源:互联网
导读:对容器而言,multiple namespace 这个技术的重要性怎么强调都不过分。因为 namespace 的出现,使得容器所用到的诸如 Hostname、Network、Mount Points 等资源被隔离起来,由公用变成独享。 技术的进步是一把双刃剑,基于 multi namespace 的容器在几乎重塑了
对容器而言,multiple namespace 这个技术的重要性怎么强调都不过分。因为 namespace 的出现,使得容器所用到的诸如 Hostname、Network、Mount Points 等资源被隔离起来,由公用变成独享。 技术的进步是一把双刃剑,基于 multi namespace 的容器在几乎重塑了云计算市场的形态和云计算机基础设施栈的同时,也给我们带来了陡峭的学习曲线。 OS 部分还包含了 eth 和 bridge 这样的网络设备(struct net_device)。虽然图中不同的 network ns 中的 eth 都叫 eth0 ,但 root network ns 中的 eth0 和其它网络设备有着本质的区别: root network ns 中的 eth0 是对网卡的软件抽象,也就是说它对应的是一个外部设备,如果这个网卡是物理的话,eth0 还包含控制该设备的一系列函数。 而图中其它的 eth0 和 bridge 都是对根本不存在的虚拟网络设备的抽象,说白了它们就只是一些不会与外部设备打交道的数据结构,这些数据结构存在的意义是为了可以最大程度上复用现有的代码逻辑和功能。它们可以作为媒介用来在同一个 OS 内进行进程间通信、用户态和内核态数据交换,但无法被用于外部通信。比如我们熟知的 loopback 设备,通过它可以使本机上两个进程间的 socket 通信完整地走完 TCP/IP 协议栈。 network namespace 我们说 network ns 用来隔离包括网卡(Network Interface)、回环设备(Loopback Device)、网络栈、IP 地址、端口等等在内的网络资源。它的特点是由可配置的数据组成。对于一个进程来说,这些要素,其实就构成了它发起和响应网络请求的基本环境。这里所谓“网络栈(Networking stack)”,包括了:路由表(Routing Table), network filter,iptables 规则等。 无论是一个 Linux 容器还是宿主机的进程所能看见的“网络栈”,实际上是被隔离在它们各自的 network ns 当中的,通信双方的网卡(如典型的 veth pair )也自然被隔离到相应的 namespace 中。 另外还有一个栈也会被经常提起:TCP/IP 协议栈。我们可以将 TCP/IP 协议栈看成是程序的代码部分,而网络栈看成是程序的数据部分。很显然 TCP/IP 栈应该是被这个 OS 上所有人共享的,无论是进程还是容器,甚至是基于 qemu-kvm 的虚拟机都共享着宿主机的协议栈,但网络栈却是各个 network ns 独享的。 二哥知道,上面的描述还是太抽象。所以我画了下面一张图。图 2 把内核中负责描述进程的数据结构 task_struct 和 network ns 之间的结构关系画出来了。进程 1 和进程 2 共享宿主机 root network ns,它包含网卡 eth0 。Pod 内的容器自然位于 Pod 自己的 network ns 中。但容器本质上也是进程而已,虽然在图中看起来 Pod 隔离了一个完全属于自己的 eth1,但在内核看来,一样也是用相同的数据结构来描述它和 network ns 之间的关系。 看完这个数据结构示意图,对于 TCP/IP 协议栈而言,希望下面两点描述没有让你感到困惑: 网络包无论是从容器内的网卡流出,还是离开容器后再与其它网络设备打交道,必然都会经过内核 TCP/IP 协议栈。 无论网络包是属于容器的还是属于宿主机 native process 的,对于内核 TCP/IP 协议栈而言,这些网络包只是属于不同的 network ns 而已。 (编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读