社区的实现图,网上到处可以找到,就不涉及到版权问题了
左边计算节点的qbr-xxx就是额外添加的Linux Bridge,这里的两台虚拟机VM1和VM2,它们的网卡连接到物理机的TAP设备上,然后通过veth pair(A-B)连接到qbr的端口vnet0上,之后继续通过veth pair(C-D)连接到br-int上,后面的ID后缀XXX都一样,表示是同一个虚拟机网络到物理网络的连接上
如今OpenStack,假如是虚拟机之间东西流量,是不经过网络节点的转发,直接通过br-int来完成,但这里有点奇怪的是,TAP设备没有直接连在br-int上,而是经过了一个qbr进行中转,有点莫名其妙,不过从图中左侧的安全组可以看出一些安全策略原因,其实就是通过iptables来实现的,但是OVS是并不支持应用iptables规则的TAP设备的,因此才让qbr来实现iptables的security group功能
社区br-int查询如下:
$ sudo ovs-vsctl show | less Bridge br-int Port "qvo-XXX" tag: 1 Interface "qvo-XXX" Port patch-tun Interface "tap05a76b36-4d" type: patch options: {peer=patch-int} Port br-int Interface br-int type: internal
br-int为内部端口
patch-tun连接到br-tun上,实现了到外部网络的隧道
qvo-XXX带有tag1,说明这个口是一个1号vlan的access端口;虚拟机发出的从该端口到达br-int的网包将被自动带上vlan tag 1,而其它带有vlan tag 1的网包则可以在去掉vlan tag后从该端口发出(即vlan access端口);这个vlan tag是用来实现不同网络相互隔离的,当租户创建了一个网络,就会被分配一个唯一的vlan tag
br-int在GRE模式中作为一个NORMAL交换机来使用,如果同一节点上存在同一租户的两个虚拟机,他们之间的通信只需要经过br-int即可完成