配置同步协议(sequence number protocol)
ovn各个进程间都是通过ovsdb交互的。怎么知道一个命令是否执行成功了呢。比如ovn-nbctl -v --wait=hv acl-add dmz to-lport 100 tcp.dst==23 allow-related
。
协议工作过程如下,
NB_Global
表里的nb_cfg
加1- 当
ovn-northd
更新sb db时,把NB_Global
表里的nb_cfg
的值拷贝到SB_Global
里。(从这里可以确认sb db是否与nb db一致) - 在
ovn-northd
从sb db收到确认后,更新NB_Global
表里的sb_cfg
,使得sb_cfg=nb_cfg
- 在
chassis
上的ovn-controller
收到更新的带有nb_cfg
的sb db时,更新ovs里的flow。当从ovs收到更新完成的消息后,在sb db里更新自己的chassis
的nb_cfg
的值。 ovn-northd
监控sb db里Chassis
表里的nb_cfg
列,copy这个值到NB_Global
表里的hv_cfg
。(从这里可以确认是否所有的hypervisor
跟nb db一致)
接口生命周期
- CMS(ovn-nbctl)创建逻辑接口,并更新配置。包括vif-id和mac。
- CMS(ovn-nbctl)更新nb db,在
Logical_Switch_Port
添加一行,指定了vif-id, mac,Logical_Switch
的值。 ovn-northd
收到db更新的通知后,更新sb db。在Logical_Flow
表里增加flow,在Binding表里生成记录。- 在每一个hypervisor上,ovn-controller收到了sb db的更新通知,如果接口是down的,ovn-controller做不了很多事情。
- 接口UP后,hypervisor(比如libvirt)把接口加入bridge,并且设置
external_ids:iface-id=vif-id
。 - ovn-controller收到这个iface-id通知后,更新sb db里的Binding表里的Chassis值,更新本地的flow。
- 对于像openstack,当网络初始化好后才完全启动VM的情况,ovn-northd在知道Binding表里的Chassis值更新后,再更新
Logical_Switch_Port
里的up列。 - 在其他hypervisor上,ovn-controller也能收到sb db(Chassis)的通知,然后知道了这个逻辑端口的物理位置,更新本地的flow。
- VM关机,VIF从br删掉。
- 在VM关机的hypervisor上,ovn-controller知道VIF被删除后,删除Binding表里对应逻辑端口的Chassis值。
- 在每一个hypervisor上,ovn-controller知道了Binding表里的逻辑端口的Chassis值被清空,意味着ovn-controller不再知道逻辑端口的物理位置了,更新本地的flow。
- 最后,VIF或者是VM不再需要了,就可以通过CMS删掉。
- CMS plugin从nb db里删除
Logical_Switch_Port
表的VIF数据。 - ovn-northd接收到nb db更新后,更新sb db(包括
Logical_Flow
表和Binding
表)。 - 在每一个hypervisor上,ovn-controller接收到sb db更新后,删除或者更新本地flow。