ovn学习-1-配置同步

配置同步协议(sequence number protocol)

ovn各个进程间都是通过ovsdb交互的。怎么知道一个命令是否执行成功了呢。比如ovn-nbctl -v --wait=hv acl-add dmz to-lport 100 tcp.dst==23 allow-related

协议工作过程如下,

  1. NB_Global表里的nb_cfg加1
  2. ovn-northd更新sb db时,把NB_Global表里的nb_cfg的值拷贝到SB_Global里。(从这里可以确认sb db是否与nb db一致)
  3. ovn-northd从sb db收到确认后,更新NB_Global表里的sb_cfg,使得sb_cfg=nb_cfg
  4. chassis上的ovn-controller收到更新的带有nb_cfg的sb db时,更新ovs里的flow。当从ovs收到更新完成的消息后,在sb db里更新自己的chassisnb_cfg的值。
  5. ovn-northd监控sb db里Chassis表里的nb_cfg列,copy这个值到NB_Global表里的hv_cfg。(从这里可以确认是否所有的hypervisor跟nb db一致)

接口生命周期

  1. CMS(ovn-nbctl)创建逻辑接口,并更新配置。包括vif-id和mac。
  2. CMS(ovn-nbctl)更新nb db,在Logical_Switch_Port添加一行,指定了vif-id, mac, Logical_Switch的值。
  3. ovn-northd收到db更新的通知后,更新sb db。在Logical_Flow表里增加flow,在Binding表里生成记录。
  4. 在每一个hypervisor上,ovn-controller收到了sb db的更新通知,如果接口是down的,ovn-controller做不了很多事情。
  5. 接口UP后,hypervisor(比如libvirt)把接口加入bridge,并且设置external_ids:iface-id=vif-id
  6. ovn-controller收到这个iface-id通知后,更新sb db里的Binding表里的Chassis值,更新本地的flow。
  7. 对于像openstack,当网络初始化好后才完全启动VM的情况,ovn-northd在知道Binding表里的Chassis值更新后,再更新Logical_Switch_Port里的up列。
  8. 在其他hypervisor上,ovn-controller也能收到sb db(Chassis)的通知,然后知道了这个逻辑端口的物理位置,更新本地的flow。
  9. VM关机,VIF从br删掉。
  10. 在VM关机的hypervisor上,ovn-controller知道VIF被删除后,删除Binding表里对应逻辑端口的Chassis值。
  11. 在每一个hypervisor上,ovn-controller知道了Binding表里的逻辑端口的Chassis值被清空,意味着ovn-controller不再知道逻辑端口的物理位置了,更新本地的flow。
  12. 最后,VIF或者是VM不再需要了,就可以通过CMS删掉。
  13. CMS plugin从nb db里删除Logical_Switch_Port表的VIF数据。
  14. ovn-northd接收到nb db更新后,更新sb db(包括Logical_Flow表和Binding表)。
  15. 在每一个hypervisor上,ovn-controller接收到sb db更新后,删除或者更新本地flow。