虚拟网络设备
有4种不同的虚拟网络设备:TAP设备,veth pair,Linux bridge 和 Open vSwitch bridge。
对于一个以太网数据帧从虚拟机 vm01 的 eth0 传输到物理网络,它必须通过主机的 9 个设备: TAP vnet0,Linux bridge qbrnnn,veth pair ( qvbnnn , qvonnn ),Open vSwitch bridge br-int, veth pair ( int-br-eth1 , phy-br-eth1 ),以及,最后通过物理网卡 eth1
内部bridge和外部bridge
内部bridge和外部bridge通过一个veth pair ( int-br-ex , phy-br-ex ) 连接,这个案例中使用3层连接来路由从内部网络到外部网络的数据包:在veth pair间没有数据包通过。
方案一:Compute 主机配置
TAP设备,例如 vnet0
一个 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
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-eth1 在 phy-br-eth1 的接口上接收到一个标记为VLAN ID 1的数据帧,它就将数据帧的VLAN ID修改成101。类似的,当 br-int 从 int-br-eth1
理想情况下,TAP设备 vnet0 将直接连接到集成的bridge br-int 上。但是很不幸,这是不能这么做,因为要实现OpenStack安全组策略。OpenStack使用TAP设备(如 vnet0
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-agent 和 neutron-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主机上的网络设备
内部bridge和外部bridge
内部bridge和外部bridge通过一个veth pair ( int-br-ex , phy-br-ex ) 连接,这个案例中使用3层连接来路由从内部网络到外部网络的数据包:在veth pair间没有数据包通过。
在compute主机,使用一个Open vSwitch 内部bridge (br-int) 和一个Open vSwitch bridge连接数据网络(br-eth1),并且两者通过一个veth pair连接,并且 neutron-openvswitch-plugin-agent
在一个附加的Open vSwitch bridge br-ex
在network主机上使用Open vSwitch内部端口。内部端口可以设置一个或多个IP地址给一个Open vSwitch bridge。在上面的案例中,br-int bridge有4个内部接口: tapXXX , qr-YYY , qr-ZZZ 和 tapWWW 。每个内部接口有一个独立的IP地址。在内部接口, qg-VVV 则在 br-ex
默认,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
L3 agent使用iptables来实现 floating IP (浮动IP)的网络地址转换(NAT)。
使用主机来实现路由的一个问题是,一个网络子网可能和主机使用的另外一个物理网络重合。例如,如果在eth2上配置的管理网络也使用了 192.168.101.0/24 子网,就会发生路由问题。因为主机不能决定数据包应该发送给 qr-YYY
Networking使用Linux网络命名空间来避免network主机物理和虚拟主机使用的逻辑网络的网络冲突。它也通过不同的逻辑网络不能彼此路由来避免冲突。
Networking通过在network主机创建网络命名空间来避免子网冲突
一个network namespace是其网络堆栈的一个隔离环境。一个network namespace有自己的网络接口,路由,iptables规则。可以将network namespace看成一个chroot jail,只是将网络替代文件系统而已。LXC(Linux containers)使用network namespaces来实现网络虚拟化。
以上案例,有3个network namespace:
- qdhcp-aaa 包含 tapXXX 接口,并且dnsmasq进程监听在那个接口来为 net01_subnet01 提供DHCP服务。这允许 net01_subnet01
- qrouter-bbbb 包含 qr-YYY , qr-ZZZ 和 qg-VVV 接口和相应的路由。这个namespace实现 router01
- qdhcp-cc 包含 tapWWW 接口并且dnsmasq进程监听在那个接口上,提供 net02_subnet01 的DHCP服务。这允许 net02_subnet01