機器 vs 應用
傳統的虛擬化技術是為了模擬硬件設備而設計的。我們今天所熟知的虛擬機(VM)則是這個思路的一個副產品。一個虛擬機運行了一個完整的操作系統,簡稱”機器“。虛擬機運行的方式和物理機完全一致,保證了應用程序,操作系統和硬件三者之間的協議不變。因此,在一個虛機的世界里,工作跟過去都差不多,應用也無需調整。
但是 ,這種”完美“的兼容性也帶來了幾個嚴重的代價:
胖:虛機鏡像的體積往往都在幾十GB
慢:啟動一臺虛機一般需要幾十秒
重:一臺虛機至少需要百兆內存,而一套物理機上的虛機密度也不會太高
易壞:虛機往往都是不間斷運行,因此很容易出現各種各樣的配置參數錯誤
而另一方面,容器化的關注點在于”應用“。一個Docker Container只關心如何運行其中的應用,而一個Docker鏡像也只包含應用有關的設計。這樣做的好處是:
薄:一個Docker鏡像一般只有200-300MB
快: 毫秒級啟動Docker容器
輕:每個容器只消耗應用所需的內存,因此單臺服務器上的密度得以提高
不可變:由于能夠毫秒級啟動,容器的生命周期往往很短,因此容器可以做到運行時狀態與鏡像一摸一致
下面是Docker官網的一張圖,很清晰的解釋了虛機和Docker兩者之間的區別:
需要指出的是,上面提到的所謂”容器化“實際與各種Container技術(LXC等等)并沒有太多關系。而上面列出的容器化帶來的所有好處,這些好處來自于摒棄了完整的操作系統,而專注于應用的”容器化“思路。
說到這,自熱仍然的問題是:
能不能實現一個面向應用的VM,使得VM也可以容器化?
Hyper - a Hypervisor-based Containerization solution
簡短的說,
Hyper = Hypervisor + App Container Image
Hyper可以使用任何hypervisor(KVM, Xen等等)運行Docker鏡像。Hyper與Docker的核心區別在于Hyper沒有使用Container技術,而是通過VM直接運行Docker鏡像:
[root@user ~:]# docker pull nginx:latest
[root@user ~:]# hyper run nginx:latest
[root@user ~:]# docker ps
[root@user ~:]#
[root@user ~:]# hyper list
.......
由于Hyper是一個完全基于虛擬化的解決方案,因此Hyper并不依賴于物理服務器上的Linux內核。每個HyperVM都自帶一個HyperKernel。由于HyperKernel是個極簡的內核,它可以非常快速的啟動。測試表明HyperVM平均的啟動時間是500-800毫秒,這個啟動性能與Container幾乎沒有差別。
在啟動的時候,Hyper將Docker鏡像掛在到虛機里,而HyperKernel通過一個叫HyperStart的Init服務來啟動Docker鏡像里的應用。在Hyper的場景里,應用被100%的限制在虛機內部,因此也不需要像Container那樣訪問物理服務器上的操作系統。
Combine the best from both worlds
除去上面提到的隔離性之外,Hyper還融合了虛擬化和容器化兩個思路的一些優點:
Introducing the secure multi-tenant CaaS
在Docker之前,IaaS是云計算的標準形式。絕大多數云平臺都提供IaaS服務。隨著Docker的出現,微服務架構逐漸流行起來,而與之對應的是CaaS的興起。
雖然CaaS的趨勢非常有潛力,但目前制約我們的是Container技術中隔離性的缺乏。畢竟,作為一個公有,多租戶的CaaS云平臺,安全性是不可或缺的。不同客戶的不同應用共享同一Linux內核是不可能的。
現在這個阻礙就不存在了。考慮到VM的攻擊面非常小,因此Hyper可以實現非常安全的,基于硬件增強的系統離性。
有了Hyper,我們終于可以打造安全的公有CaaS云了!
作者簡介
王旭:HYPER創始人,CTO,前VisualOps CTO,多年的Debian,Kernel,分布式存儲老兵