VLANawareVM引發的問題和解決方法

2021-12-30 03:52:27 字數 1708 閱讀 4071

vm能夠傳送和接收帶有vlan tag的報文,這種情況叫vlan aware vm。乙個可以vlan aware 的vm,意味著它可以接入多個network(vlan),如下圖所示。

在neutron模型中並沒有vm的概念,而是以port指代。我們先這樣簡單的理解port,port是vm的虛擬網口。在沒有引入trunk networking特性之前,neutron的模型設計中有這樣的約束:乙個port只能屬於乙個network。假設乙個vm只有乙個port,如果想讓vm具備vlan aware特性,這就意味著這個port必須要屬於多個network,

這與neutron的約束是矛盾的,如下圖:

那麼這個問題怎樣解決呢?這裡先引入幾種不太合適的方案,以此引出trunknetworking的設計。一 乙個vm多個port乙個vm具有多個port,這個很正常,而且這個方案還不打破neutron原來的模型和實現方案。如下圖:

這個方案幾乎完美,但是如果考慮到這樣的需求:乙個vm需要對接到幾百個network,那麼乙個vm就需要幾百個port,也就是說需要幾百個虛擬網絡卡,這是不現實的。

二 乙個port對應多個network

既然需要那麼多network,那麼我們可以修改一下模型,就讓乙個port對應多個network,而且將vm的虛擬網口(port)設定為「trunk」模式。如下圖所示:

這個方案表面上看沒問題,但是還是要考慮具體的實現模型。如果實現模型不改變,還是有一點問題,如下圖所示。

計算節點的實現模型中涉及內外vlan的轉換。我們假設這個計算節點中,一開始只有vm1、vm2兩個虛擬機器。這兩個虛擬機器的內外vlan id如下表:

如果我們不考慮vlan aware vm特性,這一切都是正常的。內部vlan只會在host內區域性有效,br-int會保證這些內部vlan id不衝突。此時,如果乙個租戶建立乙個虛擬機器vm3,他要求這個vm是vlan aware的,並且要求這個aware的vlan id是:10、11。這樣vlan id=10就與vm1的內部vlan id衝突了,而且這個衝突還非常嚴重。

1 衝突無法避免:租戶並不知道計算節點的內部實現,並不知道他選擇的vlan id衝突了。而且就算知道了,也可能沒辦法,他就是需要這個vlan id,你說怎麼辦。

2 衝突難以解決:租戶vlan id不能更改,只能修改vm1的內部vlan了,這個修改好像不太可取。

三 vlan透傳

出於各種各樣的原因,ovs(open vswitch)就不支援vlan透傳特性。openstack對ovs有很強的依賴性,ovs如果不支援vlan透傳特性,那意味著neutron試圖通過vlan透傳方案解決vlan aware vm的問題基本宣告失敗。

is uploaded file函式引發的問題

起因 在利用moophp的乙個專案中,接到使用者反饋說其所有客戶不能上傳檔案,都返回失敗。經過排查發現是php中的is uploaded file函式在 搗鬼。細節分析 在正常情況下,通過php 上傳檔案 需要通過is uploaded file函式來判斷檔案是否是通過 http post 上傳的,...

記一次noprefixroute引發的問題

ip addr顯示內容 inet 中包含 noprefixroute,看著礙眼想去掉,不知道怎麼弄。最終找到了一台不顯示這項引數的機器,開啟其 etc sysconfig network scripts ifcfg ethx,多方比對發現配置了nm controlled no。該引數預設為yes,竟...

Linq中Count 和Any 引發的效率問題

1 count和any 今天看了0 來判斷集合非空 href target blank 鶴沖天的文章 linq 切勿使用 count 0 來判斷集合非空 有所收穫,寫下文章總結一下 先看如下 1 static void main string args 212 public static ienum...