1. 程式人生 > >openstack學習之neutron_ml2_plugin

openstack學習之neutron_ml2_plugin

 neutron中定義了許多Rest API,API的具體實現放到plugin中實現。 neutron plugin neutron設計了plugin的機制來實現這些定義的API。網路虛擬化的是實現技術可以有很多種(可以參考博文《網路虛擬化技術》),不同的是實現技術可以使用一個plugin來實現。 每種plugin代表了一種網路虛擬化的實現技術。不同的實現技術所提供的對外管理介面各不相同,plugin用來實現neutron rest api和相應實現介面之間的適配。 實現技術可以有兩種部署方式: 1)分散式方式,多為VEB技術採用。VEB安裝在每個計算節點上,每個計算節點同時安裝一個core agent。plugin通過和幾點上的agent通訊來在節點上實現neutron中定義的網路結構。代表產品如open vswitch, cisco Nexus 1000V等。 2)集中式方式,多為硬體實現採用。硬體實現網路虛擬化實現類似於傳統的交換機,內部支援VEPA或VN-TAG技術。計算節點接入該交換機,通過neutorn plugin實現對交換機的配置來實現neutron中定義的網路結構。硬體實現會有更好的效能,但一個問題是擴充套件性(scalability),目前的Plugin中,一般只能管理一個交換機。代表產品有brocade的VDX 67xx series等 neutron中只能載入一個plugin,這導致了openstack中只能使用一種虛擬網路實現技術,為了解決這個問題,出現了meta plugin和ml2 plugin。 meta plugin
meta plugin可以同時載入多個plugin,並將rest api轉發給各個plugin。meta plugin是一種比較巧妙的設計,對現有的plugin不需要改動。meta應該是一個權宜之計(work around),並不是完美的解決方案。 ml2 plugin ml2 plugin則是重新定義了一套框架,來支援不同的虛擬網路實現技術。ml2 plug和原來的plugin不相容,原來的plugin需要改寫成ml2 mechanism driver。和meta比,ml2的結構更清晰,擴充套件性更強,ml2應該是未來neutron plugin的方向。 核心概念: TypeDriver
和neutron中的網路拓撲對應,有local,flat,vlan,gre,vxlan等。實現和底層實現技術無關的程式碼,有4個介面: def validate_provider_segment(self, segment): def reserve_provider_segment(self, session, segment): def allocate_tenant_segment(self, session): def release_segment(self, session, segment): TypeDriver的程式碼和具體的底層實現無關,所有的實現都可以複用這部分程式碼。 MechanismDriver
用來將rest api轉化為底層實現技術的呼叫,類似於原來的Plugin實現。每種網路虛擬化實現要實現自己的MechanismDriver來驅動後端的實現。 ml2的核心就是可以載入多個mechanism drivers,在一個openstack環境中支援多種虛擬網路實現技術。如有些節點可以使用openvswitch,有些則使用cisco Nexus 1000V等。 ml2的基本程式碼邏輯: 針對每個rest api,會呼叫所有mechanism driver的相應方法(這個思路和meta中遍歷呼叫Plugin的方法類似)。如create network: self.mechanism_manager.create_network_precommit(mech_context) self.mechanism_manager.create_network_postcommit(mech_context) mechanism driver提供2個方法,一個是XXX_precommit,一個是XXX_postcommit. XXX_precommit在一個事物中呼叫,過程中丟擲異常,neutron中的資料庫會自動回滾。 XXX_postcommit在事物外呼叫,過程中出現異常,neutron中的資料庫不變。 開發人員需要根據業務特點,來決定使用哪種方式。 MechanismManager:     def _call_on_drivers(self, method_name, context,                          continue_on_failure=False): 該方法用來呼叫ml2載入的所有meachnism driver。 對於採用core agent的實現技術,ml2提供了可複用的框架程式碼,相應的mechanism driver的開發非常簡單。 SimpleAgentMechanismDriverBase:提供了框架程式碼。 LinuxbridgeMechanismDriver:支援linux bridge的mechanism driver. OpenvswitchMechanismDriver:支援open vswitch的mechanism driver.
其他的plugin,會逐步遷移到ml2plugin框架中。 參考: