容器运行时(Container Runtime)是k8s最重要的组件之一,负责管理镜像和容器的生命周期。Kubelet 通过 Container Runtime Interface (CRI) 与容器运行时交互,以管理镜像和容器。
k8s从1.20版本之后不再使用docker作为其默认CRI,而是使用了containerd。下面是对containerd的一些介绍。
1.介绍
docker由docker-client,dockerd,containerd,docker-shim,runc组成。containerd是docker的基础组件之一。
这是containerd官网的图片。

2.对比
1.调用链
从图中可以看到k8s在使用docker和containerd作为CRI时的不同调用路径:
docker:
kubelet –> docker shim (在 kubelet 进程中) –> dockerd –> containerd
containerd:
kubelet –> cri plugin(在 containerd 进程中) –> containerd
containerd调用链更短,组件更少,更稳定,占用节点资源更少。
dockerd 虽增加了 swarm cluster、 docker build 、 docker API 等功能,但也会引入一些 bug,而与 containerd 相比,多了一层调用。
2.常用命令
containerd 不支持 docker API 和 docker CLI,但是可以通过 cri-tool 命令实现类似的功能。
镜像相关功能 |
docker |
contained |
显示本地镜像列表 |
docker images |
crictl images |
下载镜像 |
docker pull |
crictl pull |
上传镜像 |
docker push |
无 |
删除本地镜像 |
docker rmi |
crictl rmi |
显示镜像详情 |
docker inspectc |
crictl inspecti |
POD相关功能
POD相关功能 |
docker |
containerd |
显示POD列表 |
无 |
crictl pods |
查看POD详情 |
无 |
crictl inspectp |
运行POD |
无 |
crictl runp |
停止POD |
无 |
crictl stopp |
容器日志位置和参数
对比项 |
docker |
containerd |
存储路径 |
docker作为k8s容器运行时的情况下,容器日志的落盘由docker来完成, 保存在类似/var/lib/docker/containers/$CONTAINERID目录下。kubelet会在/var/log/pods和/var/log/containers下面建立软链接,指向/var/lib/docker/containers/$CONTAINERID目录下的容器日志文件 |
containerd作为k8s容器运行时的情况下, 容器日志的落盘由kubelet来完成,保存到/var/log/pods/$CONTAINER_NAME目录下,同时在/var/log/containers目录下创建软链接,指向日志文件 |
配置参数 |
在docker配置文件中指定: “log-driver”: “json-file”, “log-opts”: {“max-size”: “100m”,”max-file”: “5”} |
方法一:在kubelet参数中指定: –container-log-max-files=5 –container-log-max-size=”100Mi” 方法二:在KubeletConfiguration中指定: “containerLogMaxSize”: “100Mi”, “containerLogMaxFiles”: 5, |
把容器日志保存到数据盘 |
把数据盘挂载到”data-root”(缺省是/var/lib/docker)即可 |
创建一个软链接/var/log/pods指向数据盘挂载点下的某个目录 |
cni
对比项 |
docker |
containerd |
谁负责调用CNI |
kubelet内部的docker-shim |
containerd内置的cri-plugin |
如何配置CNI |
kubelet参数 –cni-bin-dir 和 –cni-conf-dir |
containerd配置文件(toml): plugins.cri.cni bin_dir = “/opt/cni/bin” conf_dir = “/etc/cni/net.d” |
容器相关功能
容器相关功能 |
docker |
containerd |
显示容器列表 |
docker ps |
crictl ps |
创建容器 |
docker create |
crtctl create |
启动容器 |
docker start |
crtctl start |
停止容器 |
docker stop |
crictl stop |
删除容器 |
docker rm |
crictl rm |
查看容器详情 |
docker inspect |
crictl inspect |
attach |
docker attach |
crictl attach |
exec |
docker exec |
crictl exec |
logs |
docker logs |
crictl logs |
stats |
docker stats |
crictl stats |
镜像相关功能
镜像相关功能 |
docker |
containerd |
显示本地镜像列表 |
docker images |
crictl images |
下载镜像 |
docker pull |
crictl pull |
上传镜像 |
docke push |
无 |
删除本地镜像 |
docker rmi |
crictl rmi |
查看镜像详情 |
docker inspect |
crictl inspecti |