天天看點

無網不通,有網則順:OpenStack Neutron解析

摘要:了解Neutron的功能和部署方式,是企業OpenStack系統的規劃、部署和運維需要修煉的内功。在本文中,Neutron“大師兄”龔永生為我們詳細介紹了Neutron的技術原理和發展方向,主要涉及使用、部署和運維三個層面的内容。

【編者按】Neutron是OpenStac環境的核心元件之一,了解Neutron的功能和部署方式,是企業OpenStack系統的規劃、部署和運維需要修煉的内功。在本文中,Neutron“大師兄”龔永生為我們詳細介紹了Neutron的技術原理和發展方向,主要涉及使用、部署和運維三個層面的内容。

一、Neutron功能介紹

作為OpenStack網絡子產品,Neutron是分布式的OpenStack Iaas環境核心元件之一。Neutron,或者是Neutron的前身,是為了在分布式環境下面給虛拟機提供網卡,這是它的最基本的要求。此外,Neutron還要虛拟化網絡功能的其它元件,比如抽象交換機,抽象負載均衡器,抽象防火牆,抽象NAT。Neutron這個團隊是先做API,做模型,先把API畫下來,達成比較一緻的時候才能往下實作,實作資料庫和相關agent等其他的東西。Agent一般會是Linux裡面的相關技術來完成。

有了網絡元件的虛拟化之後Neutron還要完成把這些虛拟網絡元件連起來。大家分散在這兒能幹嘛,什麼東西都不能幹。這是Neutron要幹的事情,而且這個在以後會大量的占用Neutron社群人員的工作。

對Neutron來說,圖1-1所示

無網不通,有網則順:OpenStack Neutron解析

圖1-1

我們先看的是虛拟化網絡元件,網絡端口,ACL,或者是交換機,或者是路由器等等,再是它們之間的互聯形成的虛拟網絡拓撲,這是最終使用者或者是我們在虛拟化看到的景象。在實體層看到外部網絡,實體機,交換機,路由器,連接配接各種網絡的網線等。虛拟化網絡最終還是要通過實體層面承載,是以我們部署的時候必須要掌握實體之間它們怎麼互聯,實體網絡方面必須快速,穩定。這樣我們在Neutron建構虛拟化的網絡拓撲的時候才能有一個可靠的承載手段。

總的來說,Neutron要做的事情包括:虛拟化網卡,虛拟化各種網絡部件,在虛拟化元件之間互聯,把虛拟化和實體網絡上打通,這樣虛拟化的東西才能走。

二、Neutron體系結構

Neutron主要是用來做模型的,如圖1-2所示

無網不通,有網則順:OpenStack Neutron解析

圖1-2

Neutron這個TEAM的首要工作是定義API,API的核心是它的資料模型。端口在資料模型中占有重要位置。端口首要是作為虛拟機的網卡,然後是路由器端口,端口上面還綁安全組,形成規則來提供端口的通路控制。端口是綁在每個網絡上面的,網絡能給端口跟别的網絡上的端口提供隔離。端口的IP位址從子網來擷取。浮動IP是在公網上可以通路的一個IP,在綁定到某個端口之後,這個端口就可以從外界通路了。除了上圖顯示的一些模型外,防火牆、負載均衡器等都是Neutron模型的一部分。

Neutron的功能元件裡頭,Neutron Server用來綁定所有的模型。它通過消息隊列和所有的agent進行通信,後者真正地把網絡模型實體落地。Neutron Server儲存的是虛拟網絡TOP的模型,今後的版本要把Neutron Server劈開,一半來實作API,另一半和agents進行互動。

網絡,端口,子網模型由核心API實作,另外一些API通過擴充實作。如圖1-3所示

無網不通,有網則順:OpenStack Neutron解析

圖1-3

整個OpenStack是插件式,Neutron Server也是如此。Neutron中有核心插件和服務插件的區分,這有社群的實作,也有各個廠商的實作。

部署OpenStack先要定義這些網絡:管理網絡,資料網絡,存儲網絡,公有網絡,甚至内部網絡。不管是Nova API,還是Neutron Server,都在控制節點上部署。如圖1-4,圖1-5和圖1-6所示。提供三層網絡服務的我們稱之為網絡節點,防火牆,路由器和DHCP agent等等都在網絡節點上。你要通路虛拟機,你要是公有網。我們看部署方案二,它把計算和存儲合二為一。因為計算節點伺服器可能有很多槽,這些槽不要浪費了,做一個分布式存儲,這樣把存儲節點合并起來,但是網絡節點還在這兒。為什麼把網絡節點分開?網絡節點還是有它的好處,網絡安全等等是有特殊性要求,在這上面單獨部署還是挺好。方案三中進一步把網絡節點上的功能也并入到計算節點上,這種部署方案可以簡化雲計算方案中的硬體規範,但是需要做好隔離,這樣網絡、存儲和計算不會互相競争CPU,記憶體和IO資源。

無網不通,有網則順:OpenStack Neutron解析

圖1-4 

無網不通,有網則順:OpenStack Neutron解析

圖1-5 

無網不通,有網則順:OpenStack Neutron解析

圖1-6

三、Neutron的管理者特權

在Neutron中有兩種角色,一個角色是管理者,另一個角色是普通使用者。

由圖1-3 Neutron的層次圖來看,上面是API,有核心API和擴充API。指令neutron ext-list可以看到這個系統有哪些擴充,每個擴充大概是什麼意思。因為有了擴充才會有相應的功能。還有超級管理者比較常見的就是neutron agent list,這個指令很關鍵。還有網絡綁定,也隻有管理者才能看見,如圖1-7所示

