容器的工作原理和隔離機制

godruoyi發表於2018-10-21

file

由於自己最近在學習 [[@張磊](https://learnku.com/users/15716)](https://learnku.com/users/15716) 老師的 Kubernetes 專欄,以下內容均來自每節專欄學習後的感悟、總結。張老師的Kubernetes專欄通俗易懂,歡迎大家跟我一起加入學習。

原文地址,快來二愣的閒談雜魚一起搖擺吧!!!

容器的本質

容器的本質是一個程式,程式與程式之間相互隔離造就了容器與容器互不影響的特性。在啟動一個容器(即建立一個程式時),透過 Namespace 技術實現容器的隔離、透過Cgroups 來實現容器的資源控制。

Namespace

容器程式的建立透過 Linux 平臺下的 clone 方法建立,在呼叫該方法建立程式時,透過指定額外的 Namespace 引數,使得剛建立的程式屬於一個獨立的空間。

int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL)

指定額外引數 CLONE_NEWPID 建立的新程式,有一個自己的 獨立程式空間,在這個空間裡,它的程式 ID 為 1。它既看不到其在宿主機的真正程式、也看不到其他容器的程式。

其實這都是假象,建立的該程式在宿主機上是真實存在的,並且也受宿主機的管理和控制,也享受宿主機的資源。但在該程式內部,它處於一個獨立的空間,只看得到該程式一個資源,讓其誤以為自己處於一個密閉的 盒子 內。這

這,就是 Linux 容器最基本的實現原理了!

你可能也注意到了,雖然透過 Linux Namespace 技術實現了程式的相互隔離,但這種隔離機制只是為不同的容器程式指定不同的 namespace,但不同的容器程式其實在宿主機上是真實存在的,並且也使用相同的宿主機核心。這也是容器在和虛擬化技術相比下,隔離得不夠徹底的原因。

Cgroups

容器程式建立好後,若不進行其他處理,該程式執行時所消耗及佔用的資源(如 CPU、記憶體)等;是可以被其他宿主機程式或其他容器程式享用的。為了解決這個問題,Linux 容器設計中引入了 Cgroups 的概念。

Linux Cgroups 的全稱是 Linux Control Group,它的主要作用就是限制一個程式能夠使用的資源上限(如 cpu、記憶體、網路等)。

Linux 中,Cgroups 給使用者暴露出來的操作介面是檔案系統,即它以檔案和目錄的方式組織在作業系統的 /sys/fs/cgroup 路徑下。

file

若你的系統中沒有掛載該目錄,那你需要自行 google 掛載。

在該目錄下,你可以看到很多諸如 cpusetcpumemory 這樣的子目錄,也叫子系統。每個目錄下面又有很多配置檔案。如你可能在 cpu 目錄下看到諸如 cfs_periodcfs_quota 這樣的配置檔案。而這兩個配置檔案,是限制 CPU 使用率的關鍵配置項。

file

這兩個引數需要組合使用,可以用來限制程式在長度為 cfs_period 的一段時間內,只能被分配到總量為 cfs_quotaCPU 時間。其中 period 的預設值為 100 ms(毫秒),quota 的預設值為 -1,即不做限制。當修改 quota 的值為 20 ms 時,表示在 100ms 的時間範圍內,cpu 只能使用 20 ms。也就是說,cpu 的使用率最大為 20%

上面說到,容器啟動後的程式我們需要用 Linux Cgroups 來限制其資源的訪問。接下來我們看看到底是如何進行控制的。

我們在 /sys/fs/cgroup/cpu 目錄下建立一個資料夾:

file

可以看到,我們建立的資料夾裡面已經被系統預設建立了一些配置檔案。我們把這樣一個目錄叫做控制組,接下來修改這個控制組的 cpu 使用率為 20%

我們在命令列用一個死迴圈來測試,也使得該程式能佔用全部的 CPU。

file

透過 top 引數,我們看到該程式 5451 的 cpu 使用率已經達到 99.3%;由於我們建立該程式時,沒有為其指定一個控制組時,他預設將享用全部的 cpu 及記憶體配置。接下老我們將該程式透過下面的命令加入到剛剛建立的 container 組中去。

$ echo 5451 > /sys/fs/cgroup/cpu/container/tasks

將改程式加入控制組後,改程式的 cpu 使用率一下就從原來的 100% 降到了 20% 左右。

file

在 docker 中,我們可以在啟動容器的時候,指定 cpu 引數來控制該容器的資源佔用,如下所示,這樣啟動的 docker 容器,只能使用 20% 的 cpu。

Docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash

當然,透過 Linux Cgroups 還可以限制其他引數,如網路、掛載點、記憶體等等。


今天就學到這兒了,明天繼續吧!!!

file

本作品採用《CC 協議》,轉載必須註明作者和本文連結
二愣的閒談雜魚

相關文章