Tungsten Fabric知识库丨vRouter内部运行探秘

2024-04-26 16:08

本文主要是介绍Tungsten Fabric知识库丨vRouter内部运行探秘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:
https://github.com/tnaganawa/tungstenfabric-docs/blob/master/TungstenFabricKnowledgeBase.md

作者:Tatsuya Naganawa 译者:TF编译组

本系列为“Tungsten Fabric入门宝典”的姊妹篇,补充介绍有关Tungsten Fabric部署的各类主题。

vhost0设备

首次启动vRouter时,将创建vhost0接口,并将最初分配给物理接口的IP和MAC移至vhost0。

因此,自然假设的情况是,vhost0是vRouter本身,它对外部结Fabric进行ARP响应,流量首先通过vhost0,然后进入虚拟机。

transit traffic:vm - vhost0 - eth0
self traffic:vhost0 - eth0

实际上,事实并非如此。

  • 作为说明,当在vhost0上对诸如VXLAN之类的overlay流量执行tcpdump时,它不会显示一些数据包,需要针对物理接口的tcpdump才能实现这个目的。

  • 这个文档也有助于您理解:https://wiki.tungsten.io/display/TUN/Offloads?preview=%2F1409118%2F1409513%2FTungsten+Fabric+ParaVirt+Offload+Arch.DOCX

transit traffic:vm - (dp-core) - eth0
self traffic:vhost0 - (dp-core) - eth0

在由dp-core服务的某些桥接域(bridge-domain)中,vhost0与irb相似,而eth0是此桥接域中的L2接口之一。

  • 在vRouter术语中,此状态称为“xconnect
    (cross-connect)”,就我的理解来说,它类似于桥接:https://github.com/tungstenfabric/tf-vrouter/blob/master/dp-core/vr_interface.c

  • 桥接域(bridge-domain)是与Linux网桥类似的概念,它可以具有多个物理L2接口和一个内部L3接口。

因此,当eth0首次收到来自Fabric的ARP请求时,dp-core将基于最初分配给eth0的MAC地址返回ARP响应。

然后其它计算节点将向该vRouter节点发送一些流量,例如overlay流量或自流量(self-traffic)。

使用overlay流量时(基于udp端口或gre标头,它由dp-core标识),dp-core会剥离外部IP和标签,并进行VRF路由到标签所指示的特定VM。

  • 使用L3 VXLAN时,它将基于L3 VRF中的路由表进行路由查找
  • 使用MPLS时,标签本身会标识最终接口

当dp-core接收到自流量(self traffic)后,将在vhost_tx中使用hif_rx(后者又使用linux函数netif_rx,以skb作为参数)将流量发送到vRouter节点上的linux接口,即vhost0。

  • https://github.com/tungstenfabric/tf-vrouter/blob/master/dp-core/vr_interface.c#L813
  • https://github.com/tungstenfabric/tf-vrouter/blob/master/linux/vr_host_interface.c#L2380
  • https://github.com/tungstenfabric/tf-vrouter/blob/master/linux/vr_host_interface.c#L228

因此,对于用于自流量(self-traffic)的rx / tx,数据包始终通过dp-core,而对于传输流量(transit traffic),则不会通过vhost0。

skb to vr_packet

Linux网络堆栈使用sk_buff作为数据包的内存存储。

而在dp-core中,则使用vr_packet,因此它们之间如何转换是一个有趣的主题。

为此,使用vp_os_packet函数。

  • https://github.com/tungstenfabric/tf-vrouter/blob/master/include/vr_linux.h#L10
static inline struct sk_buff *
vp_os_packet(struct vr_packet *pkt)
{return CONTAINER_OF(cb, struct sk_buff, pkt);
}

因此,实际上vr_packet是在skb结构中的某个位置定义的(sk_buff->cb,它是某些应用程序使用的成员变量)。从而,skb和vr_packet可以通过指针操作进行转换。

请注意,由于cb最大为48字节,因此vr_packet不能大于该数值。这里有一些关于此问题的讨论。

https://github.com/tungstenfabric/tf-vrouter/blob/master/include/vr_packet.h#L195-L198

/** NOTE: Please do not add any more fields without ensuring* that the size is <= 48 bytes in 64 bit systems.*/

vRouter创建的Linux接口

首次启动vrouter-agent容器时会创建多个接口,即使vrouter-agent停止,实际上也不会删除该接口。

出于什么目的使用它,是一个有趣的主题。

综上所述,vrouter.ko中的vif接口始终与相应的linux netdevice绑定,因此使用vif --create等创建一些vRouter接口,同时也将创建linux netdevice,这可以从ip link或ls /sys/class/net中看到。

来自“ip tuntap list”的一个例证。

[root@ip-172-31-12-55 ~]# ip -o a
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
1: lo    inet6 ::1/128 scope host \       valid_lft forever preferred_lft forever
2: ens3    inet6 fe80::46c:bff:fec8:dd64/64 scope link \       valid_lft forever preferred_lft forever
3: docker0    inet 172.17.0.1/16 brd 172.17.2

这篇关于Tungsten Fabric知识库丨vRouter内部运行探秘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938028

相关文章

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

使用DeepSeek搭建个人知识库(在笔记本电脑上)

《使用DeepSeek搭建个人知识库(在笔记本电脑上)》本文介绍了如何在笔记本电脑上使用DeepSeek和开源工具搭建个人知识库,通过安装DeepSeek和RAGFlow,并使用CherryStudi... 目录部署环境软件清单安装DeepSeek安装Cherry Studio安装RAGFlow设置知识库总

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x