
之是以使用虛拟機,其出發點是我們可以利用虛機将一台大的伺服器隔離成多個小的虛機,每個虛機跑獨立的應用,這樣便于我們管理;舉個例子,假設沒有虛拟機,我們将多個應用跑在一台伺服器上,多個應用間很有可能會出現端口沖突,或者多個應用使用同一個軟體的版本不一樣(例如使用不同版本的Python,JDK版本不一樣等等),即在一台機器上運作多個應用可能産生沖突,是以可以考慮将一台伺服器隔離成多個資源隔離的虛拟機,應用跑在每個獨立的虛機裡面,例如一個虛拟機隻跑一個應用,而另一個虛機跑另一個應用。 這樣就避免了應用之間的沖突。此外某些應用可能存在不易察覺的BUG,例如在特定的場景下觸發後會瘋狂的吃記憶體。如果多個應用運作在一台實體伺服器上的話,一個應用的BUG會影響其他的應用和服務的運作。而此時既然我們有虛機了,就沒有必要在一台大的實體伺服器上跑多個應用,此時就可以将大的硬體伺服器隔成多個小的虛機,在每個小的虛機裡運作不同的單一的應用,避免互相之間的幹擾和沖突。如圖所示:
但是經過一段時間的使用,人們逐漸意識到這種應用場景存在有一個很嚴重的問題:虛拟機占用的資源過多,導緻伺服器資源使用率低。
虛機裡都要跑一個Gust OS,例如跑一個Windows的虛機或者Ubuntu的虛機就是在虛機裡面起一個作業系統且這個作業系統跟主控端的作業系統通常不一樣(當然也可以一樣)。例如我一台硬體伺服器上首先安裝redhat的作業系統,且使用KVM或XEN做了虛拟化,在其之上虛拟出多個虛機出來。之後要做的事情就是在每個虛拟機裡面運作我們的應用服務。但是後來人們逐漸發現一個問題,就是這個主控端的Guest OS即主控端的Gust作業系統 ,占用資源太多。每個虛機裡跑的應用占用的資源本身并不多,大量的資源被Guest OS即虛機裡面跑的作業系統占用了。例如我隻需要在虛拟機裡跑一個小的服務,服務本身也就需要幾十M,最多幾百兆的記憶體,但是需要為他啟一個Windows的虛機,而Windows一啟動就是一大坨,隻要Windows一啟動那至少1、2個G的記憶體就沒了。原本想要的是把伺服器隔得越小,靈活性越好,可管理性越好,避免服務之間的幹擾。但事實是,我隔得越小導緻我浪費的資源越多。 因為隔得越小我需要跑的Guest OS就越多,資源浪費也就越多。
然而,仔細想一想我們為什麼要使用作業系統呢?作業系統主要幹的事情是管理計算、存儲、網絡等等這樣一些硬體裝置 ,并且能在裡面排程程序。實作一些具體的應用。然而作業系統幹的事情,跟我們之前的需求:利用虛拟化将一個實體伺服器隔離成多個資源之間彼此隔離的虛拟機,将應用放在一個個小的虛拟機環境裡面去運作,應用之間互相之間不影響可以很靈活的排程資源。是以我們想要的理想的情況就是:我們可以随時建立一個小格出來(前面就是指虛機),且随時可以銷毀釋放資源,且各個小格子之間還有隔離型,互相之間不影響。虛機之是以被廣泛應用就是因為虛機可以滿足這樣的需求,而不是因為虛機可以模拟一個完整的機器。這裡就引出一個對虛拟機的反思,我們使用軟體完全實作一個實體世界的硬體環境,有沒有太大的必要 ? 之前曾提到過,為甚麼要模拟一個真實存在的IO裝置呢,你的真正目的是為了實作IO,實作輸入輸出。如果我們純粹為虛拟化設計一個虛拟的IO裝置行不行呢?當然是可以的,我們隻需要将作業系統的驅動改成虛機化的IO的驅動就可以了。其實我們要的并不是實作一個完整的把所有實體的硬體都模拟一遍的虛拟伺服器,而是一個相對完整的作業系統環境。
舉個例子,假如一個小格裡面隻跑一個Hadoop的DataNode那我有沒有必要再給這個東西接個顯示器?你接個顯示器幹嘛呢??桌面虛拟化可能需要接顯示器,但是DataNode接個顯示器你能看什麼?完全沒有必要。這樣就少了一個外部裝置。還有一些其他的諸如此類的考慮。最後你就會發現其實我們要的隻是一個相對完整的作業系統的環境,而不是一個完完全全的跟實體伺服器一樣的包括所有實體硬體的模拟的環境 。既然我們隻需要一個相對完整的作業系統的環境 ,那能不能直接利用在實體硬體上跑的那個作業系統(我們稱之為Host OS)來支援呢?即因為我們隻需要一個相對完整的作業系統,那我們能否直接虛拟作業系統,不需要虛拟那些實體的硬體。最後,總結一下就是兩個問題:
- 資源的隔離,使得應用之間對資源的使用互相之間不幹擾。
- 提供一個相對完整的作業系統的環境,而不是一個完整的模拟的硬體環境。
此時人們就在想,能不能直接使用Host OS,來模拟一個相對完整的作業系統,而不需要再在Host OS上跑Guest OS,于是就發展出來了作業系統級的虛拟化技術,就是利用作業系統本身的功能來實作虛拟化,這就是Container技術 。Container技術其實也是一條完整的線,經過了很長時間的發展,到今天他跟虛拟機的HyperVisor之間的發展也是錯綜複雜的一個關系,并不是說Container技術出現了HyperVisor技術就利用起來了 ,Container很早就出現了,HyperVisor也一直在發展。目前提及Container大多指的就是 Docker,畢竟太火了沒辦法。下篇文章将介紹Container技術。
下一節将介紹Container技術!
未完待續。。。。(謹以此系列文章緬懷逝去的學生時代)