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】协议,转载请保留原文出处及本版权声明。
评论