1. 代碼流程分析
neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:main() plugin = OVSNeutronAgent(**agent_config) self.setup_integration_br() #創建br-int集成網橋並初始化流表 self.setup_rpc() #建立一些agent與server側常用的rpc通道 self.plugin_rpc = OVSPluginApi(topics.PLUGIN) #如get_device_details/update_device_down/update_device_up/tunnel_sync
self.sg_plugin_rpc = sg_rpc.SecurityGroupServerRpcApi(topics.PLUGIN) #查詢安全組信息 self.state_rpc = agent_rpc.PluginReportStateAPI(topics.PLUGIN) #處理report_state self.connection = agent_rpc.create_consumers(...)
#創建以下消費者們:port update/delete, tunnel update/delete, security_group update, dvr update, l2population update host heartbeat = loopingcall.FixedIntervalLoopingCall(self._report_state) #周期任務上報agent狀態,如br-int上有多少device,agent當前時間等 self.setup_physical_bridges(bridge_mappings)
#處理物理網橋與br-int的關聯(采用veth對/path對),如果物理網橋不存在則直接退出agent,並初始化流表 self.setup_tunnel_br()/ self.reset_tunnel_br(tun_br)
#創建br-tun,與br-int關聯(采用patch對),並初始化流表
#為啥要分開處理? self.setup_ancillary_bridges(integ_br, tun_br) # 識別出本host上除了br-int、br-tun和物理網橋之外的網橋,如br-ex self.sg_agent = OVSSecurityGroupAgent(...) # 用於處理安全組
self.connection.consume_in_threads() # 對以上consume開啟各個線程監聽並處理 plugin.daemon_loop() self.rpc_loop() tunnel_sync() #在agent首次啟動或有異常發生時,會進行tunnel同步。
#上報本agent的tunnel ip到neutron server DB中,neutron server同時發送關於該tunnel ip的消息(tunnel_update)給其他agents
#如果沒有開啟l2pop,則在本agent上會在br-tun上創建tunnel port,其他agents也會創建相應的remote tunnel port,並創建相應流表
port_info = self.scan_ports() #周期檢測br-int上的端口變化
sync = self.process_network_ports(port_info) #處理增加或刪除的port
neutron-server和neutron-openvswitch-agent的消息隊列如下:
neutron-server可能會發生上述幾種消息廣播給neutron-openvswitch-agent。openvswitch agent會先看一下端口是否在本地,如果在本地則進行對應動作。
2. nova與neutron-openvswitch-agent的交互
首先boot虛機時,nova-compute發消息給neutron-server請求創建port。之后,在driver里面在br-int上建立port后,neutron-openvswitch-port循環檢測br-int會發現新增端口,對其設定合適的openflow規則以及localvlan,最后將port狀態設置為ACTIVE。
附:ovs啟動流程圖(http://bingotree.cn/wp-content/uploads/2015/05/ovs-agent%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B1.png)