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