Openstack Core Service -- Neutron OVS OpenFlow FlowTable
Neutron OVS OpenFlow FlowTable
命令:ovs-ofctl show br-tun 和 ovs-vsctl show
Neutron 定义了多种流表。以下面的配置(配置了 GRE 和 VXLAN 两种 tunnel types)为例:
1(patch-int): addr:a6:d4:dd:37:00:52 2(vxlan-0a000127): addr:36:ec:de:b4:b9:6b {in_key=flow, local_ip="10.0.1.31", out_key=flow, remote_ip="10.0.1.39"} 计算节点2 3(vxlan-0a000115): addr:4a:c8:21:3c:3f:f1 {in_key=flow, local_ip="10.0.1.31", out_key=flow, remote_ip="10.0.1.21"} 网络节点 4(gre-0a000115): addr:4a:8b:0f:9d:59:52 {in_key=flow, local_ip="10.0.1.31", out_key=flow, remote_ip="10.0.1.21"} 网络节点 5(gre-0a000127): addr:aa:58:6d:0a:f7:6a {in_key=flow, local_ip="10.0.1.31", out_key=flow, remote_ip="10.0.1.39"} 计算节点2
其中,10.0.1.31 是计算节点1, 10.0.1.21 是网络节点, 10.0.1.39 是计算节点2。
计算节点1 上 ML2 Agent 启动后的 br-tun 的 flows:
表号 | 用途 | 例子 |
0 |
table=0, priority=1,in_port=3 actions=resubmit(,4) //从网络节点来的,转 4,结果被丢弃 table=0, priority=1,in_port=4 actions=resubmit(,3) //从网络节点来的,转 3
table=0, priority=1,in_port=2 actions=resubmit(,4) //从计算节点来的,转 4,结果被丢弃 table=0, priority=1,in_port=1 actions=resubmit(,2) //从虚机来的,转 2 |
|
DVR_PROCESS = 1 | handle packets coming from patch_int unicasts go to table UCAST_TO_TUN where remote addresses are learnt | 用于 DVR |
PATCH_LV_TO_TUN = 2 |
table=2, priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20) //单播包,转 20 |
|
GRE_TUN_TO_LV = 3 |
table=3, priority=1,tun_id=0x4 actions=mod_vlan_vid:1,resubmit(,10) //将 tun_id 为 4 的,修改 vlan id 为1,转 10 处理 |
|
VXLAN_TUN_TO_LV = 4 | table=4, priority=0 actions=drop //丢弃 | |
DVR_NOT_LEARN = 9 | 用于 DVR | |
LEARN_FROM_TUN = 10 | 学习table |
table=10,priority=1 actions=learn(table=20,hard_timeout=300,priority=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1 |
UCAST_TO_TUN = 20 |
外出的单播会被 table 20 处理,table 2 |
//学习到的规则 table=20, priority=2,dl_vlan=1,dl_dst=fa:16:3e:7e:ab:cc actions=strip_vlan,set_tunnel:0x3e9,output:5 //如果vlan 为1,而且目的MAC地址等于 fa:16:3e:7e:ab:cc,设置 tunnel id,从端口 5 发出
table=20,priority=0 actions=resubmit(,22) //直接转 22 |
ARP_RESPONDER = 21 | ARP table | 当使用 arp_responder 和 l2population 时候用到 |
FLOOD_TO_TUN = 22 | Flood table |
table=22,dl_vlan=1 actions=strip_vlan,set_tunnel:0x4,output:5,output:4 //对于 dl_vlan 为1的,设置 tunnel id 为 4,从端口4 和 5 转出 |
其中比较有意思的是:
(1)为什么从 VXLAN 过来的流量都被丢弃了,最后发出去也用的是 GRE 端口。看来同时有 GRE 和 VXLAN 隧道的话,OVS 只会选择 GRE。具体原因待查。
(2)MAC 地址学习:Table 10 会将学习到的规则(Local VLAN id + Src MAC Addr => IN_Port)放到 table 20。当表格20 发现一个单播地址是已知的时候,直接从一个特定的 GRE 端口发出;未知的话,视同组播地址从所有 GRE 端口发出。