Veth
定义
Veth 是 Linux Kernel 中提供的一套虚拟网络设备接口,顾名思义为虚拟网络设备,通过在 Kennel 中注册虚拟网络设备并交付给其它应用使用,能够用来向其它服务(如容器)提供解耦式的网络代理功能。目前的 Docker 及 K8s 网络实现中均使用此方式来为容器提供网络服务。
使用方式
Veth 在申请时为成对出现,申请的应用程序会同时获得一对网络设备,拥有不同的设备名称,两个设备默认关联。可以向其中一个设备发送网络数据包,此时数据包会经过 Kernel 的转发从另一端的 Veth 网络设备中接收,反向通信同理。
进阶用法可以将 Veth 设备的一端绑定至物理网口或其它设备上进行使用。
评价
对于容器中采用此特性的实现,能够很好地为容器模拟真实主机的运行环境,内核能够通过标准网络通信接口为容器提供服务,而 runtime 可以接管容器的网络通信并且在其上做各种协议封装过滤等功能,效果很好。
此特性由内核提供,当内核本身成为瓶颈时这种通信方式则会遭遇瓶颈。由于内核转发需要在内核态与用户态间切换,存在一定的开销,需要进一步获得更高性能时可以考虑内核旁路模式执行,如 [[OVN]]、DPDK等实现。