標籤:

為何現在流行OpenStack和Docker結合?

並不是說兩者非要這麼結合,但是只是搜索看到這一類結合的方案很多,對應支持的項目也很多,所以感到費解,結合的好處有哪些

剛開始學習Docker和OpenStack菜鳥一枚.正好搜到這篇問題

Kubernetes和OpenStack到底是什麼關係? - OpenStack 看了高票回答,獲益匪淺

但我想繼續提問下,正如高票回答所說,kubernetes是管理container的工具,openstack是管理VM的工具,container可以運行在物理機上,也可以運行在VM上。所以kubernetes不是需要openstack的支持。那麼大家想要把OpenStack和容器(例如Docker)結合起來的原因是什麼呢?

例如OpenStack新出的這個Magnum項目,實際上也是使用kubernetes了來調度管理容器,那為什麼要結合呢?是基於企業已經採用了OpenStack架構的情況嗎?

如果是從頭開始建立雲平台,有必要結合嗎?這兩者的結合有什麼好處呢?Docker相對於KVM等更加輕量級,性能好,很多優點,那為何非要使用OpenStack呢 直接kubernetes管理有什麼不好嗎?

剛開始接觸 概念太多 關係優點理不清,懇請大牛們解答,謝謝!


我看了你說的那個問題,7贊回答應該是答主為了儘可能簡單的讓你理解,回答太隨意了,你從中怎麼做到的獲益匪淺。。我試著多說一點,給題主多了解一點。。

1. 基於虛擬機的虛擬化和基於容器的虛擬化

非正式的說,虛擬化是通過軟體手段對計算機硬體資源鏡像整合管理和再分配的一種技術最常用的就是基於虛擬機(Hypervisor-based)的虛擬化,經過40年的發展,基於虛擬機的虛擬化技術已經比較成熟,它通過一個軟體層的封裝,提供和物理硬體相同的輸入輸出表現,實現了操作系統和計算機硬體的解耦,將OS和計算機間從1對1變成了多對多(實際上是1對多)的關係。該軟體層稱為虛擬機管理器(VMM/Hypervisor),它可以直接運行在裸機上(Xen、VMware EXSi),也可以運行在操作系統上(KVM、VMware workstation)。

然而這樣的方案有一個缺陷,在虛擬機上運行了一個完整的操作系統(GuestOS),在其下執行的還有虛擬化層和宿主機操作系統,一定比直接在物理機上運行相同的服務性能差。而且有GuestOS的存在,虛擬機鏡像往往有幾個G到幾十個G,佔用的存儲空間大,便攜性差,遷移時通信代價大,不便於集群管理。另外每次想要使用更多硬體資源,需要啟動一台新的虛擬機,要等待GuesOS啟動,可能需要幾十秒到幾分鐘不等。這些問題都是GuestOS帶來的,虛擬化層的技術再怎麼進步也無法解決這幾個問題。

實際使用場景中,我們使用虛擬化技術其實是為了按需分配資源來完成服務的部署和使用,同時對服務所依賴的環境進行隔離,不被其它服務感知或干擾。為此啟動一個GuestOS並不是必需的,為什麼不考慮讓多個虛擬機公用一個操作系統內核,只隔離開服務運行環境同時控制服務使用的系統資源呢?基於容器的虛擬化就是這樣一種技術。

容器是沒有GuestOS的輕量級「虛擬機」,多個容器共享一個OS內核,容器中包含需要部署的應用和它依賴的系統環境,容器大小通常只有幾十到幾百MB。由於共享操作系統內核,所以容器依賴於底層的操作系統,各個操作系統大都有自己的容器技術和容器工具。

Docker是一個Linux容器管理工具,隨著Docker的興起,Linux容器技術也是當下最時興的容器虛擬化技術。Linux容器工具有很多,OpenVZ、LXC、Docker、Rocket、Lmctfy等等,大都是基於Linux內核提供的兩個機制:Cgroups(實現資源按需分配)和Namespace(實現任務隔離)。

由於使用的技術完全不同,容器和虛擬機也有很多不同的地方:

