所屬技術領域:
K8s
|名詞定義|
容器之是以被稱為特殊的程序,是因為容器這個程序是有邊界的。上一篇部落格提到容器是一種沙盒技術,即能夠向集裝箱一樣把應用裝起來,這樣應用與應用之間因為存在邊界而不至于互相幹擾,而被裝進集裝箱的應用也能被友善的搬運——這就是PaaS最理想的狀态。容器技術的核心功能,就是通過限制和修改程序的動态表現,進而為其人為打造“邊界”。在Linux中,Cgroup技術是用來制造限制的主要手段,而Namespace技術則是修改程序視圖的主要方法,即讓程序看到的資源資訊與實際資源資訊不同,俗稱“障眼法”。
|技術特點|
namespace
namespace 是用來做資源隔離的,在 Linux 核心上有七種 namespace,docker 中用到了前六種。第七種 cgroup namespace 在 docker 本身并沒有用到,但是在 runC 實作中實作了 cgroup namespace。
我們先從頭看一下:
第一個是 mout namespace。mout namespace 就是保證容器看到的檔案系統的視圖,是容器鏡像提供的一個檔案系統,也就是說它看不見主控端上的其他檔案,除了通過 -v 參數 bound 的那種模式,是可以把主控端上面的一些目錄和檔案,讓它在容器裡面可見的。
第二個是 uts namespace,這個 namespace 主要是隔離了 hostname 和 domain。
第三個是 pid namespace,這個 namespace 是保證了容器的 init 程序是以 1 号程序來啟動的。
第四個是網絡 namespace,除了容器用 host 網絡這種模式之外,其他所有的網絡模式都有一個自己的 network namespace 的檔案。
第五個是 user namespace,這個 namespace 是控制使用者 UID 和 GID 在容器内部和主控端上的一個映射,不過這個 namespace 用的比較少。
第六個是 IPC namespace,這個 namespace 是控制了程序兼通信的一些東西,比方說信号量。
第七個是 cgroup namespace,上圖右邊有兩張示意圖,分别是表示開啟和關閉 cgroup namespace。用 cgroup namespace 帶來的一個好處是容器中看到的 cgroup 視圖是以根的形式來呈現的,這樣的話就和主控端上面程序看到的 cgroup namespace 的一個視圖方式是相同的。另外一個好處是讓容器内部使用 cgroup 會變得更安全。
這裡我們簡單用 unshare 示例一下 namespace 創立的過程。容器中 namespace 的建立其實都是用 unshare 這個系統調用來建立的。
cgroup
1.兩種 cgroup 驅動
cgroup 主要是做資源限制的,docker 容器有兩種 cgroup 驅動:一種是 systemd 的,另外一種是 cgroupfs 的。
cgroupfs 比較好了解。比如說要限制記憶體是多少,要用 CPU share 為多少,其實直接把 pid 寫入對應的一個 cgroup 檔案,然後把對應需要限制的資源也寫入相應的 memory cgroup 檔案和 CPU 的 cgroup 檔案就可以了。
另外一個是 systemd 的一個 cgroup 驅動。這個驅動是因為 systemd 本身可以提供一個 cgroup 管理方式。是以如果用 systemd 做 cgroup 驅動的話,所有的寫 cgroup 操作都必須通過 systemd 的接口來完成,不能手動更改 cgroup 的檔案。
2.容器中常用的 cgroup
CPU cpuset cpuacct
memory
device
freezer
blkio
pid
3.不常用的 cgroup
net_cls
net_prio
hugetlb
perf_event
rdma
|資料來源|
名詞定義:
https://blog.csdn.net/lhl1124281072/article/details/87900751