从零开始入门 K8s:深入剖析 Linux 容器( 六 )

这里我们简单用 unshare 示例一下 namespace 创立的过程 。 容器中 namespace 的创建其实都是用 unshare 这个系统调用来创建的 。

上图上半部分是 unshare 使用的一个例子 , 下半部分是我实际用 unshare 这个命令去创建的一个 pid namespace 。 可以看到这个 bash 进程已经是在一个新的 pid namespace 里面 , 然后 ps 看到这个 bash 的 pid 现在是 1 , 说明它是一个新的 pid namespace 。

cgroup
两种 cgroup 驱动
cgroup 主要是做资源限制的 , docker 容器有两种 cgroup  
驱动:一种是 systemd 的 , 另外一种是 cgroupfs 的 。

cgroupfs 比较好理解 。 比如说要限制内存是多少、要用 CPU share 为多少?其实直接把 pid 写入对应的一个 cgroup 文件 , 然后把对应需要限制的资源也写入相应的 memory cgroup 文件和 CPU 的 cgroup 文件就可以了;

另外一个是 systemd 的一个 cgroup 驱动 。 这个驱动是因为 systemd 本身可以提供一个 cgroup 管理方式 。 所以如果用 systemd 做 cgroup 驱动的话 , 所有的写 cgroup 操作都必须通过 systemd 的接口来完成 , 不能手动更改 cgroup 的文件 。

推荐阅读