引用声明:https://zhangchenchen.github.io/2017/02/12/neutron-layer2-3-realization-discovry/
一、概述
Neutron是openstack中提供网络虚拟化的组件,根据二层网络的实现方式不同(即agent的不同),Linux bridge方式,Openvwitch的方式。而且, lay2 网络分为local、flat、vlan、vxlan等类型(gre与vxlan类似,暂不考虑);本文就分析两者实现方式在这四种实现方式在这四中网络中的具体实现差异。因为vxlan会依赖lay3层网络,所以还会分析下lay3网络的实现。
二、lay2 local型网络
生产环境中,local与flat网络是不会被使用的,vlan与vxlan是使用比较多的layer2网络。因为local网络只支持在同一宿主机的虚拟机互联,而flat网络会每个网络独占宿主机的一个物理接口,这在现实世界中是不允许的。但是vlan与vxlan的实现都是在local,flat网络的基础上实现的,所以还是有必要看一下这两种类型的网络的实现的。
Linux bridge 实现local型网络
对于每个local network, ML2 linux-bridge agent会创建一个bridge, instance的tap设备连接到该bridge。位于同一local network的instance会连接同一个bridge,这样instance之间就可以通信了。但因为bridge没有与宿主机物理网卡相连,所以跟宿主机无法通信,也没法与宿主机之外的其他机器通信。下图为示例:
- 图中创建了两个local network, 对应两个网桥。
- VM0 和 VM1在同一个local network 中,它们之间可以通信。
- VM2位于另一个local network,无法于VM0和VM1通信。
- 两个local network都有自己的DHCP server,由dnsmasq在各自独立的net namespace实现, 通过tap设备挂接在各自network 的bridge上;
openvswitch实现local型网络
ovs的实现要相对复杂些,neutron完成相应配置并启动后,ovs-agent会调用ovs自动创建三个ovs bridge,br-ex,br-int和br-tun,看名字大概也可以猜出,br-ex是用于外部网络,br-int是内部虚拟机的网络,br-tun是用于overlay network。也就是vxlan类型的网络会用到该bridge。local network值考虑br-int bridge。 示例图如下:
- 图中每个instance并不是跟之前一样通过tap设备直接挂载在ovs的br-int上,而是通过一个新建的linux bridge以及一对veth pair跟br-int相连,为什么这么做呢,因为Open vSwitch 目前还不支持将 iptables 规则放在与它直接相连的 tap 设备上,这样就实现不了Security group,所以就加了一个linux bridge以支持iptables。 <