github编辑

Runc和Containerd概述

本文主要分析OCI,CRI,runc,containerd,cri-containerd,dockershim等组件说明及调用关系。

1. 概述

各个组件调用关系图如下:

关系图

图片来源:https://www.jianshu.com/p/62e71584d1cb

OCI(Open Container Initiative)即开放的容器运行时规范,目的在于定义一个容器运行时及镜像的相关标准和规范,其中包括

实现OCI标准的容器运行时有runckata等。

runc(run container)是一个基于OCI标准实现的一个轻量级容器运行工具,用来创建和运行容器。而Containerd是用来维持通过runc创建的容器的运行状态。即runc用来创建和运行容器,containerd作为常驻进程用来管理容器。

runc包含libcontainer,包括对namespace和cgroup的调用操作。

命令参数:

containerd(container daemon)是一个daemon进程用来管理和运行容器,可以用来拉取/推送镜像和管理容器的存储和网络。其中可以调用runc来创建和运行容器。

4.1. containerd的架构图

4.2. docker与containerd、runc的关系图

更具体的调用逻辑:

CRI即容器运行时接口,主要用来定义k8s与容器运行时的API调用,kubelet通过CRI来调用容器运行时,只要实现了CRI接口的容器运行时就可以对接到k8s的kubelet组件。

5.1. docker与k8s调用containerd的关系图

5.2.1. runtime service

5.2.2. image service

5.3. cri-containerd

5.3.1. CRI Plugin调用流程

  1. kubelet调用CRI插件,通过CRI Runtime Service接口创建pod

  2. cri通过CNI接口创建和配置pod的network namespace

  3. cri调用containerd创建sandbox container(pause containerarrow-up-right )并将容器放入pod的cgroup和namespace中

  4. kubelet调用CRI插件,通过image service接口拉取镜像,接着通过containerd来拉取镜像

  5. kubelet调用CRI插件,通过runtime service接口运行拉取下来的镜像服务,最后通过containerd来运行业务容器,并将容器放入pod的cgroup和namespace中。

具体参考:https://github.com/containerd/cri/blob/release/1.4/docs/architecture.md

5.3.2. k8s对runtime调用的演进

由原来通过dockershim调用docker再调用containerd,直接变成通过cri-containerd调用containerd,从而减少了一层docker调用逻辑。

具体参考:https://github.com/containerd/cri/blob/release/1.4/docs/proposal.md

在旧版本的k8s中,由于docker没有实现CRI接口,因此增加一个Dockershim来实现k8s对docker的调用。(shim:垫片,一般用来表示对第三方组件API调用的适配插件,例如k8s使用Dockershim来实现对docker接口的适配调用)

5.5. CRI-O

cri-o与containerd类似,用来实现容器的管理,可替换containerd的使用。

参考:

  • https://opencontainers.org/about/overview/

  • https://github.com/opencontainers/runtime-spec

  • https://github.com/kubernetes/kubernetes/blob/242a97307b34076d5d8f5bbeb154fa4d97c9ef1d/docs/devel/container-runtime-interface.md

  • https://github.com/containerd/containerd/blob/main/docs/cri/architecture.md

  • https://www.tutorialworks.com/difference-docker-containerd-runc-crio-oci/

  • https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/

最后更新于