pod sandbox 创建netns源码分析
在上一篇《创建Pod源码解析》文中,我们大概介绍了Pod的整体创建过程。其中有一步很重要,就是在创建三类容器之前必须先创建一个 sandbox (源码),本篇就来分析一下sandbox这一块的 netns 实现过程。
对 sandbox 的创建由 kubelet 组件通过调用 CRI 容器运行时服务来实现的,对于容器运行的实现目前市面上有多个,如 Docker Engine(不推荐)、 containerd、CRI-O 等,由于目前生产环境中选择 containerd 的占大多数,所以这里我们以 containerd 为例来看一下其实现过程。
https://github.com/containerd/containerd/blob/32bf805e5703bc91387d047fa76625e915ac2b80/pkg/cri/server/sandbox_run.go
对 sandbox 的创建是由 cri 服务调用 RunPodSandbox()方法来实现的。
// RunPodSandbox creates and starts a pod-level sandbox. Runtimes should ensure // the sandbox is in ready state. func (c *criService) RunPodSandbox(ctx context.Context, r *runtime.RunPodSandboxRequest) (_ *runtime.RunPodSandboxResponse, retErr error) { ... // Save sandbox name sandboxInfo.AddLabel("name", name) // 初始化 sandbox, 注意此时的 network namespace 未指定 // Create initial internal sandbox object.
read more