Neutron中的流表

br-int, br-tun

br-int是一个ovs桥,不是linux bridge,这个ovs桥把本计算节点上的所有vm的port连接上,那怎么才能让这些不同租户的port不互相干扰呢,就是用vlan,每个租户分配不同的vlan tag。

br-tun是用于东西流量的,比如一个租户的计算节点1上的虚拟机,为了和计算节点2上的虚拟机通讯,两者之间就会建一个tunnel。
那么一个计算借点会有多少个tunnel呢?就是看这个节点上的虚机和多少个计算节点上的续集有联系,最差的情况就是:如果有N计算几点,就有N-1个tunnel(网络节点另算)

neutron里的flow table

为了使逻辑更加清晰,在neutron中,flow table使用了多个table来分别控制不同的flow

[neutron/plugins/ml2/drivers/openvswitch/agent/common/constants.py]
1
2
3
4
5
6
7
8
9
PATCH_LV_TO_TUN = 1
GRE_TUN_TO_LV = 2
VXLAN_TUN_TO_LV = 3
LEARN_FROM_TUN = 10
UCAST_TO_TUN = 20
FLOOD_TO_TUN = 21
ARP_RESPONDER = 22

CANARY_TABLE = 128

当一个port创建的时候,会在context里设置init_flag = True.

1
2
3
if context.init_flag:
need_notify_agent_port_at = True
need_pop_flooding_entry = True

设置了need_pop_flooding_entry的用途是啥呢?

1
2
3
4
5
# Notify other agents to add fdb rule for current port
if need_pop_flooding_entry:
# And notify other agents to add flooding entry
other_fdb_entries[network_id]['ports'][agent_ip].append(
const.FLOODING_ENTRY)

这样就会向该网络的所有port所在的ovs-agent广播一下,广播的结果是,在这些ovs-agent所在的机器上,加入一条flow table,
当这个netwwrk有广播包的时候,给我一份,比如响应arp啥的。