天天看點

《OpenStack運維指南》節選—— 雙層VLAN

雙層vlan

我在加拿大不列颠哥倫比亞省的基隆拿建立了一套新的openstack系統。整個部署過程是全自動的:cobbler負責在硬體上部署os,os被引導後,puppet接手剩下的事情。我已經在實踐中運作這套部署方案很多次了,就理所應當地認為沒有任何問題。

在基隆拿的最後一天,我在酒店裡參加電話會議。實際上,我正在新部署出來的雲系統裡面随便玩着。我啟動了一個虛拟機執行個體,并登入進去。一切看起來都很正常。閑着無聊,我運作了一下ps aux指令,突然整個虛拟機執行個體就鎖住了。

我認為這是一個偶發事件,是以我停止了這個執行個體,并啟動了一個新的。這時,電話會議結束了,我需要去資料中心走一趟。

在資料中心,我完成了一些收尾的工作,這時想起了那個執行個體鎖住的的事情。于是我登入到新的執行個體,并再一次運作ps aux。它工作正常。唷。我決定再運作一次。它又鎖住了。搞什麼啊!

在重制了這個問題幾次之後,我得出一個不幸的結論,那就是這套雲系統其實真的有問題。更糟的是,我在基隆拿的出差就要結束了,我必須回到卡爾加裡去。

我應該從哪裡開始排查像這樣的故障呢?一個虛拟機執行個體因為一個指令就随機地鎖住了。是鏡像的問題嗎?不——所有鏡像都有這個問題。 是計算節點的問題嗎? 不——所有節點都有這個問題。執行個體真的鎖住了嗎?不!因為新的ssh連接配接很正常!

我們去尋求幫助,一個網絡工程師說可能是mtu的問題。太棒了!mtu!終于有進展了!mtu是什麼?它為什麼會出問題?

mtu是最大傳輸單元(maximum transmission unit)的英文縮寫。它規定了網卡接收的每一個資料包位元組的最大值。如果兩個網卡上的mtu設定不一樣,過來的位元組就會被卡住,奇怪的事情就會發生 ——比方說會話随機被鎖住。

并非所有的資料包都有1500 b這麼大。通過ssh運作ls指令可能隻會建立一個小于1500 b的資料包。但是,運作的指令如果有很大的輸出,比方說ps aux指令,就需要多個1500 b的資料包。

好的,那麼mtu的問題是從哪兒跑出來的?為什麼我們在其他的任一部署中沒有遇到過這個問題?這次的情況有啥新變化嗎?好吧,新的資料中心,新的上行鍊路,新的交換機,新的交換機型号,新的伺服器,第一次使用這個型号的伺服器……是以,基本上所有東西都是新的。太棒了。我們在各個地方都要調大了mtu:交換機,計算節點的網卡,執行個體的虛拟網卡,甚至使資料中心為我們的上行鍊路接口都調大了mtu。一些修改起作用了,一些卻沒用。可是這條排障的方向似乎不對,我們沒必要在這些地方調整mtu。

作為最後一根救命稻草,我們的網絡管理者(alvaro)和我坐在一起,旁邊有四個終端視窗、一根鉛筆和一張紙。在其中一個視窗中,我們運作ping。在第二個視窗中,我們在雲控制器上運作tcpdump。在第三個視窗,我們在計算節點上運作tcpdump。然後第四個視窗中,我們在執行個體上運作tcpdump。介紹一些背景:我們這個雲是多節點而不是多主機設定。

一個雲控制器作為所有計算節點的網關。vlanmanager用來配置網絡。這意味着,雲控制器和所有計算節點在每一個openstack的項目中都使用一個不同的vlan。我們使用了ping的-s選項來修改資料包的大小。我們觀察到有時這個包可以完整地傳回,有時它發出去了卻沒法回來,而有時它會随機地停下來。我們修改tcpdump來顯示資料包的十六進制轉儲,并不停地修改ping的組合:外部、控制器、計算節點和虛拟機執行個體。

最終,alvaro發現了一個問題。當一個資料包從外面到達雲控制器的時候,它不應該配有一個vlan。我們确認了這點。當資料包從雲控制器發往計算節點時,隻有當目的地是一個虛拟機執行個體時,它才會攜帶一個vlan。這也是對的。當ping應答從執行個體發出時,它應該在一個vlan裡面。确實如此。當它傳回到控制器,然後發送到網際網路上時,它不應該再帶有一個vlan。不對。噢,看起來好像是這個包的vlan部分沒有被移除掉。

那是說不通的。

帶着這個想法,我在計算節點上随機地敲了一些指令:

$ ip a… 

10: vlan100@vlan20: <broadcast,multicast,up,lower_up> mtu 1500 qdisc noqueue master br100 state up 

… 

“嘿,alvaro,你能在一個vlan上運作一個vlan嗎?”

“如果你這麼做,就會給資料包增加額外4個位元組。”

那麼這就全說通了:

grep vlan_interface /etc/nova/nova.conf 

vlan_interface=vlan20 

在nova.conf中,vlan_interface指定了openstack要在哪個網卡上挂vlan。正确的設定本應該是:vlan_interface=bond0。

這也就是伺服器捆綁後的網卡。

vlan20是資料中心配置設定給我們用于公網通路的vlan。它是一個正确的vlan,也和bond0相連。

結果我錯誤地把openstack配置成了将所有的租戶vlan與vlan20而不是bond0相連,是以這就在一個vlan上又疊加了另一個vlan。結果每個包增加了額外的4 b,導緻發出的是一個1504 b的包,這當然會出問題,因為我們網卡有1500 b的限制啊!

這個設定一修複,一切都好了。

《OpenStack運維指南》節選—— 雙層VLAN

本文作者:錢永超

來源:51cto

繼續閱讀