有4种不同的虚拟网络设备:TAP设备,veth pair,Linux bridge 和 Open vSwitch bridge。

对于一个以太网数据帧从虚拟机 vm01eth0 传输到物理网络,它必须通过主机的 9 个设备: TAP vnet0,Linux bridge qbrnnn,veth pair ( qvbnnn , qvonnn ),Open vSwitch bridge br-int, veth pair ( int-br-eth1phy-br-eth1 ),以及,最后通过物理网卡 eth1

 

内部bridge和外部bridge通过一个veth pair ( int-br-ex , phy-br-ex ) 连接,这个案例中使用3层连接来路由从内部网络到外部网络的数据包:在veth pair间没有数据包通过。

 

 

方案一:Compute 主机配置

_images/under-the-hood-scenario-1-ovs-compute.png

 

TAP设备,例如 vnet0 就是KVM或者Xen这样的hypervisor实现的虚拟网络接口卡(通常称为VIF或者vNIC)。一个以太网帧发送给TAP设备由guest操作系统接收。

一个 veth pair 是一个直接连接到虚拟网络接口的设备对。一个发送给veth pair的一端的以太网帧将被veth pair另一端所接收。Networking服务使用veth pair作为虚拟网线来连接不同的虚拟bridge。

一个Linux bridge就类似一个hub:你可以连接多个(物理或虚拟)网络接口设备到Linux bridge。任何以太网帧从连接到bridge的一个接口进入就会传送到所有连接在这个bridge的其他设备。

一个Open vSwitch bridge特性则类似一个虚拟交换机:网络接口设备连接到Open vSwitch bridge的接口,这些接口配置类似一个物理交换机接口,包括VLAN配置。

br-int Open vSwitch bridge是一个集成bridge:所有在Compute主机上的guest虚拟机都连接这个bridge。Networking通过配置 br-int 接口来实现隔离这些guest操作系统。

br-eth1 bridge提供连接到物理网卡 eth1 ,而内部网桥的连接是通过 veth pair ( int-br-eth1 , phy-br-eth1 ) 实现的。

在这个案例中,net01 和 net02 分别使用 VLAN id 是 1 和 2。然而,物理网络支持VLAN ID是101到110。这里Open vSwitch agent在 br-int br-eth1 上负责配置数据流规则进行VLAN转换。当 br-eth1phy-br-eth1 的接口上接收到一个标记为VLAN ID 1的数据帧,它就将数据帧的VLAN ID修改成101。类似的,当 br-int int-br-eth1 的相应接口接收到标记为VLAN ID 101的数据帧,就反过来将VLAN ID修改成1。

理想情况下,TAP设备 vnet0 将直接连接到集成的bridge br-int 上。但是很不幸,这是不能这么做,因为要实现OpenStack安全组策略。OpenStack使用TAP设备(如 vnet0 )上的iptables规则来实现安全组策略,并且Open vSwitch不能兼容直接连接到Open vSwitch接口上的TAP设备的iptables规则。

Networking使用一个额外的Linux bridge和veth pair来解决这个问题。vnet0不是连接到一个Open vSwitch bridge,而是连接到一个Linux bridge qbrXXX 设备。这个bridge通过(qvbXXX, qvoXXX) veth pair 连接集成bridge br-int

network主机运行 neutron-openvswitch-plugin-agent , neutron-dhcp-agent , neutron-l3-agentneutron-metadata-agent 服务。

在network主机上,假设 eth0 连接外部网络, eth1 连接data网络,则 ovs_neutron_plugin.ini 配置如下:

[ovs]
tenant_network_type = vlan
network_vlan_ranges = physnet2:101:110
integration_bridge = br-int
bridge_mappings = physnet1:br-ex,physnet2:br-eth1

以下示意图显示network主机上的网络设备

以下示意图显示network主机上的网络设备

_images/under-the-hood-scenario-1-ovs-network.png

在compute主机,使用一个Open vSwitch 内部bridge (br-int) 和一个Open vSwitch bridge连接数据网络(br-eth1),并且两者通过一个veth pair连接,并且 neutron-openvswitch-plugin-agent 配置在两个交换机的接口上做VLAN转换。

在一个附加的Open vSwitch bridge br-ex 连接到物理接口联通外部网络,这个物理接口是eth0。

在network主机上使用Open vSwitch内部端口。内部端口可以设置一个或多个IP地址给一个Open vSwitch bridge。在上面的案例中,br-int bridge有4个内部接口: tapXXX , qr-YYY , qr-ZZZtapWWW 。每个内部接口有一个独立的IP地址。在内部接口, qg-VVV 则在 br-ex bridge 上。

默认,Networking DHCP 代理使用一个称为 dnsmasq 的进程提供DHCP服务给guest系统。Networking必须给每个请求DHCP服务的网络创建一个内部接口并附加一个dnsmasq进程到那个接口上。在以上案例中, tapXXX 接口就是在 net01_subnet01 上,而 tapWWW 接口就是在 net02_subnet01 上。

Networkging L3 agent使用Open vSwitch内部接口来实现路由和依靠network主机来路由接口的数据包。在这个案例中, qr-YYY 接口在 net01_subnet01 上并且配置IP 192.168.101.1/24 。 qr-ZZZ 接口在 net02_subnet01 上并且配置IP 192.168.102.1/24 。 qg-VVV 接口配置IP 10.64.201.254/24 。由于对于network主机的操作系统每个接口都是可见的,所以network主机可以路由这些包括,只要系统管理员激活了 IP forwarding 。

L3 agent使用iptables来实现 floating IP (浮动IP)的网络地址转换(NAT)。

使用主机来实现路由的一个问题是,一个网络子网可能和主机使用的另外一个物理网络重合。例如,如果在eth2上配置的管理网络也使用了 192.168.101.0/24 子网,就会发生路由问题。因为主机不能决定数据包应该发送给 qr-YYY 还是 eth2。如果最终用户被允许创建自己的逻辑网络和子网,你必须设计系统避免冲突。

Networking使用Linux网络命名空间来避免network主机物理和虚拟主机使用的逻辑网络的网络冲突。它也通过不同的逻辑网络不能彼此路由来避免冲突。

Networking通过在network主机创建网络命名空间来避免子网冲突

个network namespace是其网络堆栈的一个隔离环境。一个network namespace有自己的网络接口,路由,iptables规则。可以将network namespace看成一个chroot jail,只是将网络替代文件系统而已。LXC(Linux containers)使用network namespaces来实现网络虚拟化。

_images/under-the-hood-scenario-1-ovs-netns.png

以上案例,有3个network namespace:

  • qdhcp-aaa 包含 tapXXX 接口,并且dnsmasq进程监听在那个接口来为 net01_subnet01 提供DHCP服务。这允许 net01_subnet01 和任何其他位于network host的子网IP重合
  • qrouter-bbbb 包含 qr-YYY , qr-ZZZqg-VVV 接口和相应的路由。这个namespace实现 router01
  • qdhcp-cc 包含 tapWWW 接口并且dnsmasq进程监听在那个接口上,提供 net02_subnet01 的DHCP服务。这允许 net02_subnet01 和任何其他位于network host的子网IP重合

 

 

 

 

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