最直觀的區別就是容器比虛擬機明顯更輕量級,對宿主機操作系統而言,容器就跟一個進程差不多。因此容器有著更快的啟動速度(秒級甚至更快),更高密度的存儲和使用(鏡像小)、更方便的集群管理等優點。同時由於沒有GuestOS存在,在容器中運行應用和直接在宿主機上幾乎沒有性能損失,比虛擬機明顯性能上有優勢。

還有一點是虛擬機技術已經發展了很多年,虛擬機和虛擬化層間的介面、虛擬機鏡像格式等都已經標準化了,相應的管理工具、分散式集群管理工具都有比較完善的解決方案,而容器最近幾年才興起,配套技術和標準還在完善中。

此外虛擬機由於有GuestOS存在,可以和宿主機運行不同OS,而容器只能支持和宿主機內核相同的操作系統。而且虛擬機由於有VMM的存在,虛擬機之間、虛擬機和宿主機之間隔離性很好,而容器之間公用宿主機的內核,共享系統調用和一些底層的庫,隔離性相對較差。

2.雲計算和虛擬化

雲計算是最近幾年才興起的概念,但是這樣的需求其實早都有了,現階段廣為接受的是美國國家標準與技術研究院(NIST)定義:

雲計算是一種按使用量付費的模式,這種模式提供可用的、便捷的、按需的網路訪問, 進入可配置的計算資源共享池(資源包括網路,伺服器,存儲,應用軟體,服務),這些資源能夠被快速提供,只需投入很少的管理工作,或與服務供應商進行很少的交互。

雲計算最基本的特性是:「按使用量付費」、「資源共享池」和多租戶隔離。就如前面提到的,虛擬化技術就是解決了資源共享、按需分配和任務隔離的功能,於是雲計算和虛擬化技術的結合是很自然的。於是問題來了,是選取基於虛擬機的虛擬化呢,還是基於容器的虛擬化。早期由於容器技術的不完善,雲計算只有虛擬機這一種選擇。隨著現在容器技術興起,基於容器的虛擬化性能更高,交付速度快,方便管理,而且資源利用率高,看起來是比虛擬機更好的方案。

但是它現有的兩個比較大的缺點(隔離性不夠強、操作系統依賴性)讓他無法完全替代VM,對於
SaaS用戶和部分PaaS用戶而言這兩個缺點可能不那麼明顯。現階段Container和雲計算主要結合的場景也是在SaaS和PaaS中(事實上大多數SaaS和PaaS服務提供商都使用了容器技術)。

但是對於
IaaS的用戶來說,他們租用的是基礎設施,上面承載著他們自己運行的系統和服務,隔離性不強意味著安全性和可信性不高,在這種情況下大客戶們(一些公司會把自己的服務託管在雲上,租用公有雲,省下來機房、伺服器和運維的成本,他們也是公有雲最主要的客戶)肯定是不放心的。同時操作系統依賴性也是限制Container在
IaaS層應用的一個主要問題,也是絕大多數解決方案都是將container運行在VM上的原因,這樣Container性能好的優勢實際上在雲上根本發揮不出來,優點只有啟動快了。

3. OpenStack和Kubernetes

題主可能對雲計算理解不夠透徹,不是一個大型分散式集群虛擬化平台就能稱之為雲計算平台的的。OpenStack作為時下最成功的開源雲計算管理平台(現階段主要致力於IaaS平台),能提供的管理功能比Kubernetes
強太多了,Kubernetes只是提供一個容器的分散式集群管理工具,OpenStack里光是Nova+Heat兩個組件就比Kubernetes的功能更多(事實上在Magnum正式立項之前,OpenStack先後推出過Nova-docker-driver和Heat-docker-driver用來提供容器服務)。

