资源隔离的两种虚拟化技术——虚拟机容器 容器技术的资源隔离
文章目錄
- 資源隔離的兩種主要方案
- 虛擬機VS容器
- 容器技術的資源隔離
- 從容器到Docker
資源隔離的兩種主要方案
??在服務器或者大型計算機集群中,往往需要運行大量作業和應用,為保證這些作業和應用的進程之間互不干擾,人們嘗試使用了資源隔離技術來為各個應用進程劃定固定的資源空間,使得進程運行范圍被限制在有限空間內,由此就保證了進程的運行不受其他進程的干擾。這其中被廣泛使用的技術包括虛擬機技術和容器技術,這兩種技術都屬于虛擬化的范疇,但是實現的機理和運行效率卻相差懸殊,下面我們將對這兩種技術作以簡單介紹,并將著重介紹容器技術涉及到的資源隔離。
虛擬機VS容器
??虛擬化技術分為主機級虛擬化和容器級虛擬化,分別對應虛擬機和容器,而主機級虛擬化又分為兩種,具體分類情況大致列舉如下:
- 主機級虛擬化
- Type1:直接在硬件平臺(host machine)上裝一個虛擬機管理器(virtual machine monitor,縮寫為 VMM,eg. Hypervisor),在此之上安裝使用虛擬機(guest machine)。
- Type2:硬件平臺先安裝主機操作系統(host os),在此之上安裝VMM(虛擬機管理器),在這個軟件之上創建使用虛擬機。eg. VM,workstation,virtual Box
- 容器級虛擬化
- 容器級虛擬化即在內核中的一個邏輯級別能夠設置相互隔離的區域,彼此之間互不干擾,由此就可以僅在用戶空間實現一組隔離的組件。在這個用戶空間實現的組件就稱為“容器”,每個容器都容納了一堆的進程和用戶賬號文件等等。
??上圖展示了主機級虛擬化(以Type2為例)和容器級虛擬化的層次結構圖,二者的區別就在于容器技術抽離了虛擬機中的客戶操作系統內核,為何如此,我們以下就來作以簡單分析。
??傳統的虛擬化方式的的確確可以在一組硬件平臺之上實現跨系統環境的隔離,調式等等,也可以實現資源的充分利用,但是其帶來的資源開銷也不容忽視。我們從上圖可以看出,傳統主機級虛擬化,存在兩層調度和資源分配。在第一級內核層,要實現內存虛擬化、CPU調度、I/O管理等等;而在第二級內核層,即在宿主機內核管理的抽象層,還需再次調度。這套機制的運行將嚴重浪費時間,造成額外開銷。 很多時候,創建虛擬機的目的是運行有限的幾個生產進程,而為此付出較大的代價,顯得得不償失。因此減少中間層,減少開銷,提升效率尤為重要。
??由此,人們想到抽離虛擬機中進程之下的內核層,其實質也就變成了容器技術。容器技術的目的在于:在系統內核之上,提供隔離的用戶空間,使得用戶運行進程不受其他進程干擾,進程運行所能看到的邊界就是自己所在用戶空間的邊界。運行虛擬機的目的不只是為了運行進程,還有隔離等等。所以,雖然抽離了內核層,但是隔離效果依然要存在,那么接下來我們就來了解一下容器技術中的隔離是如何實現的。
容器技術的資源隔離
??這里,我們首先來介紹Linux中的Namespace機制,Namespace(命名空間)是Linux提供的一種內核級別環境隔離的方法。讀者應該了解Linux系統中的chroot命令,chroot,即change root directory,通過修改分目錄把用戶jail到一個特定目錄下。chroot提供了一種簡單的隔離模式:chroot內部的文件系統無法訪問外部的內容。而Linux Namespace在此基礎之上,又提供了對UTS、mount、IPC、PID、User和Net等的隔離機制。
| UTS Namespace | 提供對主機名的隔離能力 |
| Mount Namespace | 提供對磁盤掛載點和文件系統的隔離能力 |
| IPC Namespace | 提供對進程間通信的隔離能力 |
| PID Namespace | 提供對進程的隔離能力 |
| User Namespace | 提供對用戶的隔離能力 |
| Network Namespace | 提供對網絡的隔離能力 |
- UTS Namespace
- UTS,即UNIX Time-sharing System namespace,提供了主機名和域名的隔離,使得子進程有獨立的主機名和域名(hostname)。不難理解,運行在同一主機上的多個容器,從用戶角度來看,著多個容器就是多臺可以獨立使用的主機,那么從系統角度來看,要對這多個讓其進行區分隔離,那他們就必須擁有自己獨一無二的名字,因此Linux Namespace提供了對主機名、域名的隔離。默認情況下,容器的hostname就是它的短ID,用戶也可以在容器啟動時設定一個名字,也通過-h或–hostname參數設置。
- Mount Namespace
- Mount Namespace為進程提供獨立的文件系統試圖,讓容器看上去擁有整個文件系統,即擁有/、/bin、/sbin、/etc等目錄。簡單來講,mount namespace就是隔離文件系統的掛載點,這樣進程就只能看到自己的mount namespace中的文件系統掛載點。因此,在容器中對文件系統進行的相關操作,并不能影響到host和其他容器的文件系統。
- IPC Namespace
- IPC,即Inter-Process Communication,是Unix/Linux中進程間通信的一種方式,IPC有共享內存、信號量、消息隊列等方法。每個用戶空間都有自己的IPC,所以,為了保證同一用戶空間進程之間可以通信而跨用戶空間的進程之間無法通信,也需要對IPC進行隔離。IPC需要有一個全局的ID,既然是全局的,那么就意味著Namespace需要對這個ID進行隔離,不能讓別的Namespace的進程看到。
- PID Namespace
- PID,即Process ID。在所有用戶空間中,每個進程都應從屬于一個進程,因為每一個進程都由其父進程創建,否則,該進程則為init進程。一個系統運行要有兩棵樹的存在,即進程樹和文件系統樹,既然對于當前用戶空間,若讓其以為自身為當前系統中唯一一個用戶空間,那么其中的進程就必須明確自己從屬于某一init進程或者自己就是init進程。但一個實際的系統中,只存在一個init進程,于是為每一個用戶空間創建的所謂的“init”進程,對于該用戶空間來說是一個特殊的進程,但對于系統來說,并非init進程。當該特殊進程結束時,那么該用戶空間也將消失。照此理解,namespace也對PID進行了隔離。
- User Namespace
- 所有的用戶進程,都應隸屬于某一真實用戶,不同應用空間可能存在用戶ID相同,而用戶名不同的情況。一個系統只應存在一個root用戶,而每一個用戶空間也需要一個“root”用戶,這也就意味著對于用戶空間而言的“root”用戶對于系統而言只是一個普通用戶,而對于所處用戶空間而言,可以將該用戶ID偽裝為ID為0的用戶,該用戶只能在自身用戶空間之內為所欲為。照此理解,namespace亦實現了對用戶的隔離。
- Network Namespace
- 對于Network的隔離,即讓容器擁有自己獨立的網卡、IP、路由等資源,因而,兩個容器既可以通過網絡通信。
??在主機內核級別,所有的資源都獨立只有一組,原本只支持單個用戶空間的運行,后來,因為有這種運行jail/vserver的需要,就在內核級別將這些資源進行了虛擬化,即將資源切分為多個互相隔離的環境(namespace),在同一內核創建多個名稱空間,每個名稱空間有自己獨立的主機名。
??所有容器機制的實現,Linux內核已經在內核級通過一個namespace的機制對以上6中需要隔離的資源原生支持,可以直接通過系統調用向外輸出。容器級虛擬化技術,可以在總體用戶空間上實現資源按比例分配,也可以在單一用戶空間上實現固定數量的資源(eg. num. of cores )綁定,而這一操作是借助cgroups(Control Groups,控制組)實現的。控制組就是一組按照某種標準劃分的進程。Cgroups中的資源控制都是以控制組為單位實現。一個進程可以加入到某個控制組,也從一個進程組遷移到另一個控制組。一個進程組的進程可以使用cgroups以控制組為單位分配的資源,同時受到cgroups以控制組為單位設定的限制。
從容器到Docker
??從以上的介紹,我們知道在Linux中,容器技術主要通過namespace和Cgroups來實現,但困難的是通過系統調用才能實現容器技術,能做到這一點的人很少,因此將其打包作為一組工具,可以極大簡化用戶的使用,由此誕生了LXC(Linux Container)。
??LXC雖然極大簡化了使用,但在面臨容器分發,大規模部署時,依然存在大量的工作需要人為完成,因此,又在此基礎上誕生了Docker。
??容器時Linux內核中的一項技術,而Docker只是把這種技術的使用得以簡化,使其得以普及。
??由于筆者可能存在理解或表述錯誤,敬請讀者批評指正,也歡迎各位同仁一起交流學習,共同進步!
總結
以上是生活随笔為你收集整理的资源隔离的两种虚拟化技术——虚拟机容器 容器技术的资源隔离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 陶哲轩实分析 附录 A 习题解答
- 下一篇: 二级下拉菜单缓慢渐变