近日,Linux Journal上發(fā)布了一篇文章,“Containers—Not Virtual Machines—Are the Future Cloud”,引起了業(yè)內(nèi)的廣泛討論。作者David Strauss是Pantheon公司(一家做Drupal PaaS服務(wù)的供應(yīng)商)的CTO,他認為,VM的好處在于可以上下擴展,可控的計算資源,安全隔離,并可以通過API進行部署;但其缺點在于,每一臺VM都消耗了一部分資源用于運轉(zhuǎn)一個完整的操作系統(tǒng)。所以,另一種方式更適合一個云平臺,就是Linux Containers。
Containers可以作為OS層面的虛擬化的一個替代方案,你可以在一個宿主機上運行多個隔離的系統(tǒng)。在單一的操作系統(tǒng)下運行container更加高效,因此,container將會替代VM,成為未來云計算基礎(chǔ)架構(gòu)中的主導(dǎo)技術(shù)。
Container并不是一項新鮮技術(shù)。根據(jù)2009年在IBMdW上的“LXC: Linux container tools”一文當中的介紹:
Container這項技術(shù)發(fā)展已久,Solaris Zones和BSD jails都是非Linux系統(tǒng)上的containers實現(xiàn)。Linux上的container技術(shù)也已經(jīng)有很多實現(xiàn),如Linux-Vserver,OpenVZ和FreeVPS。雖然以上這些技術(shù)都進入了成熟期,但他們都沒有打入Linux內(nèi)核的mainstream。
另一方面,由IBM開發(fā)者Daniel Lezcano研發(fā)并維護的Linux Resource Containers項目則通過大量努力進入了Linux內(nèi)核的mainstream,從而為更加成熟的Linux container解決方案提供了一個公共的支持平臺。
Oracle Technology Network上在2012~2013年間發(fā)布了一個系列文章,The Role of Oracle Solaris Zones and Linux Containers in a Virtualization Strategy,內(nèi)容比較新一些。其中對Linux Containers是這樣介紹的:
Linux Containers從根本上提供了原生的性能,你可以實時進行資源分配的管理。Linux Container當中運行的二進制程序?qū)嶋H上是直接在宿主機的內(nèi)核上運行的一個普通的進程,跟其他進程沒什么兩樣。這同時也意味著CPU和I/O的規(guī)劃更加公平,而且可以進行微調(diào)。Container下拿到的磁盤I/O性能是系統(tǒng)虛擬化所無法比擬的(即使在Xen下使用paravirt模式也無法達到)。你可以在Linux Container當中運行磁盤I/O較重的應(yīng)用,如數(shù)據(jù)庫。
跟系統(tǒng)虛擬化和Oracle Solaris Zones不同的是,LXC無法運行其他非Linux系統(tǒng)。不過,你可以在同一個宿主機內(nèi)核下的不同containers里面運行不同的Linux發(fā)行版。
這個名為lxc的項目是這樣描述自己的:
lxc Linux Containers
container namespace cgroup virtualisation
LXC是針對Linux Containers的用戶空間控制包。這是一個輕量級的系統(tǒng)虛擬化機制,有時被描述為“chroot on steroids”(類固醇上的chroot,意思是功能類似chroot,但比chroot提供了更多的隔離功能)
LXC基于chroot實現(xiàn)了完整了系統(tǒng)虛擬化,并在Linux現(xiàn)有的進程管理架構(gòu)上添加了資源管理和隔離的機制。
lxc的實現(xiàn)為:
通過cgroup實現(xiàn)的“進程管理組”進行資源管理;
通過為clone(2)系統(tǒng)請求添加的flag實現(xiàn)資源隔離,可以為PID、網(wǎng)絡(luò)路由等創(chuàng)建數(shù)種新的命名空間
提供了數(shù)種不同的隔離機制,如devpts文件系統(tǒng)下可以使用“-o newinstance”的flag。
LXC將上述Linux內(nèi)核機制結(jié)合在一起,提供了一個用戶空間層面的container對象——一個輕量級的虛擬系統(tǒng),對系統(tǒng)、應(yīng)用的資源有完全的隔離和掌控。
如果以上內(nèi)容聽起來比較難以理解,CodeBox提供了一個更容易理解的解釋:
一般說來,VM是指全虛擬化/半虛擬化,即傳統(tǒng)意義上的虛擬機,其機制是虛擬出硬件來,guest os跑在這些虛擬硬件上。
而container是在OS級別的資源隔離和命名空間,本質(zhì)上guest和host是一個OS。container 是namespace+cgroup,有些公司僅僅用cgroup做資源的隔離,比如說:
你在一臺機器上同時運行MySQL和Apache,你又怕他們相互影響,所以用cgroup就可以很方便地設(shè)定MySQL用40%的cpu和2G的內(nèi)存,Apache用60%的cpu和1G的內(nèi)存。就是所謂的資源隔離。
相比系統(tǒng)虛擬化技術(shù),Container技術(shù)的優(yōu)勢在于省資源。然而在2005年,這項技術(shù)在安全隔離和資源隔離方面還無法滿足需求。根據(jù)David的描述,當時的chroot是這樣的:
“nice”模式下,贏者恒贏,弱者拿不到資源。“fair”模式下,內(nèi)核又太平等,饑餓的非重要任務(wù)往往和饑餓的重要任務(wù)分到了一樣的資源。內(nèi)存和文件描述符(file descriptor)提供的功能太簡陋,在正常運行和崩潰之間完全沒有緩沖區(qū)。
而與此同時:
當時的Linux如果想把80%的CPU分給應(yīng)用A,20%的CPU分給應(yīng)用B,VM是唯一的解決方案。內(nèi)存、磁盤I/O、網(wǎng)絡(luò)I/O和其他可分配資源也是同樣。而且,VM在效率上一直在提升,現(xiàn)在使用VM造成的CPU消耗只有很少的幾個百分點。
但是即使如此,VM畢竟還是會造成資源消耗,而且還有較長的OS啟動的等待時間。比如,256MB的內(nèi)存運行一個應(yīng)用是足夠了,但由于OS跟應(yīng)用搶資源,導(dǎo)致RackSpace不得不放棄了256MB內(nèi)存的實例。使用VM部署一個新的應(yīng)用,平均需要5~10分鐘的等待時間。
如果用container,256MB的內(nèi)存就夠用了,而且部署新應(yīng)用的等待時間只有5~15秒。
David還表示,containers將進入下一個紅帽企業(yè)級Linux的大版本,即RHEL 7。
應(yīng)用方面,目前在國外,Heroku和Cloud Foundry都用到了containers:Heroku上的一個dyno實際上就是一個container,而Cloud Foundry則專門開發(fā)了Warden用于containers的管理。
國內(nèi)的阿里、騰訊、搜狐等,也都已經(jīng)開始在內(nèi)部使用container構(gòu)建云平臺,尤其是阿里與騰訊,使用規(guī)模已經(jīng)不小。根據(jù)章文嵩博士的介紹,2011年底開始建設(shè)的、基于container的阿里T4云,截止到2012年底已經(jīng)部署了200臺左右的物理機,instance的規(guī)模達到了兩千以上。2013年,阿里T4的instance規(guī)模已經(jīng)達到了四千,正計劃將T4的規(guī)模繼續(xù)擴大到千臺以上規(guī)模的物理機,并逐漸將核心的交易、商品業(yè)務(wù)遷移到該平臺上。
騰訊方面,其開放云PaaS平臺CEE現(xiàn)在已經(jīng)達到2000多個container實例。