物理网络和虚拟化网络
Neutron 最为核心的工作是对二层物理网络的抽象与管理,物理服务器虚拟化后,虚拟机的网络功能由虚拟机网卡(vNIC)提供,物理交换机也被虚拟化为虚拟交换机(vSwitch),各个vNIC连接再vSwitch的端口上,最后这些vSwitch通过物理服务器的物理网卡访问外部的物理网络。
OpenStack的网络服务组件为 Neutron,它的设计目标是实现“网络即服务”。
设计上:遵循基于软件定义网络(SDN)的灵活和自动化原则
实现上:充分利用Linux中各种网络相关的技术
Linux网络虚拟化实现技术
- 网络虚拟化主要由分为三个部分:
- 网卡虚拟化:TAP、TUN、VETH
- 交换机虚拟化:Linux bridge、Open vSwitch
- 网络隔离:network-namespace
网络虚拟化的抽象系统架构
VLAN系统架构
虚拟机 VM 的网卡连接到 TAP 设备(即 A,常见名 tap-XXX),进一步通过 VETH pair(A-B)连接到网桥 qbr-XXX的端口 vnet0(端口B)上, 再通过 VETH pair(C-D)连接到 br-int网桥上。一般 C 的名字格式为 qvb-XXX,而D的名字格式为 qvo-XXX。他们名字除了前缀外,后面的 id 都是一样的,表示位于同一个虚拟机网络到物理及网络的连接上。
之所以 TAP 设备 A 没有直接连接到网桥 br-int 上,是因为 OpenStack 需要通过 iptables 实现 security group 的安全策略功能。目前 openvswitch 并不支持应用 iptables 规则的 Tap 设备。
因为 qbr 的存在主要是为了辅助 iptables 来实现 security group功能,有时候也被称为安全网桥 。
计算节点的结构
br-int 负责租户隔离,br-eth1 负责跟计算节点外的网络通信。 在 Vlan 模式下,租户的流量隔离是通过 VLAN 来进行的,因此此时包括两种 VLAN,虚拟机在计算节点内流量带有的 local vlan 和在计算节点之外物理网络上隔离不同租户的 vlan。
br-int 和 br-eth1 分别对从端口 int-br-eth1 和 phy-br-eth1 上到达的网包进行 vlan tag 的处理。此处有两个网,分别带有两个 vlan tag(内部 tag1 对应外部 tag101,内部 tag2对应外部tag102)。 其中,安全组策略仍然在qbr相关的iptables上实现。
- br-int 完成从 br-eth1 上过来流量(从口 int-br-eth1 到达)的 vlan tag 转换
- br-eth1 上负责从 br-int 上过来的流量(从口 phy-br-eth1到达),实现 local vlan 到外部 vlan的转换
网络节点的结构
- br-eth1主要负责把物理网络上外部 vlan 转化为 local vlan
- br-int 上挂载了大量的agent来提供各种网络服务,另外负责对发往 br-eth1 的流量, 实现 local vlan转化为外部 vlan。
- dnsmasq 负责提供 DHCP 服务,绑定到某个特定的名字空间上,每个需要 DHCP 服务的租户网络有自己专属隔离的 DHCP 服务(图中的 tapXXX 和 tapWWW 上各自监听了一个dnsmasq)。
- br-ex 要做的事情很简单,只需要正常转发即可。
- 路由是L3 agent来实现,每个子网在 br-int 上有一个端口(qr-YYY 和 qr-ZZZ,已配置IP,分别是各自内部子网的网关),L3 agent绑定到上面。要访问外部的公共网络,需要通过 L3 agent 发出,而不是经过 int-br-ex 到 phy-br-ex(实际上并没有网包从这个 veth pair 传输)。如果要使用外部可见的 floating IP,L3 agent 仍然需要通过 iptables 来进行 NAT。