物理機 vs 虛擬機,K8s 環境下的容器運行在什么上更好?
K8S環境下的容器,是直接運行在物理機上,還是運行在隔離的虛機上比較好?
如果運行在物理機上,那么資源會最大程度的得到利用,但是會犧牲一定的隔離性及安全性,特別是在企業沒有規范的CI/CD鏡像交付流程時,不同租戶的容器會相互影響。
如果運行在虛擬機上,那么隔離性和安全性都會強于前者,但是會增加管理虛機的成本,以及降低資源利用率。
這一塊企業該如何去抉擇考量呢?
問題來自@sazh 某金融單位,下文來自twt社區眾多同行實踐經驗分享,歡迎大家參與交流,各抒己見。
@gavin_zhang 某股份制銀行 系統架構師:
就像問題中提到的,兩種方案各有優劣,具體方案需要結合企業的實際需求進行選擇,選擇時候可以參考:
性能:使用VM+容器方案,中間多了一層Hypervisor,性能大概損耗10%~20%。
成本:對于開源解決方案,沒有額外的軟件成本;如果是商用解決方案,VM比物理機方案多出宿主機的操作系統和Hypervisor管理軟件都是成本。
可維護性:由于VM可以安裝Agent進行管理,各種管理軟件和配套運維工具齊備,可維護性比物理機高。另外一方面,VM方案由于部署負載,問題特別是網絡和存儲的性能問題定位比較難。
可靠性:需要從兩個方面看,VM多了一層操作系統和Hypervisor,多了故障點,但是VM有可以提供故障遷移的能力,所以可靠性上,各有千秋。
其他:VM方案可以讓容器和虛擬機應用共享同一個物理機集群,最大化資源使用率。
綜上所述:
如果企業已經有了一個比較穩定的虛擬機平臺,而且運維經驗也有了的話,建議還是虛擬機部署。
如果容器平臺獨占物理集群,對性能要求比較高(特別是網絡),建議物理集群。
如果成本敏感,而且又計劃將所有應用和服務部署在容器上,建議物理集群。
@某企業技術經理:
物理機的擴容成本比較高,效率低。
@海燕 陸金所 系統工程師:
從資源利用率上:1.虛擬機現在最通用的是VMware,就有一層hypervision的開銷,這部分一般占用系統總開銷的10-15%之間。2.虛擬機的磁盤和內存會因為機器被分配而獨享的方式分配出去了。容器的話磁盤和內存雖然requested,limited,但是是用多少,占用多少。
從網絡上:虛擬機會在物理機器的網絡上添加一層,在之后網絡方案的設計、網絡性能的轉發等等多一層開銷。
從運維成本:虛擬機的管理、可能的licence等需要經濟成本。
從安全上:容器是共享宿主機器的內核,每個應用都有可能因為被攻擊而導致整個機器掛掉。
所以,各有千秋,全看自身關注點考慮。
@Garyy 某保險 系統工程師:
虛擬機也可以像容器一樣使用,但虛擬機有幾個顯著的缺點。最關鍵的是虛擬化有一個開銷,無論部署的guest虛擬機的操作系統(OS)有多精簡,在建立新的虛擬機時仍然需要完全復制該操作系統及其整個配置。容器運行自己的初始化進程,文件系統和網絡堆棧,在虛擬機或裸機主機操作系統之上進行虛擬化。就其性質而言,容器使用的內存少于虛擬機。這是由于它們固有地共享OS內核,并且在大多數情況下它們也使用相同的庫。
管理程序用于共享硬件基礎架構,允許多個租戶,孤立的虛擬機在同一臺物理機器上運行。虛擬機模擬基于計算機體系結構的計算機系統,并提供物理計算機的功能。這可以提高底層物理機器的利用率。相比之下,裸機服務器是單租戶,這意味著沒有資源共享,可用的CPU和RAM專用于您的進程。
例如,使用Hyper-V的報告開銷介于9-12%之間,這意味著Hyper-V下的客戶機操作系統通常從可用CPU的88-91%開始。當在Hyper-V下運行的操作系統被觀察到在主存儲器的大約340MB時,存儲器開銷。當然,在客戶操作系統上運行進程可能會因缺乏資源而受到影響,并且效率低于直接在主機(物理服務器)操作系統上運行相同進程的效率。考慮到這種虛擬化開銷,容器的工作方式及其好處提示我們檢查直接在主機上運行容器的選項。
虛擬機使用戶能夠使用訪客映像輕松地在主機之間移動工作負載(即容器),而裸機則更難以升級或移動。一個很好的例子就是回滾。使用裸機服務器,回滾機器狀態是一項艱巨的任務。云平臺(如Amazon云)支持的版本控制和回滾功能可以定期獲取VM的時間點快照,并在需要時輕松回滾到該快照。
另一個例子接受容器有限制,比如官方Docker安裝需要Windows 10 Pro,以及其他Windows Server版本,比如2012甚至2008,都不被支持。當您需要升級和配置操作系統時,這可能會使裸機服務器很痛苦。
另一方面,單租戶裸機服務器可以為受到合規措施限制的組織提供更好的選擇,這可能需要嚴格的數據安全和隱私控制。
@Steven99 軟件架構設計師:
首先沒有絕對的好與壞,通常要根據企業自身的實際情況來選擇最適合的方案。
選擇物理機還是虛擬機,首先要考慮需求,對業務容器的資源需求通常是多少,物理機往往配置比較高,否則占用機房機柜資源也是挺大的浪費,所以虛擬化一層有虛擬化的好處,當然會有性能損失,但相比來說可能更適合。
如果物理機配置不高,而容器資源需求又不是簡單的少量彈性多實例,就沒必要虛擬化一層。
另外就是企業自身當前現狀,不可能重頭來過,所以要基于現實尋找合適方案,也可能物理機虛擬機并行,這都不是目的,目的是更好支撐業務,所以以業務需求為中心,基于企業現狀來選擇合適方案是比較好的。
@zhuqibs Mcd 軟件開發工程師:
在我看來,這不是個問題,是根據用戶自身條件來選擇的。
如果是自建IDC機房,建議用實體機,原因如下:
(1)運維成本:k8s本身的網絡環境比較復雜,在這個復雜的網絡上再疊加上復雜的虛擬機的網絡,這沒有專有的運維人員難以搞定;
(2)可靠性:虛機構建的k8s,有可能共享cpu,一旦宿主機節點掛了,導致多個k8s節點崩潰,一旦發生master節點全掛,容器云就玩完;
(3)軟件成本:IDC機房自建已經投入大量資金,如果再投入VMware、boss等pks的軟件成本太大;
(4)需求缺乏:使用虛擬機構建k8s,其中最大的優點是可以客戶化,比如我需要5個節點的集群,我可以自己構建虛擬機,自建集群,聽上去很美,但現實很骨感,大部分企業沒有這種需求。這需求出現在公有云上。
(5)技術不成熟:我有親身經歷,就是某企業級容器云,廠商承包了軟硬件的部署,然而其中有大坑,部署后NxT網絡有問題,導致容器云中的應用經常“龜速”運行,廠商排查了大半年,無法解決。
如果用戶沒有自建機房,那必然使用虛擬機的k8s部署方案,有朋友說性能會下降多少,還真沒感覺出來,不過有很多優點:
(1) 省錢:現在大部分公有云商家, k8s集群都是不收費的,只收底層服務器的錢;
(2)還是省錢:全托管的k8s,master節點是公有的大池子,不收費;
(3)省心:對于不是互聯網大公司而言,要養k8s專業運維人員是不小的支出,但公有云沒有這個煩惱;
(4)autoscale:服務器是虛擬機,可以自動擴展,活動日不僅能用k8s自己的autoscale,還可以用虛擬機的autoscale,實體機是不可能有后者的;
(5)隨心所欲的自建,你平時會有不少測試、實驗的需求,建立一個k8s就可以了,不像實體機, 沒資源,你還要去買機器。