cri-o 技术探秘 3

pinns
在探秘 1 中我们提到,namespace 相关的是由 NewPodNamespaces 函数来完成的,我们可以在 NewPodNamespaces 实现看到,创建 namespace 使用过调用 pinns 命令来完成的。pinns 是 cri-o 内部的一个组件,使用 C 语言编写,位于 pinns 文件夹,主要逻辑是使用 unshare 系统调用来创建 namespace。目前 pinns 支持四种 namespace 的创建:
ipc
uts
user
net
默认情况下, 会在var/run/目录下创建 namespace。 比如 net, 创建的 namespace 格式为/var/run/netns/${uuid}.
我们知道sysctl用于运行时配置内核参数,这些参数位于/proc/sys 目录下。sysctl 配置与显示在/proc/sys 目录中的内核参数.可以用 sysctl 来设置或重新设置联网功能,如 IP 转发、IP 碎片去除以及源路由检查等。用户只需要编辑/etc/sysctl.conf 文件,即可手工或自动执行由 sysctl 控制的功能。在容器技术中, 新启动的 pod 同样要考虑 sysctl 的设置,这样新启动的 pod 就会使用传入的 sysctl 设置。
如果不想使用某一种 namespace 或多种 namespace,我们可以通过在 pinns 参数中将这些 namespace 参数值都设置为 host。
如果通过 pinns 创建 namespace 失败的时候, 使用 unix.Unmount(ns.Path, unix.MNT_DETACH)删除所有创建的 namespace。如果 NewPodNamespace 过程中出现错误, 则调用 Namespace.Remove 方法来清理,本质上 Namespace.Remove 也是调用 unix.Unmount 来完成 remove 操作的。
如果存在 IDMappings 参数,则将创建的 namespace path 的 UID 和 GID 设置为 root user 的 UID 和 GID。相关函数为 chownDirToIDPair。
如果仔细阅读代码, 可以看到, pid namespace 并不是在 pinns 里面来创建的,这是为什么呢?带着这个问题,我们一步一步来阅读 pinns 的 C 语言代码。
当传入 pinns 中的参数为-U=host 的时候,pinns 会认为不创建 user namespace,这个时候回直接通过 unshare 系统调用来创建 namespace。
否则,我们会创建一个新的进程来完成 unshare 的操作。fork 新进程完成 unshare 操作比较复杂,我们通过下面的示意图来解释:
不论是直接 unshare 还是通过新的子进程 unshare 后,还需要有两个工作需要完成。
configure_sysctls。这个比较简单,直接通过 write_sysctl_to_file 函数将 sysctl 的数据写入到/proc/sys 下的对应文件内。
bind 各种 namespace。通过
mount(ns_path, bind_path, NULL, MS_BIND, NULL)调用来将/var/run/${type}ns/${uuid}和/proc/${pid}/ns/${ns name}或者/proc/self/ns/${ns name}绑定起来。
下面我们来做一个实验,使用下面的命令创建一个 pod 及其里面的 container。
查找 config.json 里面的 namespace 部分配置,从中可以看到, path 就是我们通过 pinns 创建出来的 path。
使用 crictl exec $CONTAINER_ID ps aux在 container 中查看 pid 是 1.
我们再次在这个 pod 下面运行另外一个 container。
使用 crictl exec $CONTAINER_ID2 ps aux在 container 中查看 pid 仍然是 1.
由此可见 pid namespace 是每个 container 都会创建一份的,并不是 pod level 的,所以在创建 pod 的时候不需要由 pinns 创建 pid namespace。实际上 pid namespace 是在创建 container 的时候由 runc 来创建的。
版权声明: 本文为 InfoQ 作者【xumc】的原创文章。
原文链接:【http://xie.infoq.cn/article/152323ec6f84ec17bd52cda1d】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。











评论