概念
Hypervisor是运行ovs的,比如libvirtd。
gateway,连接logic network和physical network。
Hypervisors和gateways都称之为chassis。
logic network,
Logical switches, the logical version of Ethernet switches
Logical routers, the logical version of IP routers
Logical datapaths, the logical version of an OpenFlow switch. Logical switches and routers are both implemented as logical datapaths
Logical ports,
- Logical ports representing VIFs
- Localnet ports represent the points of connectivity between logical switches and the physical network
- Logical patch ports represent the points of connectivity between logical switches and logical routers,and in some cases between peer logical routers
gateway router, 物理位置(chassis)绑定的。可支持1-to-N
nat。Port_Binding
里port type是l3gateway。比如这里的edge1。如果要在gateway router上面配置snat或者dnat规则,和distributed router连接必须通过switch。NAT rules only work on Gateway routers, and on distributed routers with one logical router port with a redirect-chassis specified.
distributed router,
Distributed Gateway Port is logic network gateway。
寄存器使用介绍
- tunnel key
- logical datapath field,一个logic switch/logic router就是一个logic datapath,存储在metadata寄存器里(跨机器是存储在tunnel key里)
- logical input port field,存储在reg14里
- logical output port field,存储在reg15里
- conntrack zone field for logical ports,存储在reg13里
- conntrack zone fields for routers,dnat在reg11里,snat在reg12里
- logical flow flags,存储在reg10里
- VLAN ID
tips,
- flow里的metadata值即是Datapath_Binding表里的tunnel_key(ovn-sbctl list Datapath_Binding)。
- flow里的reg14值即是Port_Binding表里的tunnel_key(ovn-sbctl list Port_Binding)。
- 物理port(ofport)和逻辑port的转换是在本地chassis由ovn-controller完成的。
整体流表处理
switch datapath主要功能是arp代答,dhcp应答,l2查找,ACL,security。
router datapath主要功能是网关arp代答,网关icmp代答,路由,下一跳arp解析,nat。
router路由和nat的顺序跟内核处理的顺序保持一致。
一开始,VM发出来一个包进入ovs,然后,
- 在table 0里,匹配了in_port,做了一个物理到逻辑的转换。设置logical datapath field,logical input port,跳到table 16。如果是VM里容器发出来的包,会用vlan id来区分,并strip vlan,然后就跟上面的一样了。table 0也会处理从隧道进来的包,也会设置logical datapath field,logical input port,还会设置logical output port(因为是先知道了logical output port,再做的隧道封装),这些信息是从tun metadata获取的。然后跳到table 33。
- table 16到31执行sb db里
Logical_Flow
表的逻辑,ingress方向。对应Logical_Flow
表里的table 0到15。每一条logic flow对应一条或者多条实际flow。包可能只匹配其中的一条,也可能匹配多条(action是一样的)。ovn-controller使用logic flow的UUID的前32bit作为flow里的cookie值。一些logic flow可能对应到ovs里的conjunctive match,使用的cookie值是0。大多数logic flow里的action都在openflow里有对应的实现。比如next对应resubmit。以下是一些特别的,1)output: 通过resubmit到table 32实现。如果output有多个,也会resubmit多次。2)get_arp(P, A)/get_nd(P, A)
:通过保存一些值,resubmit到table 66实现。table 66里的flow是sb db里MAC_Binding表生成的。3)put_arp(P, A, E)/put_nd(P, A, E)
:通过保存一些值,发送包给ovn-controller,ovn-controller会更新MAC_Binding
表。gateway连接外部网络时学习到的。 - table 32到47实现的是logic ingress的output逻辑。table=32处理发送到其他hypervisor的包<从隧道口output>,table=33处理发送给本地hypervisor的包,table=34检查包的逻辑ingress和egress port是否一样,如果一样,则丢弃。1)table=32里面的flow包括单播和多播处理。设置值并单播发送给其他hypervisor;多播同样,只是发送多份。default跳到table 33。2)table=33处理logic port是本地的包。resubmit到34,如果是多播的,会更改logic port,resubmit到34多次。3)table=34,loopback检查(
MLF_ALLOW_LOOPBACK
标志),并resubmit到table 48处理。 - table 48到63执行的是sb db的
Logical_Flow
表的逻辑,egress方向。通过resubmit到table 64,执行output action。egress处理里不能更改logic output port和做隧道封装。 - table 64会检查loopback(
MLF_ALLOW_LOOPBACK
标志),openflow默认禁止loopback(除非使用IN_PORT
action)。如果MLF_ALLOW_LOOPBACK
设置了,会保存in_port
值,清空in_port
寄存器,resubmit到table 65,绕过openflow限制。 - table 65执行逻辑到物理的转换,跟table 0相反。匹配逻辑端口,发送到本地bridge里的物理端口。如果是VM内的容器,则会加上vlan再发送。
实例解析
环境搭建
拓扑
|
|
|
|
左边是中心化的router做nat,右边是分布式的router做nat。
寄存器值
|
|
逻辑流表分析
从vm1 ping vm4,
ovn-sbctl dump-flows,
dmz datapath ingress logic flow,
|
|
dmz datapath egress logic flow,
|
|
tenant1 ingress logic flow,
|
|
tenant1 egress logic flow,
|
|
inside ingress logic flow,
|
|
host2上,
inside egress logic flow,
跨网段互访,总共有3次traverse。
注,
附录1和附录2的flow不包括右边的。
附录1
ovn-sbctl dump-flows
|
|
附录2
ovs-ofctl dump-flows br-int on host1
|
|