在开始之前,先对openstack中的网络框架进行一个简单的讲述。
如上是openstack中的两类物理节点:网络节点+计算节点。
在计算节点上创建虚拟机之后,虚拟机虚拟网卡通过linux bridge(这里的qbr)与br-int连起来。这里的A就是虚拟机的虚拟网卡,B是一个tap设备。C与D是连接linux bridge与br-int的一对tap设备,一般C叫qvb,D叫qvo。br-int是ovs虚拟化出来的网桥,作为虚拟机交换机的功能。br-int通过patch-tun连接到ovs虚拟化出来的网桥br-tun上,br-tun作为通信层,通过tunntl与其他计算节点和网络节点通信。
在网络节点这边与计算节点类似,也有两个ovs的网桥br-tun与br-int。如果有多个虚拟机路由会通过tap设备连接到br-int。
为了验证内网之间的网络隔离,此次我创建两个IP段一样的内网,同时创建两台IP地址一样的虚拟机进行验证。
首先通过/var/lib/nova/instances两台虚拟机的libvirt.xml文件查看虚拟机网络设备
tv-test-1:网络:T-network
tv-int:网络:int
在计算节点查看ovs网桥
通过开头的网络分析,在这可以看到连接到br-int的两台虚拟机的qvo设备与他们的tag:
tv-int:qvobb5f6443-9d tag=2
tv-test1:qvo1020f310-ea tag=5
查看计算节点的流表
可以看到在这里,通过tag封装了vlan id了。同时封装了tunnel id标识:
tv-int:vlan=2 tunnetl_id=0x35
tv-test1:vlan=5 tunnel_id=0x53
通过多次验证可以得出不同的网络vlan id是不一样,相同的网络vlan id是一致的。
不同的网络tunnel_id也是不一致的
网络节点:
在网络节点看进来的:
通过查看tunnetl_id可以看到0x53映射了网络节点vlan id=6;0x35映射的vlan_id=1
为了印证他们的网络隔离,我们需要查看tag了:
通过以上两幅图可以看出:
tv-test1:vlan=6对应的网络的id是711c54fc-97c4-46e8-8ecf-2beae0fda6e4 (网络 T-network)
tv-int:vlan=1对应的网络的id是680b4f5c-f03b-43b5-9f11-a3aef4d01d9a(网络 int)
总结:
也就是说虚拟机内网之间是通过vlan_id与tunnel_id双重封装的。