OpenStack Neutron DVR L2 Agent的初步解析(二)

聲明:

本博客歡迎轉載,但請保留原作者信息!

作者:林凱

團隊:華爲杭州OpenStack團隊

 

OpenStack Juno版本已正式發佈,這是這個開源雲平臺的10個版本,在Juno版的Neutron模塊中真正引入了分佈式路由(DVR)的實現,現在就讓我們來初步看下分佈式路由是怎麼樣工作的。

 

OpenStack Neutron DVR L2 Agent的初步解析 (一)中我們已經知道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規則中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章