网络进阶Linux Bridge

Neutron默认使用ML2作为core plugin,其配置位于/etc/neutron/neutron.conf,控制节点和计算节点都需要在各自的neutron.conf 中配置core_plugin选项:

 cat /etc/neutron/neutron.conf|grep core_plugin
core_plugin = ml2

然后需要让ML2使用linux-bridge 的 mechanism driver,ML2的配置文件位于/etc/neutron/plugins/ml2/ml2_conf.ini:

[ml2]
# ...
mechanism_drivers = linuxbridge
  • mechanism_drivers 选项指明当前节点可以使用的mechanism driver,这里可以指定多种driver,ML2会负责加载,上面的配置指明我们只使用linux-bridge driver;
  • Neutron服务正常启动后,所有节点上都会运行neutron-linuxbridge-agent;

在我们的实验环境中,当前节点上只存在物理网卡设备ethX,还没有bridge和tap,状态如下:

Controller:

Compute:

linux-bridge支持local, flat, vlan和vxlan 四种network type,目前不支持gre.

3.1 local

3.1.1 特点

  • local network的特点是不会与宿主机的任何物理网卡相连,也不关联任何的VLAN ID;
  • 对于每个local netwrok,ML2 linux-bridge会创建一个bridge,instance的tap设备会连接到bridge。位于同一个local network的instance会连接到相同的bridge,这样instance之间就可以通信了;
  • 因为bridge没有与物理网卡连接,所以instance无法与宿主机之外的网络通信,同时因为每个local network有自己的bridge,bridge之间是没有连通的,所以两个local network之间也不能通信,即使它们位于同一宿主机上;

3.1.2 示例

  • 创建了两个local network,分别对应两个网桥brqXXXX和brqYYYY
  • VM0和VM1 通过tap0和tap1连接到brqXXXX
  • VM2通过tap0和tap2 连接到brqYYYY
  • VM0与VM1在同一个local network中,它们之间可以通信
  • VM2位于另一个local network,由于brqXXXX和brqYYYY没有联通,所以VM2无法与VM0和VM1通信

3.1.3 开启

要想开启local功能,只需在ML2配置文件type_drivers包含local即可:

type_drivers = local,flat,vlan,gre,vxlan

普通用户和admin都可以通过CLI或者Web GUI创建网络,但只有amdin才能指定网络的type,所以需要用tenant_network_types告诉ML2当普通用户在自己的Tenant(Project)中创建网络时,默认创建哪种type的网络。

# 这里type是local
tenant_network_types = local
# 可以指定多种type,其作用是先创建vlan网络,当没有vlan可创建时(比如vlan id用完),便创建local网络。
tenant_network_types = vlan, local

3.2 flat

3.2.1 特点

  • flat network是不带tag的网络类型,要求宿主机的网卡直接与linux bridge相连;
  • 每个flat network都会独占一个物理网卡;

3.2.2 示例

上图中eth1桥接到brqXXX,为instance提供flat网络。如果需要创建多个flat network,就得准备多个物理网卡,如下图所示:

3.2.3 开启

/etc/neutron/plugins/ml2/ml2_conf.ini@neutron node:

# 通过flat_networks定义了一个flat网络,label为provider
[ml2_type_flat]
flat_networks = provider

/etc/neutron/plugins/ml2/linuxbridge_agent.ini@netron node:

# 通过physical_interface_mappings指明default对应的物理网卡为eth0
physical_interface_mappings = provider:eth0

3.3 VLAN Network

3.3.1 特点

  • vlan network是带tag的网络,是实际应用最广泛的网络类型;
  • 不同的vlan连接,通过各自的tap设备连接到同一bridge,然后通过不同的tag,从同一个物理网口出去;
  • 因为物理网卡ethx上面可以走多个vlan的数据,那么物理交换机上与eth1相连的的port要设置成trunk模式,而不是access模式;

  • 不同instance 通过 TAP 设备连接到名为 brqXXXX linux bridge;
  • 在物理网卡 eth1 上创建了 eth1.100 的 vlan interface,eth1.100 连接到 brqXXXX;
  • instance 通过 eth1.100 发送到 eth1 的数据包就会打上 vlan100 的 tag;
  • 如果再创建一个 network vlan101,eth1 上会相应的创建 vlan interface eth1.101,并且连接的新的 lingux bridge brqYYYY,每个vlan network有自己的 bridge,从而实现基于 vlan 的隔离;

不同VLAN的设备需要Router来提供数据转发服务,如下图:

3.4 VXLAN Network

VXLAN全称Virtual eXtensible Local Area Network,正如名字所描述的,VXLAN提供与VLAN相同的以太网二层服务,但是拥有更强的扩展性和灵活性。

3.4.1 与VLAN相比的优点

  • 持更多的二层网段;
    • VLAN使用12-bit标记VLAN ID,最多支持4094个VLAN,这对于大型云部署会成为瓶颈,VXLAN的 ID (VNI或者VNID)则用24-bit标记,支持16777216个二层网段;
  • 能更好地利用已有的网络路径;
    • VLAN使用Spanning Tree Protocol(STP)避免环路,这会导致有一半的网络路径被block掉。VXLAN的数据包是封装到UDP通过三层传输和转发的,可以使用所有的路径。
  • 避免物理交换机MAC表耗尽;
    • 由于采用隧道机制,TOR (Top on Rack) 交换机无需在MAC表中记录虚拟机的信息;

配置neutron节点的/etc/neutron/plugins/ml2/ml2_conf.ini:

# 配置neutron的core_plugin
openstack-config --set /etc/neutron/neutron.conf DEFAULT core_plugin ml2
# 定义ml2后端的network driver list
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 type_drivers flat,vlan
# 配置flat network的物理网卡标签
# 可以定义多组label,如lan1,lan2,lan3lan4,甚至dmz等等
# 这里定义了就能在/etc/neutron/plugins/ml2/linuxbridge_agent.ini里引用并配置节点的映射关系了
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2_type_flat flat_networks lan1,lan2,lan3,lan4

配置neutron node & compute node的/etc/neutron/plugins/ml2/linuxbridge_agent.ini:

# 单个flat network
physical_interface_mappings = lan1:em1
# 多个flat network
physical_interface_mappings = lan1:em1,lan2:em2,lan3:em3,lan4:em4

重启neutron相关服务

创建子网:

openstack subnet create \
  --network lan1(上面定义的flat network's label) \
  --allocation-pool start=172.17.1.100,end=172.17.1.200 \
  --dns-nameserver 119.29.29.29 --gateway 172.17.1.253 \
  --subnet-range 172.17.1.0/24 $subnet_name

然后查看实例的tap及其获取ip情况:

brctl show
nova list

  • virtualization/openstack/neutron/linux_bridge.txt
  • 最后更改: 2019/04/16 18:31
  • (外部编辑)