最近一兩年來,以容器為代表的云原生技術一直是IT行業最為熱門的話題。隨著云原生技術的崛起,有企業甚至跳過了IaaS層直接在物理機上部署容器。容器的風頭幾乎蓋過云計算,虛擬化技術甚至由此被認為是傳統方法。容器的普及對虛擬機形成了沖擊,也就有了容器與虛擬機之爭。
容器和虛擬機各有千秋
從操作系統誕生,虛擬化技術就一直伴隨著它發展。因為硬件的限制,人們從一開始就希望使用軟件來模擬硬件,而這也是虛擬機的核心思想。虛擬機就是在本機的操作系統之下,虛擬出來的一個操作系統,在虛擬機中對硬件的操作,都會經過轉換來對應到實體機的變化。你可以把虛擬機想象成一個真實的計算機,因為對于使用者來說,它提供的功能就相當于一個實體計算機。
和虛擬機一樣,容器的發展也離不開操作系統的支持。正是因為操作系統實現了namespace和cgroups的資源分離技術,才使得容器技術得以實現。
相比于虛擬機,容器顯得更加輕量,與虛擬機不同的是,它不對外提供一個完整的計算機功能,而是提供一些必備的基礎功能。你可以把它想象成一個精簡的linux內核,它需要更多的鏡像才能對外提供相應的服務。因為輕量級,我們的普通計算機就可以啟動成百上千的容器,它們彼此通過命名空間相互獨立,看上去我們一下子擁有了成百上千臺服務器。容器的出現改變了開發人員和運維人員的業務開發。因為容器在啟動、定制和維護等方面的便利性,越來越多的企業愿意采用容器化技術,k8s等容器集群管理技術則使得容器的市場接受度變得更高。
虛擬機和容器之間是水火不相容的嗎?在k8s中對虛擬機和容器進行統一管理是否可行?
盡管現在大多數軟件工程師對容器都有了一定的了解,容器技術也因為廣泛普及而發展迅速,但企業仍然會在選擇容器還是虛擬機的問題上犯難。其實,從特性上分析,容器和虛擬機各有千秋:1、容器和虛擬機都可以提高應用的可移植性,提高組織在軟件開發過程中的效率
2、容器將操作系統和應用解耦,使得業務開發人員更專注于上層應用,底層技術團隊更專注于基礎架構
3、虛擬機通過虛擬機管理程序復制底層硬件為業務應用提供基礎資源企業可以根據自身的業務應用特性和應用場景需求,在虛擬機和容器之間作出選擇。本文基于現有的容器編排標準(k8s)之上討論將虛擬機與容器進行統一管理的必要性及可行性。
容器和虛擬機對比差異性
首先是一個老生常談的話題,將容器和虛擬機放在一起對比,我們知道虛擬機和容器最主要的區別在于操作系統內核和隔離性兩個方面。
從操作系統內核看:虛擬機使用自定義操作系統,容器使用與宿主機相同的操作系統內核
從隔離性方面看:虛擬機與所有虛擬機之間完全隔離,容器采用linux namespace與其他容器進行隔離
就這兩方面的差異而言,我們能夠很容易的評估出虛擬機和容器之間的主要差異:
特性 |
虛擬機 |
容器 |
操作系統 |
鏡像較大 |
鏡像較小 |
隔離性 |
與宿主機完全隔離 |
與宿主機并未完全隔離 |
從以上虛擬機容器對比表可以看出,虛擬機與容器之間并沒有絕對的高低之分,同樣的,在軟件設計過程中,一個優秀的軟件架構通常也不是絕對的和可復用的,我們能夠做的是通過需求分析、成本分析選擇最合適的方法實現軟件。這也是本文的主旨,即在不同場景下,技術人員或軟件架構師會較虛擬機和容器的特性、業務軟件的特性、當下的成本三方面分析業務軟件到底是適合在虛擬機環境還是容器環境中運行。
哪些應用適合虛擬機場景?
現在我們來列舉一下在哪些場景下,企業可能會優先選擇使用虛擬機,而不是容器:
1、半永久資源分配解決方案 - 某些應用作為企業的半永久資源分配應用,不經常發生擴容、縮容、更新等場景,這些應用最初就是部署在虛擬機上的不會變更的應用,遷移到容器中可能增加企業額外的成本。
2、舊版應用程序不適合容器化 - 某些應用對于容器環境會有水土不服的現象,例如它適配的內核版本與宿主機的內核版本不同,需要對該應用進行重構或者改造,而這些應用最初可能是由第三方提供的應用,遷移到容器中同樣會增加企業額外的成本。
3、傳統IT軟件部門舒適度及慣性 - 容器和虛擬機的運維場景不完全一致,這會對運維部門造成額外的學習成本,為了使得整個運維部門的變更過程更加平滑,企業在做云原生改造過程的前期更傾向于保留目前運維角色的運維慣性。
4、隔離有風險的環境 - 容器的隔離是使用內核模塊完成的,于宿主機而言,它擁有整個機器中所有進程的可見性,一旦宿主機發生安全漏洞可能殃及到運行在其上的所有容器。
根據以上的幾種場景,在當下的容器環境中,企業還是傾向于將這些應用部署在虛擬機上:
1、網絡功能虛擬機化軟件(NFV) - 該類軟件在部署之后幾乎不會對其分配的資源發生變更,且需要保留傳統網絡運維部門的慣性,否則將增加網絡運維部門額外的成本和風險。
2、Windows應用 - 由于當前的容器環境對于舊版本的Windows內核支持并不良好,許多企業(常出現在醫療行業)老舊的.NET框架應用無法完美遷移到容器環境中。
3、Unikernel應用 - 無核化本就是一類不同于容器技術和虛擬機技術的產物,處于技術潮流的某些大企業中的無核化應用沒有遷移到容器環境的必要,但與本系列的主旨不矛盾的是,我們依然可以在現流行的編排標準中找出兼容三者之間的方案。
4、需要高度隔離的應用 - 上文我們提到過,在容器環境下,宿主機被攻破后可能會殃及容器應用程序的安全,某些安全要求極高的軟件為了降低安全風險,更傾向于部署在虛擬機當中。
哪些應用適合容器場景?
列舉完虛擬機適合的場景之后,我們再一起來看看哪些應用適合容器場景:
1、快速遷移解決方案 - 當企業的應用需要在故障、卡頓等不健康場景下進行快速的遷移、資源變更時,容器的啟動效率對比與虛擬機具有更大的優勢,能夠提升業務的連續性。
2、在同一操作系統場景下的自動化伸縮方案 - 當無狀態應用承載流量出現瓶頸時,可能需要進行實例數量的變更負載流量,同上文,啟動效率和業務連續性方面容器更具有優勢。
就場景而言或許閱讀文章的你會覺得容器覆蓋的場景并沒有虛擬機廣,實際上并非如此,在容器場景中快速遷移解決方案和自動化伸縮方案是企業面向最終用戶的業務應用最基本的需求,而虛擬機大多數的場景都在于企業未下決心進行改造的老舊系統或是一些內部使用的軟件。在以上應用場景下,企業會從效率方面考慮,傾向于將這些應用部署在容器中:
1、敏捷devops應用 - 企業內部進行敏捷devops流程所產出的應用,這些應用具有快速變更、快速遷移的特性。
2、微服務應用 - 微服務應用大多數也是敏捷devops下的產物,并且微服務應用大多都將狀態下沉到一些中間件當中,業務應用大多都是無狀態的需要快速變更、快速遷移、快速擴容的應用。
虛擬機和K8s相互融合
可以看到,容器和虛擬機根本就不存在誰取代誰,而是相互融合、共存的狀態。但這也帶來新的問題,企業的虛擬機和容器管理平臺是各司其職互補干擾地運行呢?還是對其二者進行統一管理?統一管理又會帶來什么好處呢?
事實上,在企業統一虛擬機運維和容器運維團隊技術棧之后,可以享受現有容器編排系統(k8s)帶來的價值:
1、使得容器環境與虛擬機環境不再割裂,統一網絡方案:統一網絡方案帶來的好處不言而喻,一方面可以減少網絡運維的成本,一方面不會在“虛擬機容器之間網絡互訪”的問題上來帶網絡選型的局限性。
2、促進虛擬機應用向聲明式配置和自動化運維方向發展: 使用k8s對虛擬機容器進行統一管理后,可以讓虛擬機及虛擬機應用享受到k8s的紅利,降低虛擬機及虛擬機應用的運維成本,使運維面向一套統一的模型,即聲明式模型。
3、虛擬機容器混合部署,提升機器資源利用率:虛擬機和容器可以統一部署在同一套硬件環境下,在某些統一管理實現中,甚至可以達到在一臺主機上虛擬機和容器的共存,達到企業降本增效的目的。
在軟件工程中,任何一種技術都具備成為某一種場景下的最優選擇,這些選擇是企業根據自身條件作出的決策。
諧云,擁有國內最先進行云原生底層技術研究和K8s應用的團隊,是國內為數不多掌握底層核心技術的容器云產品及解決方案提供商,諧云產品以建好容器云—管好容器云—用好容器云為矩陣,為企業的虛擬機管理帶來k8s的紅利,提供云原生全棧服務,助力企業降本增效,攜手擁抱云原生!