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

本文详细探讨了Tungsten Fabric中的vRouter组件,包括vhost0设备的角色,skb到vr_packet的转换,以及vRouter创建的Linux接口的功能。vhost0并非直接处理所有流量,而是与dp-core服务的桥接域交互,处理overlay流量和自流量。此外,文章还介绍了dp-core如何处理数据包,并讨论了vRouter如何与Linux接口交互以提升性能。
摘要由CSDN通过智能技术生成

原文链接:
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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值