如前面雲計算定義所說的:」雲平台需要提供可用的、便捷的、按需的網路接入「,"資源能快速被提供「,」只投入很少的管理工作「。於是一個雲平台需要具備多租戶訪問控制、網路虛擬化、存儲虛擬化、計算虛擬化、虛擬化集群管理和編排、用戶友好的接入方式、故障監控功能等等,Openstack經過幾年十幾個版本的更迭,已經擁有了Keystone、Nova、Neutron、Cinder、Glance、Swift、Heat、Ceilometer等等組件,比較完整的提供了一個雲平台應有的各個模塊。而Kubernetes只是提供了容器的虛擬化集群管理和編排功能,而且就這個功能也不夠完善。

此外OpenStack也在不斷整合新的東西進來,正在開發中的Magnum是容器管理和編排的組件,Magnum中使用了Kubernetes作為容器的集群管理和編排,此外結合其它組件的功能才能提供比較完整的一個基於容器的雲平台解決方案。


高票答案答主很熱心,總結也不錯。不過又過了兩年,社區又有了很多新的發展,這裡補充一下:

1、 OpenStack作為IaaS事實標準,積極主動兼容Docker,說明容器化很有誘惑,是未來的技術方向。雖然OpenStack是越做越龐大,但也不是什麼項目都會集成的。而OpenStack和Docker分別偏向IaaS(資源層)和PaaS(應用層),讓兩者有深度結合的基礎。

2、 很多公司將二者結合,既是因為已經部署OpenStack在先,也是因為Docker的隔離性比較差,尤其是在網易雲這樣的公有雲,隔離性非常重要,所以也採用了VM+Docker。

3、 VM+Docker註定有性能損失,不利於發揮Docker的輕量級優勢,因此需要很多的優化工作,包括網路、後端存儲等方面,可以參考&<網易雲容器服務研發實踐分享&>,而為了提供更好的性能,網易雲也基於裸金屬推出了超級容器方案。

4、 Kubernetes社區在Google的推動下非常活躍,Kubernetes穩定版發布已經滿兩周年,越來越強大,已經承載很多有狀態、數據類瑩瑩,可以說是容器管理的技術標準了,Azure、AWS都大力支持Kubernetes了。當然,Kubernetes也還不完美。Kubernetes 技術帶頭人Tim Hockin在2017年6月總結:「所有簡單的問題都已經得到了解決,還剩下什麼?那是 90% 的疑難雜症!」

5、 Google直接用容器技術管理數據中心,沒用OpenStack。之前部署OpenStack的,也已經有互聯網公司從OpenStack切換到Kubernetes。因為OpenStack組件多,運維複雜,整體運營成本高,而Kubernetes功能豐富而清晰、靈活,設計理念很Google(比如Pod、RC、Service的抽象很棒)。當然,也不是全部切換,只是大部分。

6、 不認為Docker是虛擬化,因為是共享內核。也不推薦將容器當做虛機用,那樣不好發揮容器對微服務、對DevOps的價值。當然,技術債多的團隊,要發揮Kubernetes的優勢,玩好微服務,也需要很強的技術實力,深刻理解Kubernetes高級配置。


上面的答案說的都是用openstack來管理docker。其實還有一種反過來的玩法,就是用docker部署openstack, 這也是種很有前景(坑很大)的方向。


社區其實現在也開始注意這個問題了,現在的magnum等已經開始嘗試整合了


基於容器的虛擬化還發展不夠完善呢。想一想你敢把關鍵業務跑docker上么?docker和底層硬體兼容度也不夠。vm和容器,各有各的優勢,沒有容器,vm現在基本上都能撐起來事兒了,可是不讓你用vm,docker能挑幾次大梁呢?不過容器的想法還是好的,相信有朝一日基於容器的雲技術配套發展起來了,也就沒虛擬機什麼事兒了。


openstack管理多台硬體更容易些,docker 這方面還沒有完善的解決方法吧。以後肯定會有基於裸機的


推薦閱讀:

最近在學習 OpenStack,已經了解了其作用、架構。想進一步學習研究OpenStack各組件,對於源代碼的閱讀和學習,想得到大家的建議?
如何從零開始學習OpenStack?
自學python和openstack達到怎樣的水平能夠去雲計算公司上班?

TAG:OpenStack |