天天看點

深入刨析KubernetesnamespaceChroot總結

docker使用chroot+namespace+cgroup實作沙箱隔離。

  1. namespace:命名空間,容器隔離的基礎,保證A容器看不到B容器.

    7個命名空間:cggroup、User,Mnt,Network,UTS,IPC,Pid。

    一個namespace相當于一台獨立的裸機。

  2. cggroup:是 Control Group 的縮寫,控制組。通過cgroup可限制每個容器可使用的cpu、記憶體、磁盤、帶寬等資源。實作容器資源的統計與隔離。

    主要用到的cgroups子系統:cpu,blkio,device,freezer,memory

    一個cgroup相當于限定了通過namespece建立的裸機的各個硬體配置。

  3. unionfs 聯合檔案系統(或AUFS):docker分層鏡像的實作理論依據。典型:aufs/overlayfs,分層鏡像實作的基礎。

    UnionFS 其實是一種為 Linux 作業系統設計的用于把多個檔案系統通過mount指令『聯合』到同一個挂載點的檔案系統服務。Docker Image 就是一個檔案系統,對外是以一個檔案的形式展示的(更準确的說是一個 mount 點)。Image 是 Docker 部署的基本機關,一個 Image 包含了我們的程式檔案,以及這個程式依賴的資源的環境。

    AUFS 即 Advanced UnionFS 其實就是 UnionFS 的更新版,它能夠提供更優秀的性能和效率。AUFS 作為先進聯合檔案系統,它能夠将不同檔案夾中的層聯合(Union)到了同一個檔案夾中,這些檔案夾在 AUFS 中稱作分支,整個『聯合』的過程被稱為聯合挂載(Union Mount)。

    Docker容器的檔案系統最早是建立在Aufs基礎上的,Aufs是一種Union FS,簡單來說就是支援将不同的目錄挂載到同一個虛拟檔案系統之下并實作一種laver的概念,

    由于Aufs未能加入到linux核心中,考慮到相容性的問題,便加入了Devicemapper的支援,Docker目前預設是建立在Devicemapper基礎上,

    devicemapper使用者控件相關部分主要負責配置具體的政策和控制邏輯,比如邏輯裝置和哪些實體裝置建立映射,怎麼建立這些映射關系等,而具體過濾和重定向IO請求的工作有核心中相關代碼完成,是以整個device mapper機制由兩部分組成–核心空間的device mapper驅動,使用者控件的device mapper庫以及它提供的dmsetup工具;

    namespace+cggroup相當于一台指定硬體配置的裸機,但上面還沒有安裝作業系統,而docker鏡像就像是一個作業系統的安裝包,通過unionfs服務安裝到了這台電腦上。

  4. docker容器:namespace+cgroup+unionfs相當于一台計算機+作業系統的制造模闆,真正運作起來的執行個體才是一台具體的計算機,這就是docker容器。一個docker容器執行個體就是一台真正意義上的計算機,每個docker容器都具備不同的namespace+cgroup+unionfs,多個容器之間彼此互相隔離。

namespace

命名空間(namespaces)是 Linux 為我們提供的用于分離程序樹、網絡接口、挂載點以及程序間通信等資源的方法。在日常使用 Linux 或者 macOS 時,我們并沒有運作多個完全分離的伺服器的需要,但是如果我們在伺服器上啟動了多個服務,這些服務其實會互相影響的,每一個服務都能看到其他服務的程序,也可以通路主控端器上的任意檔案,這是很多時候我們都不願意看到的,我們更希望運作在同一台機器上的不同服務能做到完全隔離,就像運作在多台不同的機器上一樣。

Linux 的命名空間機制提供了以下七種不同的命名空間,通過這七個選項, 我們能在建立新的程序時, 設定新程序應該在哪些資源上與主控端器進行隔離。具體如下:

深入刨析KubernetesnamespaceChroot總結

Chroot

為了保證目前的容器程序沒有辦法通路主控端器上其他目錄,我們在這裡還需要通過 libcotainer 提供的 pivor_root 或者 chroot 函數改變程序能夠通路個檔案目錄的根節點。

在這裡不得不簡單介紹一下 chroot(change root),在 Linux 系統中,系統預設的目錄就都是以 / 也就是根目錄開頭的,chroot 的使用能夠改變目前的系統根目錄結構,通過改變目前系統的根目錄,我們能夠限制使用者的權利,在新的根目錄下并不能夠通路舊系統根目錄的結構個檔案,也就建立了一個與原系統完全隔離的目錄結構。

總結

總之:dockers=LXC+AUFS

docker為LXC+AUFS組合:

LXC負責資源管理

AUFS負責鏡像管理;

而LXC包括cgroup,namespace,chroot等元件,并通過cgroup資源管理,那麼,從資源管理的角度來看,Docker,Lxc,Cgroup三者的關系是怎樣的呢?

cgroup是在底層落實資源管理,LXC在cgroup上面封裝了一層,随後,docker有在LXC封裝了一層;

【雲原生-Kubernetes篇】深入刨析Kubernetes_掂掂三生有幸的部落格-CSDN部落格_深入刨析kubernetes

Docker原理(圖解+秒懂+史上最全)_架構師-尼恩的部落格-CSDN部落格_docker原理