在研發(fā)、調(diào)試以及多團(tuán)隊(duì)合作過(guò)程中,開(kāi)發(fā)人員難免會(huì)用到虛擬化技術(shù)來(lái)幫其構(gòu)建易于復(fù)制和重建的環(huán)境。需求的牽引使得Vagrant、VirtualBox以及VMWare Workstation等虛擬化相關(guān)的產(chǎn)品相繼誕生。這些產(chǎn)品很好的滿足了企業(yè)和個(gè)人的需求,實(shí)現(xiàn)了安全性、便捷性等方面的功能。而另外一方面,虛擬化技術(shù)發(fā)展的也帶動(dòng)了云計(jì)算的崛起。因其高效、便捷和經(jīng)濟(jì)的特性,很多公司紛紛開(kāi)始使用云平臺(tái)作為其主要的計(jì)算環(huán)境。Docker 等應(yīng)用容器引擎的出現(xiàn),更是為開(kāi)發(fā)者提供一個(gè)可移植的容器,方便了應(yīng)用程序的開(kāi)發(fā)和部署。事實(shí)上,云計(jì)算已經(jīng)帶來(lái)了企業(yè)在線業(yè)務(wù)模式的變革。
但是,在諸多好處的同時(shí),目前的基礎(chǔ)架構(gòu)即服務(wù) (IaaS) 云模型也存在問(wèn)題。它要求軟件開(kāi)發(fā)者必須使用虛擬機(jī)管理應(yīng)用程序。對(duì)虛擬機(jī)映像的要求限制了云使用者的選擇,甚至對(duì)某些人而言,還成為了本地環(huán)境轉(zhuǎn)移到云平臺(tái)的一大障礙。為了試圖解決該問(wèn)題,嵌套虛擬化的概念被提出。
所謂嵌套虛擬化就是在虛擬機(jī)里再運(yùn)行虛擬機(jī)。對(duì)云用戶來(lái)說(shuō),嵌套虛擬化就意味著虛擬機(jī)的格式可以與云平臺(tái)無(wú)關(guān)。如果能夠支持嵌套虛擬化,云平臺(tái)就可以演變成了高度靈活的虛擬化基礎(chǔ)架構(gòu),為用戶提供更多自由使用的空間。那么,究竟有沒(méi)有可能在現(xiàn)有框架下,實(shí)現(xiàn)類(lèi)似嵌套虛擬化的功能呢?
針對(duì)該問(wèn)題,GigaSpaces的Michael Sverdlik提供了一種解決方案。本文接下來(lái)以云應(yīng)用的編排系統(tǒng)Cloudify和最流行的云平臺(tái)AWS作為例子,詳細(xì)介紹他如何一步一步的創(chuàng)建v2v(虛擬到虛擬)機(jī)器,及如何創(chuàng)建可以上傳到任何AWS環(huán)境的VMDK磁盤(pán)鏡像。
首先,用戶需要利用基于Ruby的Vagrant工具。該工具主要用于創(chuàng)建和部署虛擬化開(kāi)發(fā)環(huán)境,其以VirtualBox、VMware或者AWS等虛擬機(jī)為底層,以上層Chef等工具來(lái)完成自動(dòng)化安裝和配置軟件的工作。利用該工具,用戶生成一個(gè)Vagrantfile和一個(gè)已經(jīng)在VirtualBox鏡像上預(yù)裝Cloudify Manager的Vagrant box。然后,利用Vagrant和VirtualBox就可以在本地對(duì)Cloudify進(jìn)行測(cè)試和評(píng)估。其過(guò)程可以簡(jiǎn)單概括為:下載Vagrantfile、把vagrant運(yùn)行起來(lái)和利用Packer來(lái)創(chuàng)建Vagrant Box三個(gè)部分。作為與Vagrant出自相同作者的Packer,創(chuàng)建鏡像只需要根據(jù)教程輸入命令即可。
接下來(lái),再仔細(xì)審視一次有沒(méi)有可能不使用嵌套虛擬化而解決相應(yīng)的需求。可能的解決方案包括:直接利用本地物理機(jī)器、利用專門(mén)的方法來(lái)允許嵌套虛擬化但是,這兩種方案顯然需要額外的花費(fèi)以及精力。還有一種方法就是,直接把虛擬機(jī)磁盤(pán)鏡像轉(zhuǎn)換為VMDK進(jìn)行使用。關(guān)于如何實(shí)現(xiàn)物理到虛擬以及虛擬到物理的方法,之前都已經(jīng)有人實(shí)現(xiàn)過(guò)。但是,虛擬到虛擬(V2V)究竟能不能實(shí)現(xiàn)呢?文章接下來(lái)就開(kāi)始嘗試。
所需要的工具和環(huán)境包括作為腳本語(yǔ)言的Python、與AWS結(jié)合的Boto API、作為任務(wù)執(zhí)行器的Fabric、Packer以及IaaS提供商AWS。具體的實(shí)現(xiàn)步驟為:
在利用packer預(yù)裝的cloudify上創(chuàng)建一個(gè)源鏡像(AMI)在AWS中利用快照或者源鏡像作為一個(gè)磁盤(pán)來(lái)啟動(dòng)一個(gè)工作實(shí)例在工作鏡像上,創(chuàng)建一個(gè)raw鏡像卷作為一個(gè)文件,然后在其上創(chuàng)建一個(gè)ext4分區(qū)把數(shù)據(jù)從源鏡像磁盤(pán)中復(fù)制到之前創(chuàng)建的ext4分區(qū)中在ext4分區(qū)上安裝bootloader把raw鏡像轉(zhuǎn)變?yōu)閂MDK把VMDK和一個(gè)OVF描述符和vagrant元數(shù)據(jù)一起創(chuàng)建一個(gè).box的壓縮包上傳到S3清除最后的結(jié)果如何,讀者可以根據(jù)Github中提供的腳本進(jìn)行親自測(cè)試。