對Neutron ML2的設計思想的理解

2021-08-08 18:16:09 字數 2507 閱讀 4377

最近在做乙個sr-iov網絡卡的測試,測試過程中再次看了下create_port的**,同時思考了一下ml2的設計思想。希望能幫助大家理解。

我們都知道,建立乙個port的時候,只需要指定network就行。

port的建立涉及到兩個階段。乙個是nova,其會呼叫plug_***將port在compute主機上做相關的plug操作(列如對於plug_ovs來說會建立qbr啥的)。另乙個階段是neutron,其會儲存port的相關資訊到資料庫中,然後相應的compute主機上的*** agent也會對port做相關操作。

比如我想實現乙個ml2的agent,那麼我要做什麼呢?根據上面的分析,我要做兩件事情:

1.讓nova把port plug到我的agent相關的物件上(比如br-int,比如qbr,比如eswich….)

2.執行對應的agent,維護port資訊

那麼如何讓nova呼叫我的agent driver實現的plug_*****呢?首先肯定nova的**裡要有這個,其次這裡的***如何獲取呢?很簡單,***就是port的binding:vif_type的值。如果乙個port沒有binding:vif_type,那麼nova會報錯。

那麼binding:vif_type這個來自於**呢?有幾種方式設定。比如:

a. 我建立port的時候指定我的nic的type,然後neutron-server在遍歷mech driver的bind_port方法的時候,每個driver的bind_port會判斷這個nic的type是不是自己支援的,如果是則設定這個port的vif_type,否則就忽略。這裡可以注意一點,如果多個mech driver都支援,那麼最後設定的mech driver會設定最終的vif type。另外這裡也能看到乙個設計上的隱含思想:乙個環境下不能有兩個mech driver其提供相同的 vif type。否則你讓nova呼叫plug_***的時候把這個port放到哪個mech driver管理的物件上呢?另外這裡也能看到nic和vif的區別。nic是針對vm的,所以nova和它打交道,但是vif是針對switch的,所以neutron和它打交道。

從上面可以看出,最簡單的讓乙個port被自己寫的ml2 mech agent管理的方法就是直接明確port的nic type,create_port根據nic type遍歷ml2 mech agent,只有我寫的mech driver會的識別這個nic type,於是給這個port的vif指定唯一的vif,於是nova就會把這個port plug到我的mech agent維護的物件上去了(一般是bridge)。

當然上面的分析忽略了network type的檢查。port所在的network的type必須被ml2 mech driver支援,否則也是直接忽略,不會設定vif的。

這裡是個合適的時候思考下ml2的設計思想了。type manager可以認為就是在db中設定足夠的資訊,尤其是segment的資訊。要知道,不管你compute上的agent是如何複雜,連線物理節點的物理網路是一樣的,就是乙個大二層。所有的ml2 mech agent都要基於這個思想來設計,既然如此,既然物理網路是一樣的,那麼這就給了同乙個環境同時執行多種ml2 driver的可能性了。想想tcp/ip棧,上層的應用可能千差萬別,但他們都能正常通訊,為什麼?因為分層、封裝、遮蔽。ml2也是這麼個思想,compute a上面可以跑*** agent,vm中的資料在*** agent上可能被***管理著,但是當他出來的時候,在物理網路它就是個打了vlan tag的資料報(如果是vlan的話),然後資料流進入compute b,b上的yyy agent負責將這個vlan tag包翻譯成自己理解的東西就行了。

從上面這段可以自然而然的看到:type manager決定的是物理網路的型別!

如果理解了這個,那麼對type manager就完全理解了。type manager是物理網路的型別,也就是我們的基礎,我們的底層。可以把type manager看成底層的公共層,則mech manager則是基於這個公共層的上層應用了。應用可以千差萬別,並且也能互相通訊,只要乙個前提:他們用的是同乙個底層。這個是自然的,因為對於乙個network,其只有乙個network type。type manager的核心是segment(因為segment有type啥的資訊啦)。

也就是說,只要type是一樣的(肯定是一樣的,因為network只有唯一的type),那麼ml2支援多個mech agent同時在同乙個環境下通訊。

這個時候再去看ml2的設計思路就很清楚了:我官方提供type,type的標準是定下來的。你們寫mech driver的人都按照這個官方要求來轉換、配置吧。只要你們的流量出到物理機外是遵循這個type的,那麼其餘的mech agent只要也遵守這個規定,那麼不同的compute上就能執行不同的mech agent。

當然啦,上面也提到了,雖然我的ml2 mech driver支援,但也要看使用者想不想用。如果我使用者明確指定了要用*** agent,並且在建立port的時候指定了***的nic type,那麼其餘的ml2 mech driver也就只能忽略了。

如果我想讓這個port歸我所有,那麼只要條件滿足,把port的vif type設定為我自己的型別就行了(vif就是switch,switch就是mech啦)

培養良好的設計思

我們常常會憑藉一眼的直覺去審視大師們的作品,卻沒有花太多的時間去思考他們是如何構思設計。乙個優秀的作品要從乙個正確的設計思維開始,缺乏深入思考往往會阻礙我們前進的步伐,所以小編今天要教大家培養良好的設計思維。在工作中,我比較強調設計思維,有正確的思維才能更好地駕馭自己的才能完成最終的作品,使用者不過...

android的元件 Intent及設計思想

broadcastreceiver元件 android總結篇系列 android廣播機制 全域性廣播的local廣播 android應用層 整個android系統,實際主要目的,就是打造乙個功能共享的世界。功能共享最重要的互動,於是android創造出一種intent和intentfilter配合的...

對WebService的在企業應用中的思考。

webservice能給企業應用軟體帶來什麼好處,答案很多,但回答最多莫過於 跨平台 難道我們為企業開發中應用程式的目的是 跨平台 嗎,答案是否定,這不過是一種噱頭。估計有很多人會反對,理由是google ibm 等等的那個什麼什麼應用不就是webservice的,可以跨平台,呵呵,但別忘了,那些個...