OpenStack Neutron DVR L2 Agent的初步解析:DVR的創建及生效
OpenStack Juno版本已正式發布,這是這個開源云平臺的10個版本,在Juno版的Neutron模塊中真正引入了分布式路由(DVR)的實現,現在就我們就來看下具體DVR是怎么樣創建起來并且生效進行工作的。
L2用Plugin與L3 agent交互
L2 OVS agent初始化
在L2 OVS agent初始化過程中,需要知道其主機***的DVR的MAC地址,為了將適當的OVS規則添加到隧道和集成網橋。為了這個目的,在L2 agent調用由ML2的插件提供的RPC函數 get_dvr_mac_address(HOST_ID)獲取主機的DVR mac地址。
分布式路由的創建
一個路由器可以建立為明確的分布式路由器。創建路由器(在分布式模式或以其他方式)所需的操作通常沒有在agent上進行操作。只有當一個接口被添加到路由器中,有在L2和L3 agent才會采取行動。在插件這方面,創建路由器的信息存儲在DB中,如下圖所示。
將接口添加到路由器中
在 分布式路由器執行接口的增加命令導致routers_updated()的RPC在CN上的L3-agent被調用。作為這種服務的請求的一部分,L3- Agent-on-CN初步驗證這個受影響的路由器是否是一個分布式路由。如果是,則獲取對應于新增的接口的接口端口并將這個端口掛在集成網橋上。這個操 作在本質上類似于L3 agent,除了在L3-Agent-on-CN運行在計算節點,并增加了端口,這種端口只會在分布式路由器上。
這里的端口是一個分布式路由器的接口,將有一個特殊的device_owner字段值:network:router_interface_distributed
在 把路由器上的接口端口加入BR-INT后,L3-Agent-on-CN要求提供有關該子網接口上的云端口的列表信息。對于這一點,調用 get_compute_ports_ by_subnet(subnet_id)到L3的插件。L3插件與ML2插件通信,去得到可用的輸入子網中的所有端口,并返回L3-Agent-on- CN的端口列表。L3-Agent-on-CN緩存這些端口,然后使用端口信息來創建在DVR路由器命名空間上的靜態ARP表項。這樣就完成了路由器接口 的DVR側的處理。
由 L3-Agent-on-CN加入路由器接口的端口被 L2 Agent檢測到。L2 Agent識別到如果該端口是一個分布式的路由器接口。如果沒有,它進行通常處理。如果是的話,它進行特殊處理,在其中調用 get_compute_ports_on_host_by_subnet(subnet_id),以獲得本地虛擬機在此路由器的接口列表。然后,它使用 的端口列表及路由器接口的端口信息,在隧道和集成網橋上建立OVS規則。
從分布式路由移除接口
在 一個分時路由上執行一個路由接口的刪除命令,在L3-Agent-on-CN調用routers_updated() RPC請求。作為這樣一個請求的服務的一部分,L3-Agent-on-CN初始化時驗證這個影響到的路由器是否是一個分布式路由,如果是,他就會獲取對 應的要被刪除掉額接口端口。再將路由接口端口從集成網橋移除。這個操作在本質上類似于L3 agent,除了在L3-Agent-on-CN運行在計算節點,而且刪除的端口,這種端口只會在分布式路由器上。 在刪除路由器上在br-int上的接口端口,L3-Agent-on-CN這個端口的緩存來確定端口中可以被刪除的路由器接口就行。然后它會為列表中所有 端口移除路由器命名空間中的靜態ARP表項。這樣就完成了DVR側的路由器接口刪除的處理。
這些被L3-Agent-on-CN刪除的路由器接口端口被L2 agent檢測到。L2 agent識別這個端口是否是分布式路由接口。如果不是,就進行通常處理;如果是,完成特定的進程,將所有的與刪除的路由器接口端口匹配的OVS規則從集成網橋和隧道網橋中移除。
新的虛擬機加入到分布式路由器的子網接口
當 一個新租戶下VM被添加到分布式路由管理的子網接口,一個創建port的api調用被nova完成去主持新租戶下的VM。作為ML2插件提供的創建端口服 務的一部分,ML2插件將通知L3 Plugin一個新的端口正在被添加。L3 Plugin將檢查這個新的端口是否在一個DVR組建的子網中。如果不是,則不做任何操作。如果是,L3 Plugin將啟動一個RPC call port_add() 到 the L3-Agent-on-CN。L3-Agent-on-CN收到這個RPC請求,會獲取這個port的信息,然后為這個port增加靜態的ARP表項到 對應的路由器命名空間。這樣就完成DVR側對一個新租戶的VM port的增加。
新 租戶的VM的端口被L2 agent檢測到,L2 agent驗證這個端口是否是已經存在分布式路由的子網的一個成員。如果不是,則做普通操作。如果是,執行特定操作:在br-int和br-tun上為匹 配的子網網關添加這個port(OFPORT)到現有的OVS規則中。
現有的虛擬機從一個分布式的路由器子網接口中刪除
當 一個租戶VM從一個被分布式路由管理的子網中移除,一個DeletePort API調用被Nova執行用來刪除租戶VM。作為ML2插件提供的刪除創建端口服務的一部分,ML2插件將通知L3 Plugin一個新的端口正在被刪除。L3 Plugin將檢查這個要刪除的端口是否在一個DVR組建的子網中。如果不是,則不做任何操作。如果是,L3 Plugin將啟動一個RPC call port_delete() 到 the L3-Agent-on-CN。L3-Agent-on-CN收到這個RPC請求,會獲取這個port的信息,然后為這個port移除靜態的ARP表項到 對應的路由器命名空間。這樣就完成DVR側對一個新租戶的VM port的移除。
移除的port被L2 agent檢測到,L2 agent驗證這個端口是否是已經存在分布式路由的子網的一個成員。如果不是,則做普通操作。如果是,執行特定操作:在br-int和br-tun上為匹配的子網網關移除這個port(OFPORT)到現有的OVS規則中。
原文出自:http://blog.csdn.net/canxinghen/article/details/41443127