本文主要是介绍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内部运行探秘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!