docker、Containerd ctr、crictl 区别
简述
作为接替 Docker 运行时的 Containerd 在早在 Kubernetes1.7 时就能直接与 Kubelet 集成使用,只是大部分时候我们因熟悉 Docker,在部署集群时采用了默认的 dockershim。在V1.24
起的版本的 kubelet 就彻底移除了dockershim
,改为默认使用Containerd
了,当然也使用 cri-dockerd
适配器来将Docker Engine
与 Kubernetes 集成。可以参考官方文档:
- https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#docker
一、docker 和 containerd区别
1、docker 由 docker-client ,dockerd,containerd,docker-shim,runc组成,所以containerd是docker的基础组件之一
2、从k8s的角度看,可以选择 containerd 或 docker 作为运行时组件:其中 containerd 调用链更短,组件更少,更稳定,占用节点资源更少。所以k8s后来的版本开始默认使用 containerd 。
3、containerd 相比于docker , 多了 namespace 概念,每个 image 和 container 都会在各自的namespace下可见。
4、docker 作为 k8s 容器运行时,调用关系为:kubelet --> dockershim (在 kubelet 进程中) --> dockerd --> containerd
containerd 作为 k8s 容器运行时,调用关系为:kubelet --> cri plugin(在 containerd 进程中) --> containerd
二、ctr 和 crictl 命令区分
ctr 是 containerd 的一个客户端工具。
crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。
ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。
kuaibang@node1:~$ ctr -v ctr github.com/containerd/containerd v1.6.6 kuaibang@node1:~$ crictl -v crictl version v1.24.0
注:一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。
由于 Containerd 也有 namespaces 的概念,对于上层编排系统的支持,ctr
客户端 主要区分了 3 个命名空间分别是k8s.io、moby和default
,以上我们用crictl
操作的均在k8s.io
命名空间,使用ctr
看镜像列表就需要加上-n 参数。crictl 是只有一个k8s.io
命名空间,但是没有-n 参数。
【温馨提示】ctr images pull 拉取的镜像默认放在default
,而 crictl pull 和 kubelet 默认拉取的镜像都在 k8s.io 命名空间下。所以通过ctr
导入镜像的时候特别注意一点,最好指定命名空间。
# 注意-n不能放在命令最后面,下面几行查看的镜像是一样的 ctr -n=k8s.io image ls ctr -n k8s.io image ls # crictl 没有-n参数,操作都在`k8s.io`命名空间下。 crictl image ls crictl images # crictl image list = ctr -n=k8s.io image list # crictl image ls = ctr -n=k8s.io image ls # crictl images = ctr -n=k8s.io image list # crictl images = ctr -n=k8s.io image ls # 使用ctr命令指定命名空间导入镜像 ctr -n=k8s.io image import dashboard.tar #查看镜像,可以看到可以查询到了 crictl images
三、命令的比较