《Kubernetes网络权威指南》读书笔记 | 千呼万唤始出来:veth pair

Posted COCOgsta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Kubernetes网络权威指南》读书笔记 | 千呼万唤始出来:veth pair相关的知识,希望对你有一定的参考价值。

书籍来源:《Kubernetes网络权威指南:基础、原理与实践》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客


veth是虚拟以太网卡(Virtual Ethernet)的缩写。veth设备总是成对的,因此我们称之为veth pair。veth pair一端发送的数据会在另外一端接收,veth pair常被用于跨network namespace之间的通信,即分别将veth pair的两端放在不同的namespace里,如图1-2所示。

图1-2 veth pair示意图

仅有veth pair设备,容器是无法访问外部网络的。因为从容器发出的数据包,实际上是直接进了veth pair设备的协议栈。如果容器需要访问网络,则需要使用网桥等技术将veth pair设备接收的数据包通过某种方式转发出去。

下面,我们将演示veth pair的创建和使用:

创建的veth pair在主机上表现为两块网卡,我们可以通过ip link命令查看:

如上所示,新创建的veth pair设备的默认mtu是1500,设备初始状态是DOWN。我们同样可以使用ip link命令将这两块网卡的状态设置为UP。

veth pair设备同样可以配置IP地址,命令如下:

可以将veth pair设备放到namespace中。

veth pair设备的原理较简单,就是向veth pair设备的一端输入数据,数据通过内核协议栈后从veth pair的另一端出来。veth pair的基本工作原理如图1-3所示。

图1-3 veth pair 的基本工作原理图

1.2.1 veth pair内核实现

veth pair由内核实现,在veth pair设备上,任意一端(RX)接收的数据都会在另一端(TX)发送出去,veth pair在转发过程中不会篡改数据包的内容。

1.2.2 容器与host veth pair的关系

有没有办法知道host上的vethxxx和哪个container eth0是成对的关系呢?

方法1

首先,在目标容器里查看:

然后,在主机上遍历/sys/claas/net下面的全部目录,查看子目录ifindex的值和容器里查出来的iflink值相当的veth名字,这样就找到了容器和主机的veth pair关系。

方法2

在目标容器里执行以下命令:

从上面的命令输出可以看到116:eth0@if117,其中116是eth0接口的index,117是和它成对的veth的index。

当host执行下面的命令时,可以看到对应117的veth网卡是哪一个,这样就得到了容器和veth pair的关系。

方法3

可以通过ethtool -S命令列出veth pair对端的网卡index,例如:

而主机上index为6的网卡为:

以上是关于《Kubernetes网络权威指南》读书笔记 | 千呼万唤始出来:veth pair的主要内容,如果未能解决你的问题,请参考以下文章

《Kubernetes网络权威指南》读书笔记 | iptables

《Kubernetes网络权威指南》读书笔记 | 打通CNI与Kubernetes:Kubernetes网络驱动

《Kubernetes网络权威指南》读书笔记 | Kubernetes网络策略:为你的应用保驾护航

《Kubernetes网络权威指南》读书笔记 | 最常用的Docker网络技巧

《Kubernetes网络权威指南》读书笔记 | Linux隧道网络的代表:VXLAN

《Kubernetes网络权威指南》读书笔记 | 主角登场:Linux容器