無網不通,有網則順:OpenStack Neutron解析

圖1-7

圖1-7上标注部分隻能管理者看到,使用者看不到。網絡綁定是指虛拟網絡在實體網絡上面是什麼類型。一般的支援五種網絡類型,Gre,vxlan,vlan,flat,local。Physical_network對于vlan,flat類型,指定橋接的bridge。建立一個虛拟網絡,這些字段系統會給普通住戶填寫,但是如果想建立成某個類型,建立到某個實體網絡上面去,管理者是有特權的。用這個特權我們看看建立外部網絡和子網。如圖1-8所示

無網不通,有網則順:OpenStack Neutron解析

圖1-8

我們在部署完一個雲之後,管理者上去的第一個任務就是建立它的外部網絡,網絡類型是local。管理者還要從網絡部門拿到一部分的IP位址段和網關,再來建立外部網絡子網。

四、Neutron的普通使用者工作流程

普通使用者的工作流程大概有7步。如圖1-9,圖1-10和圖1-11所示

無網不通,有網則順:OpenStack Neutron解析

圖1-9

無網不通,有網則順:OpenStack Neutron解析

圖1-10

無網不通,有網則順:OpenStack Neutron解析

圖1-11

我們腦袋裡面有這個圖,對運維來說很關鍵。我們就知道大概在實體世界會産生什麼問題,會起到什麼效果。第一步是建立虛拟網絡,Neutron會把它綁定到某個隧道,第二步是創造子網,指定IP位址段、網關,這時在實體上就會有DHCP伺服器起來。第三個建立路由器,系統就會把它綁定到某個節點。第四步就是把這個路由器和子網連起來,這個虛拟路由器就有一個端口會連到虛拟網絡,第五步是設定路由器的外部網關,這時網絡節點上就有一個虛拟裝置把虛拟路由器和外部網絡連接配接起來。第六步就是做安全規則,第七步就是利用安全組和子網建立虛拟機。整個鍊條如果很熟悉,排除故障就很簡單。

五、Neutron運維

運維人員很多時候是必須要有管理權限,管理人員就是運維。如果我們定義清楚,也可以定義出自己的角色來,把Neutron的角色分工細分一下。下面我們介紹幾個在運維中常出現的問題和排錯手段。

1.  節點down了,如圖1-12所示

無網不通,有網則順:OpenStack Neutron解析

圖1-12

剛剛部署完了,一看上去全部是down掉了,down掉了怎麼辦?我要查整個部署。一查沒有部署這個沒有部署那個,這時日志很關鍵。是以在部署的時候要統一日志收集,你在上面就可以看到各種日志。看Rabbitmq,檔案句柄太少了,或者是硬碟太小了,都會影響到rabbitmq接受agent的連接配接。還有檢查Server,看Neutron Server是不是出問題了。最後就是不要出現時間不同步的問題。

2.  floatingip不通,如圖1-13所示

無網不通,有網則順:OpenStack Neutron解析

  圖1-13

先看看VM是否配置設定到了固定IP, 是否能通到VM網絡的網關。再查詢它的安全組規則,看看是否阻止了某種網絡流量。再看看這個IP所在的ROUTER是什麼,再看看router所在的網絡節點,進入這個路由器所在的名字空間,察看floatingip是否存在。軟體方面有時候重新開機也是能解決問題的。

3.  L3節點錯誤,如圖1-14所示

無網不通,有網則順:OpenStack Neutron解析

 圖1-14

L3出錯了怎麼辦?這時可能需要遷移。首先我們把這個L3 agent設為down,down完之後看看這個節點上所有的router。 接着把所有router的管理狀态設為down, 然後又設為up, 這時系統就會重新綁定router到其它網絡節點。這個過程很複雜,人工去做會影響比較長的時間。現在很多友商用監控,如果L3 agent出錯, 啟動自動腳本進行遷移。 在Kilo版中, HA router也是一個不錯的選擇。

4.  還有一個端口綁定失敗,如圖1-15所示

無網不通,有網則順:OpenStack Neutron解析

  圖1-15

這是經常遇到的一個問題。在我的産品中,如果出現綁定失敗,就直接抛出錯誤,這樣問題就會第一時間暴露出來。如果不這樣做,直接把“binding_failure”寫在資料庫裡面,虛拟機就拿不到IP。怎麼解決呢?在Neutron裡面隻要把這個host_id先置一下,再置回去,這時候能讓Neutron agent重新綁定端口,設定正确的TAG.

5.  要注意TAG 4095端口,如圖1-16所示

無網不通,有網則順:OpenStack Neutron解析

  圖1-16

我們确認port不在Neutron Server中,然後删除ovs  port。如果在Neutron Server中有,就要重新改一下,讓它的binding重新做。

做OpenStack運維,整個網絡流程是必須掌握的。我們看Neutron鍊路分析,如圖1-17所示

無網不通,有網則順:OpenStack Neutron解析

  圖1-17

有觀點說,對虛拟機的啟動過程進行詳細分析後就掌握一半的OpenStack,我認為,把上圖分析透了就掌握一半以上的Neutron。

在運維方面,我一直在想能不能有像一個機器人一樣的東西。有個知識庫,發現問題報告出來,甚至能自動修複,這也是我經常做夢想實作的。其實網絡方面還有很深的水,這裡隻是講了一部分。SDN,NFV或者是DVDK,都是有意思的東西。(責編/周建丁)

作者簡介:龔永生,九州雲架構師。多年Linux系統開發,J2EE産品和雲計算相關技術研發經驗。目前活躍在OpenStack社群的各個項目上,主要技術方向是虛拟網絡項目Neutron,是Neutron項目早期的主要貢獻者之一。