六種名稱空間
namespace | 系統調用參數 | 隔離內容 | 內核版本 |
---|---|---|---|
UTS | CLONE_NEWUTS | 主機名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信號量,消息隊列,共享內存 | 2.6.19 |
Mount | CLONE_NEWNS | 掛載點(文件系統) | 2.4.19 |
PID | CLONE_NEWPID | 進程編號 | 2.6.24 |
Network | CLONE_NEWNET | 網絡設備,網絡棧,端口 | .6.29 |
User | USER | 用戶和用戶組 | 3.8 |
簡單來說,容器技術就是一種資源的隔離技術,就是通過對以上內核的隔離,來實現的。
隔離限制
有了資源隔離,肯定要對隔離出來的出來的資源進行限制,不能放任某一個隔離環境對資源的無限消耗使用。最常見的資源就是CPU和內存了。
比如一個宿主機共有32C64G,在他上面隔離出了兩個名稱空間,我們可以按照比例給這兩個名稱空間分配資源,比如說CPU,各佔50%,此時兩個名稱空間內的進程就只能使用16個CPU的資源,超過16個CPU,可能就會擠佔其他的名稱空間的CPU,如果其他名稱空間沒有多餘的CPU,那麼此時該名稱空間內的進程就需要排隊等待CPU,或者給兩個各25%的CPU,還有50%可以留給宿主機。最常見的我們還是應該按照數量來分配,比如說給第一個名稱空間16個CPU,第二個也16個CPU。除此之外還有內存,內存一般都是按照大小進行劃分,給了第一個名稱空間16G,那麼他在此名稱空間內的進程就只能最多使用16G,超過16G是不可以的,因爲內存不可以壓縮,更不能搶佔,超過後,該名稱空間內使用內存最最多的進程就會被OOM掉。
linux通過一種叫做control groups(cgroups)的機制來控制資源,他有以下四種功能
- 資源限制:cgroups 可以對任務是要的資源總額進行限制。比如設定任務運行時使用的內存上限,一旦超出就發 OOM。
- 優先級分配:通過分配的 CPU 時間片數量和磁盤 IO 帶寬,實際上就等同於控制了任務運行的優先級。
- 資源統計:cgoups 可以統計系統的資源使用量,比如 CPU 使用時長、內存用量等。這個功能非常適合當前雲端產品按使用量計費的方式。
- 任務控制:cgroups 可以對任務執行掛起、恢復等操作。
cgroups通過子系統來控制不同的資源,常見的如下
- blkio 對塊設備的 IO 進行限制。
- cpu 限制 CPU 時間片的分配,與 cpuacct 掛載在同一目錄。
- cpuacct 生成 cgroup 中的任務佔用 CPU 資源的報告,與 cpu 掛載在同一目錄。
- cpuset 給 cgroup 中的任務分配獨立的 CPU(多處理器系統) 和內存節點。
- devices 允許或禁止 cgroup 中的任務訪問設備。
- freezer 暫停/恢復 cgroup 中的任務。
- hugetlb 限制使用的內存頁數量。
- memory 對 cgroup 中的任務的可用內存進行限制,並自動生成資源佔用報告。
- net_cls 使用等級識別符(classid)標記網絡數據包,這讓 Linux 流量控制器(tc 指令)可以識別來自特定 cgroup 任務的數據包,並進行網絡限制。
- net_prio 允許基於 cgroup 設置網絡流量(netowork traffic)的優先級。
- perf_event 允許使用 perf 工具來監控 cgroup。
- pids 限制任務的數量。
有了名稱空間的隔離技術,在加上對名稱空間的資源隔離,linux在3.6內核上已經將這兩個技術集成到了內核上,也就是linux已經支持這種所謂的隔離技術,距離我們的docker已經越來越近了。