前言
前陣子聽到IT圈內(nèi)的朋友聊到,IaaS相關(guān)領(lǐng)域的軟件工程師應該是當前IT產(chǎn)業(yè)中待遇最高的一批人。云計算作為IT基礎(chǔ)產(chǎn)業(yè),已經(jīng)獲得國內(nèi)外IT界的高度投入。當前只要是大型的互聯(lián)網(wǎng)公司,不論是做門戶的、視頻的、搜索的,還是電商的、社交的、游戲的公司都在云計算上投入巨額的人力物力,以期望占領(lǐng)Iaas的制高點。他們通常是以自身業(yè)務需求為起點,來部署IaaS。一旦成功部署,也可以利用IaaS來創(chuàng)建新的業(yè)務領(lǐng)域。此外,這兩年因IaaS而獲得風投的創(chuàng)業(yè)企業(yè)也頗多,他們手上有大筆的現(xiàn)金,不惜以重金和高股票來籠絡軟件人才。不過,相比于各大公司對云人才的渴求,這個市場上真正合格的IaaS軟件研發(fā)工程師卻非常少。主要原因大概是因為IaaS系統(tǒng)本身涉及的內(nèi)容比較廣泛,需要軟件開發(fā)人員對IT領(lǐng)域有一定的積累。前陣子,我造訪了電子科技大學,和計算機專業(yè)的大學生進行了一些交流。發(fā)現(xiàn)同學們對云計算技術(shù)非常感興趣,但是對它的具體功能和原理很難準確描述。
本人從10年前開始玩虛擬化,之后由于工作和興趣,也對云計算有了一些了解。個人感覺IaaS并沒有像云一般難以琢磨和理解,并非需要很高深的計算機知識,有很多方面也是很多基本的計算機概念組成。于是在回上海的飛機上就有了要寫一點關(guān)于介紹基本的IaaS概念和基礎(chǔ)的想法。希望能幫助對IaaS感興趣的人能夠了解和進入這個領(lǐng)域,也希望有更多的人能加入IaaS軟件的開發(fā)中來,讓這個潮流技術(shù)盡快普及。
雖然IaaS并不一定需要虛擬化,但是通常來說虛擬化被認為是IaaS的基礎(chǔ),本篇短文將會主要介紹IaaS環(huán)境下各種資源是如何被虛擬化的。
IaaS的基本概念
IaaS (Infrastructure as aService)基礎(chǔ)架構(gòu)即服務,是云計算的一種類型,它是PaaS(Platform as a Service 平臺即服務)和SaaS(softwareas a service軟件即服務)的基礎(chǔ)。IaaS軟件通常用于管理大規(guī)模的物理硬件(IaaS可以管理小到一臺物理主機,多到成千上萬的物理服務器)并把客戶所需的軟硬件資源(CPU,內(nèi)存,網(wǎng)絡,存儲等)以“主機”的形式提供(這里的主機可以是一臺獨立物理主機,但更多的情況是虛擬機,VirtualMachine, 簡稱VM)。
IaaS的根本目的在于計算資源的池化、統(tǒng)一的、智能的(如按需)管理調(diào)度。計算資源的池化,也就是把所有的資源放在一個大池子里并按照較小的單元進行管理。例如把100個1TB的硬盤放在存儲池中,這個池子便有了100TB的容量,分配存儲的時候,不再是以1TB這樣的獨立硬盤單元進行分發(fā),而是可以分發(fā)一個較小的容量(例如10GB,具體的分配的單元可以由IaaS進行配置)。IaaS的Service,現(xiàn)在普遍都是以WebService的形式來提供,因為非常容易操作。
IaaS所提供的虛擬機通常都會至少包含一個可以連上網(wǎng)絡的操作系統(tǒng)(如Linux,Windows)。用戶通過網(wǎng)絡可以登錄并操作虛擬機并按照虛擬機的資源配置和使用時間來付費。用戶在虛擬機上進行的操作就同操作一臺本地剛剛安裝好操作系統(tǒng)的電腦一樣,他可以在虛擬機上安裝更多的軟件(如Apache,MySQL,SQL-Server,Python,GCC等等)。他還可以加載自己的程序以完成更多的功能(例如搭建一個網(wǎng)站,或者VPN服務器)。用戶還可以靈活的按需申請存儲空間。由于這些提供給用戶的功能都是最基礎(chǔ)的計算機功能,所以這種服務形式也就被形象的稱為基礎(chǔ)架構(gòu)即服務。
雖然講了IaaS的基本概念,大家對為什么需要IaaS也許還有疑問。IaaS軟件提供的功能和傳統(tǒng)的不使用IaaS軟件相比,究竟有什么好處呢?我們來舉一個例子,在傳統(tǒng)方式里,當客戶由于業(yè)務(開設(shè)一個社交網(wǎng)站)需要搭建一個小型服務器,在搭建上層服務軟件之前,他還需要購買硬件和安裝操作系統(tǒng),這往往都需要至少一天的時間,由于直接購買硬件會導致一次性產(chǎn)生大量的花費,而且用戶需要對軟硬件提供日常的保養(yǎng)維護。相反,IaaS軟件通常可以在分分鐘就提供客戶所需的全部資源,而且是按需(使用的時間和空間)收費。這不僅節(jié)省了用戶的時間,還節(jié)省了客戶初期的投資,也降低了客戶構(gòu)建服務器的門檻(很多人往往需要花費大量的時間來調(diào)查購買什么樣的服務器,安裝什么樣的操作系統(tǒng)。當使用了IaaS軟件后,用戶可以在業(yè)務開始之初只申請配置較小的虛擬機,當業(yè)務需求提高后,再升級到更高配置的虛擬機)。此外IaaS軟件還會提供全方位的安全保障,用戶不必擔心自己在云上的數(shù)據(jù)會因為普通的硬件故障而導致丟失。所以IaaS提供的按需服務,是一種先進的,快捷的,更經(jīng)濟的和更安全的軟件服務形式。有了IaaS之后,PaaS和SaaS會更加容易的疊加和部署。
那么誰會使用IaaS軟件呢?公有云服務提供商是IaaS概念的發(fā)明者(Amazon在2005年推出了最早的公有云AWS服務),也是目前IaaS軟件商業(yè)使用的主力軍。公有云服務提供商,他們擁有海量的物理服務器(數(shù)千,到數(shù)十萬),大規(guī)模的網(wǎng)絡帶寬和穩(wěn)定的機房環(huán)境。要管理這些海量的物理服務器,如果僅僅通過人工方式來進行是不可想象的。IaaS軟件可以做到自動的通過網(wǎng)絡來管理物理服務器的配置和運行。另外考慮到大量的客戶往往只需要比較小的服務器資源,這些小資源的配置往往比單臺物理服務器小很多,那么就需要通過軟件的方法把單臺物理服務器的資源在保證數(shù)據(jù)安全隔離的情況下分配給不同的用戶使用。IaaS軟件可以輕松的把一臺服務器的資源劃分成幾個或幾十個虛擬機的形式提供給客戶(IaaS軟件也可以把一臺服務器的全部資源做成一個虛擬機;或者不采用任何虛擬化技術(shù)而直接使用物理服務器,通常這種形式被稱為Baremental)。這種降低了單個客戶成本的方式,擴大了客戶量,也就大大提高了公有云服務提供商的營收。除了公有云提供商外,私有云和混合云是IaaS軟件的主要使用者。使用私有云的企業(yè)往往是中大型的公司,他們內(nèi)部有大量的服務器需要管理,這點和公有云服務商的類似,他們也需要高效的自動化IaaS軟件來幫助管理這些大量的服務器。當采用了IaaS來管理私有云之后,企業(yè)的業(yè)務模式也可以發(fā)生拓展,在內(nèi)部私有云超負荷的情況下(例如當節(jié)日促銷活動時,客戶服務的需求量可能是平時的十幾甚至幾十倍),可以和公有云組建混合云,這就讓企業(yè)的服務能力變得無限。目前IaaS軟件還沒有在家庭用戶中直接使用,不過未來個人云創(chuàng)新后,家庭用戶可能可以直接使用IaaS軟件的衍生產(chǎn)品。
目前最主流IaaS軟件有亞馬遜的AWS,微軟的Azure和開源的OpenStack。其中前兩個都是閉源的僅供內(nèi)部使用,想?yún)⑴c開發(fā),只能加入亞馬遜或者微軟了。OpenStack是目前最火的開源軟件,已經(jīng)有183家公司和3386名開發(fā)人員參與研發(fā)。據(jù)分析,到2018年OpenStack將會擁有33億美元的云市場。國內(nèi)超過一半的IaaS研發(fā)公司都在使用OpenStack。因為開源,OpenStack非常有利于學習和研究IaaS的基本概念。
IaaS的基本資源
IaaS把眾多的物理資源進行劃分和重組,提供給用戶。IaaS具體管理的物理資源,可以分為三大類:計算資源(CPU加內(nèi)存),存儲資源和網(wǎng)絡資源。從計算資源角度來講,IaaS軟件管理的最小的物理單元為一個物理服務器(Host)。根據(jù)需求,服務器上會被創(chuàng)建多個虛擬機。若干配置相同(相同的虛擬化軟件Hypervisor和網(wǎng)絡設(shè)備以及拓撲結(jié)構(gòu))的物理服務器會組成一個集群(Cluster),要求配置相同的主要原因是因為需要支持虛擬機動態(tài)遷移。通常一些集群還會組成更大規(guī)模的區(qū)域(Zone)。某些IaaS軟件,還能支持由若干Zone組成的地區(qū)(Region)。集群、區(qū)域的劃分會體現(xiàn)在對網(wǎng)絡和存儲不同配置。例如一個集群可以共享相同的網(wǎng)絡主存儲,以支持虛擬機的動態(tài)遷移。一個區(qū)域可以共享相同的網(wǎng)絡備份存儲,可用來存放共享的虛擬機鏡像文件。
虛擬機和存儲服務是IaaS提供服務的最基本單元。通常存儲服務是和虛擬機緊密相關(guān)的,這是因為用戶主要是通過虛擬機來訪問IaaS的存儲資源(這點和PaaS和SaaS不同)。IaaS依賴于軟硬件虛擬化技術(shù)(現(xiàn)在主要是硬件虛擬化)在一個服務器上創(chuàng)建多個VM,所以虛擬化(Virtualization)常被稱為是云計算的基礎(chǔ)。所以如果要了解IaaS,我們就不得不認識一下虛擬化技術(shù)。虛擬化技術(shù)上也并不神秘,它通過時空復用的技術(shù)讓資源可以被劃分和共享。
IaaS的基本資源的虛擬化
CPU虛擬化
首先我們來看一下CPU是如何虛擬化的。對于當代的CPU來說,它具有極高的計算調(diào)度能力,它能在一秒鐘內(nèi)可以運算上千萬條指令。另外,由于客戶的虛擬機往往運行的并不是計算密集型的應用程序(如瀏覽網(wǎng)頁,訪問數(shù)據(jù)庫,存儲文件等等),換句話說它的程序功能可以在很短時間(毫秒級別)內(nèi)計算完成,當計算完成或等待其他網(wǎng)絡、硬盤等IO操作時,如果沒有其他計算任務,CPU便會進入空閑(IDLE)狀態(tài)。經(jīng)過統(tǒng)計,通常情況我們的CPU繁忙的時間很短,例如CPU有95%的時間都處于空閑狀態(tài)。如果我們讓CPU在等待的時候,也能給別人提供服務,便可以讓資源利用率最大化,所以CPU的虛擬化技術(shù)的本質(zhì)就是以分時復用的方式,讓所有的虛擬機能夠共享CPU的計算能力。因為CPU運算的速度非常快,而且這種分時的單元非常的小,以至于用戶完全不會察覺到自己的虛擬機是在CPU上輪流運算的,所以在宏觀的世界里,這些虛擬機看起來就是在同時工作的。當然IaaS軟件還需要通過一些手段保證每個虛擬機申請的CPU可以分到足夠的時間片。這是一個比較簡單的便于理解的對于CPU虛擬化的描述,但是CPU虛擬化內(nèi)幕是非常精巧和復雜的,為了實現(xiàn)高效準確的CPU虛擬化能力,世界上頂尖的軟硬件工程師已經(jīng)為此付出超過十年的努力。
內(nèi)存虛擬化
如果我們說CPU虛擬化是一個時間之旅,那么內(nèi)存虛擬化就是一個空間之旅。內(nèi)存是用來存放CPU要運行和計算的數(shù)據(jù)和代碼。我們知道,物理內(nèi)存在計算機上通常是一段以零地址開始以全部內(nèi)存空間為截止地址的空間。例如4個8GB內(nèi)存條組成的32GB內(nèi)存,它在物理服務器上看起來就是0~32GB的空間(可以在BIOS和系統(tǒng)啟動后看到)。內(nèi)存地址就好比門牌號碼,CPU在訪存的時候,只要提供對應的內(nèi)存地址,就可以拜訪對應地址內(nèi)的數(shù)據(jù)。對于每個虛擬機來說,不論它分配了512MB的內(nèi)存,還是分配了4GB的內(nèi)存,它通常都是認為自己的內(nèi)存是從零地址開始的一段空間(至少虛擬機的用戶是這樣認為的)。但是實際上,它們都會被映射到物理機上不同的空間段,有的可能是從1G開頭的,有的可能是從10G開頭的。而且不僅僅是內(nèi)存的起始地址在物理機上不同,通常連虛擬機的內(nèi)存在物理機內(nèi)存上的分布也不是連續(xù)的。他們可能會被映射到不同的內(nèi)存區(qū)間。虛擬機管理程序(Hypervisor)負責維護虛擬機內(nèi)存在物理內(nèi)存上的映射。當虛擬機訪問一段自己的內(nèi)存空間(例如1073741824,也就是1G)的時候,會被映射到真實的物理地址(例如6442450944)。這種映射對虛擬機的操作系統(tǒng)來說可以是完全透明而高效的。因為一臺物理機上運行了多個虛擬機,所以虛擬機管理程序需要保證,不論在任何時候,來自虛擬機A的訪存請求不能到達虛擬機B的內(nèi)存空間。這也就是資源的隔離?,F(xiàn)有的虛擬機管理程序甚至支持分配的虛擬機內(nèi)存空間的總和大于物理內(nèi)存,這種技術(shù)叫做超分(overcommit)。KVM里面使用KSM(KernelSamePage Merging)就可以讓在不同虛擬機里使用相同數(shù)據(jù)的頁(例如使用相同的內(nèi)核)共享一份內(nèi)存來保存。這就是內(nèi)存虛擬化帶來的好處。
存儲虛擬化
IaaS虛擬存儲資源的方法和虛擬內(nèi)存類似,主要也是通過把一個大的存儲空間劃分成多個小的存儲空間分配給虛擬機使用。但是與內(nèi)存虛擬化不同的是,存儲虛擬化通常并不是直接發(fā)生在硬盤的尋址層面,也就是不會在具體訪問硬盤驅(qū)動的時候才轉(zhuǎn)化訪問的地址。存儲虛擬化是以文件為單位來進行資源的存儲和隔離的。這個文件不是虛擬機里看到每個具體文件,而是在物理機上用于模擬虛擬機硬盤的一個超大文件,對硬盤地址的訪問就是對文件的某個偏移量的訪問。這點看似復雜,其實更容易理解。例如一個大小為20GB的獨立文件,可以被看成是一個20GB的硬盤空間,當需要訪問0地址的時候,也就是訪問文件的開頭,當需要訪問3G這個地址的時候,也就是訪問文件的3G偏移量的地方。使用這種靈活分配的方法,理論上可以讓一個2TB的物理硬盤,化身身成接近100個20GB或者接近20個100GB的硬盤。需要說明的是,看似一個完整的20GB文件,它在硬盤上可能并不是連續(xù)存放的,這完全取決于虛擬機管理程序的文件系統(tǒng)是如何分配硬盤空間的。當然虛擬機本身并不會意識到這點,具體訪問硬盤的時候,會由虛擬機管理程序的文件系統(tǒng)來保證訪問的準確性。有些虛擬機管理程序用一個文件來模擬一個虛擬機硬盤,有些則支持多個文件合并模擬一個虛擬機硬盤。使用多個文件來模擬虛擬機硬盤的方法更加靈活,并且有利于實現(xiàn)硬盤快照功能。
網(wǎng)絡虛擬化
與之前講的CPU、內(nèi)存、硬盤等物理資源相比較,計算機網(wǎng)絡虛擬化的內(nèi)容和實現(xiàn)要相對復雜一些。通常用戶通常熟悉的計算機網(wǎng)絡概念包含,網(wǎng)卡、IP地址,主機名等等。例如在一臺物理機上,可能有一個或幾個網(wǎng)卡,每個網(wǎng)卡在工作的時候會分配不同的IP地址,對外可能有一個或多個網(wǎng)絡主機名。網(wǎng)絡連接速度取決于網(wǎng)卡的能力以及網(wǎng)絡接入(例如交換機)的能力。在網(wǎng)絡上通過IP地址或者網(wǎng)絡主機名可以連接不同的物理主機,所以在一個可以路由的網(wǎng)段內(nèi)IP地址和主機名必須是唯一的。在每個網(wǎng)卡上,還有一個MAC地址,用來標識在相同網(wǎng)段上不同的網(wǎng)卡。用戶通常不會注意MAC地址,因為它并不需要用戶手動配置。那么什么是網(wǎng)絡虛擬化呢?假如原本的物理機只有一個網(wǎng)卡,那么它有一個MAC地址,并且可以分配一個IP地址,其他機器就可以通過IP地址訪問這個物理主機。當創(chuàng)建N個虛擬機后,每個虛擬機都需要有獨立的網(wǎng)絡配置,以便他們可以像物理機一樣的處理各種網(wǎng)絡連接。但是這個時候物理機上依然只有一個網(wǎng)卡,N個虛擬機通過這一個物理網(wǎng)卡都能進行順暢的網(wǎng)絡連接的過程即為網(wǎng)絡虛擬化。
虛擬機上的網(wǎng)絡概念和物理機一樣。在一個物理機上創(chuàng)建多個虛擬機,就是要創(chuàng)建多份虛擬機的虛擬網(wǎng)卡,并且保證它們能夠正確的聯(lián)通到網(wǎng)絡上。這是如何做到的呢?這主要是通過虛擬機管理程序在虛擬層面創(chuàng)建了一個虛擬的網(wǎng)橋(Bridge)。這個網(wǎng)橋就和我們我們看到的交換機一樣,上面有很多“接口”可以連接不同的虛擬網(wǎng)卡,當然物理機的真實網(wǎng)卡也需要連在這個網(wǎng)橋上,并且設(shè)置了一種特殊的混雜模式(可以允許不論該物理網(wǎng)卡是否為網(wǎng)絡包的目的地址都能通過該網(wǎng)卡接收或者發(fā)送)。在同一個網(wǎng)橋上的不同虛擬機之間進行的網(wǎng)絡通信,只會在本網(wǎng)橋內(nèi)發(fā)生。只有當虛擬機的網(wǎng)絡通信的對象不在本機(比如物聯(lián)網(wǎng)上的其他主機)上的時候,他們就會通過物理機的網(wǎng)卡向外進行傳輸。由于物理機的網(wǎng)卡帶寬能力是固定的,所以在一個網(wǎng)橋上的虛擬網(wǎng)卡也是分時共享相同的網(wǎng)絡帶寬(如果網(wǎng)絡包的交換之發(fā)生在本網(wǎng)橋內(nèi),速度不會受到物理網(wǎng)卡的影響)。雖然他們在自己傳輸?shù)臅r間段內(nèi)是獨占全部帶寬(例如1Gbps),但是同時會導致其他虛擬網(wǎng)卡暫時無法傳輸數(shù)據(jù),以至于在宏觀范圍(秒)來看,虛擬機是沒有辦法在共享網(wǎng)絡的時候占用全部帶寬的。如果假設(shè)有4個虛擬機都在進行大規(guī)模的網(wǎng)絡操作(例如大文件的下載和上傳),那么理論上他們的實際連接速度最多就只能達到250Mbps。由于網(wǎng)絡速度對云計算中虛擬機的能力非常重要,芯片公司也在不斷推出各種針對網(wǎng)絡連接的硬件虛擬化解決方案(例如SR-IOV,VMDq等等)。
如果物理機去上只有一個物理網(wǎng)卡,那么不同的虛擬機的網(wǎng)絡都是通過同一個網(wǎng)卡連接出去,這是會導致網(wǎng)絡安全問題的。例如一個虛擬機可以監(jiān)聽整個網(wǎng)絡上的所有數(shù)據(jù)包,并分析截獲感興趣的別的虛擬機的網(wǎng)絡數(shù)據(jù)。為了解決這個問題,計算機網(wǎng)絡提供了一種叫做VLan的技術(shù)。通過對網(wǎng)絡編輯指定的VLan編號,一個物理網(wǎng)卡可以拓展多達4095個獨立連接能力。例如,如果原本的物理網(wǎng)卡為eth0,VLan1的網(wǎng)卡設(shè)備在操作系統(tǒng)就變成eth0.1,VLan1000的網(wǎng)卡設(shè)備就是eth0.1000,eth0.1和eth0.1000之間都無法看到對方的網(wǎng)絡包。有了VLan的支持,在相同物理機上的虛擬機就可以分配不同的VLan編號的網(wǎng)絡設(shè)備,從而進行了網(wǎng)絡隔離。
有了計算機資源、存儲資源和網(wǎng)絡資源的虛擬化,IaaS就可以管理起把整套虛擬化的資源,并且在客戶需要的時候,把一部分資源劃分給用戶使用。例如用戶可以申請2個CPU,2GB的內(nèi)存,100GB的硬盤和2個網(wǎng)卡,或者可以申請4個CPU,16GB的內(nèi)存,2T的硬盤和1個具有公網(wǎng)IP地址的網(wǎng)卡等不同的資源。由于虛擬機共享著物理機的資源,所以IaaS軟件必須要做好資源的隔離以保證數(shù)據(jù)的安全。需要指出的是,IaaS軟件管理和分配的過程是完全自動化的。它的輸入是用戶的需求(通常通過網(wǎng)頁輸入),它的輸出是一個具有網(wǎng)絡連接能力的虛擬機。
至此,IaaS軟件的基本概念和資源虛擬化的部分就介紹完畢了,為了簡化,我們并沒有涉及資源虛擬化的細節(jié)和IaaS是如何管理和分配這些資源的,從了解基本概念的角度來說已經(jīng)足夠。不過要成為IaaS軟件研發(fā)工程師,還需要熟悉和了解各種資源是如何虛擬化的,并且掌握如何管理和分配這些資源(池化),并用自動化的方法把它們串聯(lián)起來。為了更好的分配這些資源,IaaS軟件通常會構(gòu)建很多內(nèi)部的邏輯概念。例如對于存儲資源,IaaS會分成主存儲和備份存儲。由于存儲類型的不同,IaaS軟件需要支持不同的存儲方式,例如NFS,iSCSI或者對象存儲。由于虛擬化管理程序可能是異構(gòu)的,例如(KVMvs. VSphere),IaaS軟件往往還需要支持幾種不同的虛擬化解決方案。每一種虛擬化管理程序的應用程序接口是不同的,IaaS需要能夠分別并暴露給用戶統(tǒng)一的接口。此外由于管理著成百上千的物理服務器,服務器難免會出現(xiàn)各種問題(例如掉電,電子元件損壞等等),IaaS軟件都需要針對不同的錯誤進行自我隔離、容錯和修復。以上這些都是IaaS軟件工程師需要處理和解決的常見問題。