目录
kubelet+CRI+OCI工作流程(以containerd为例)
讨论 CRI、OCI、containerd和CRI-O、runc,其实就是一个概念问题,看图更易理解含义,所以先上两张图。


CRI(Container Runtime Interface,容器运行时接口)是kubernetes定义的接口,定义了如何操作容器和镜像的统一规范,它主要包含ImageService和ContainerService。因为它已经是一个标准,所以你可以选择任何一个CRI的实现( containerd和CRI-O)来使用。
contianerd来自于docker,它通过CRI插件来实现了CRI,containerd可以说包含两部分:cri-plugin+runc。
CRI-O也是一个CRI的实现,它来自于Red Hat/IBM等
OCI(Open Container Initialtive)提供了容器镜像和运行容器的规范。runc是OCI的一个实现,它是一个创建和运行容器进程的工具。
runc实际上是从libcontainer演化过来的,并且是docker贡献给社区的第一个OCI参考实现,它就是用来创建和运行容器进行的工具。

通过上图我们大致了解了CRI、OCI的位置,加上上门的释义,我们知道了它们是两个标准,以及它们的典型实现(containerd、runc)。但是,总感觉还是比较虚,那么我们下面就落到实处去看看它们是怎样工作的。
下面代码块中展示的是containerd.io 1.6.6版本(截止2022/07/29最新) rpm包的文件列表,下面我们看一下这些文件都是干什么的。
- rpm -ql containerd.io
- /etc/containerd
- /etc/containerd/config.toml
- /usr/bin/containerd
- /usr/bin/containerd-shim
- /usr/bin/containerd-shim-runc-v1
- /usr/bin/containerd-shim-runc-v2
- /usr/bin/ctr
- /usr/bin/runc
- /usr/lib/systemd/system/containerd.service
- # docker命令查看容器列表
- docker ps -a
- CONTAINER ID IMAGE COMMAND NAMES
- 3eb656566412 e57a417f15d3 "/metrics-server --c…" k8s_metrics-server_……
- 20d99aeeae9b 192.168.11.101/library/pause-amd64:3.0 "/pause" k8s_POD_metrics-……
- f8bc54c1f151 a1a88662416b "/usr/bin/kube-contr…" k8s_calico-kube-……
- 22d29ed973aa 192.168.11.101/library/pause-amd64:3.0 "/pause" k8s_POD_calico-kube-……
- 1b4ec45dafdc 192.168.11.101/library/node "start_runit" k8s_calico-……
- 1514a05df57a 192.168.11.101/library/pause-amd64:3.0 "/pause" k8s_POD_calico-node-……
- # ctr 命令查看容器列表
- ctr -n moby c list
- CONTAINER IMAGE RUNTIME
- 1514a05df57a532a2fa8d2652942d9f48a049067ff9a04aea15312f75ee24275 - io.containerd.runc.v2
- 1b4ec45dafdcf60db49ccf2fb07f7e278d442c9392b2240fd75a86fc2a971904 - io.containerd.runc.v2
- 20d99aeeae9b52a6bfd667491c8191b9e7c71c0003a76dc1c34a735d449ab46d - io.containerd.runc.v2
- 22d29ed973aaed983c2dbc987e3d828fde5a5e1d36f4057e5425dae0a4698b86 - io.containerd.runc.v2
- 3eb656566412b9efb422da375e3304e1680e30a7875832ac1750390498906228 - io.containerd.runc.v2
- f8bc54c1f1512d5b8202b8de76a98e11edc71271e80a848013846f9933ba0bb6 - io.containerd.runc.v2
- # runc 命令查看容器列表
- runc --root /var/run/docker/runtime-runc/moby/ list -q
- 1514a05df57a532a2fa8d2652942d9f48a049067ff9a04aea15312f75ee24275
- 1b4ec45dafdcf60db49ccf2fb07f7e278d442c9392b2240fd75a86fc2a971904
- 20d99aeeae9b52a6bfd667491c8191b9e7c71c0003a76dc1c34a735d449ab46d
- 22d29ed973aaed983c2dbc987e3d828fde5a5e1d36f4057e5425dae0a4698b86
- 3eb656566412b9efb422da375e3304e1680e30a7875832ac1750390498906228
- f8bc54c1f1512d5b8202b8de76a98e11edc71271e80a848013846f9933ba0bb6
上面我们粗略的讲述了云原生技术中的一些专有名词,并以containerd为例讲述了它们的工作流程。下一节,我会将一下“Docker架构演进过程”,敬请期待。