相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockershim。不过社区也说了,在1.20之后的版本的kubelet会放弃对dockershim部分的支持。

Container docker的区别 和 containerd与docker_客户端

1)docker 由 docker-client ,dockerd,containerd,docker-shim,runc组成,所以containerd是docker的基础组件之一,后期开源出来了成为服务端。至于客户端docker,ctr,crictl,nerdctl等都可以使用,只要实现OCI规范即可。大家不过目前熟悉使用docker而已,nerdctl也是个不错的客户端工具。crictl是针对k8s/k3s而生的。ctr是containerd自带的客户端工具属于本家。其余都是第三方非本家实现的。

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

5)ctr 是 containerd 的一个客户端工具。ctr 不使用 CRI 配置。因此,您在 config.toml 的 CRI 部分中指定的身份验证不会被 ctr 客户端读取。要将 auth 用于 ctr 您需要添加-u user:password到图像拉取请求
6)crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。
7)ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。

8)nerdctl:官方工具是crictl,但是更推荐使用nerdctl.和docker官方语法几乎完全一致

1 安装containerd

1.) 下载安装

[root@jettoloader nerdctl]# yum install containerd
或二进制安装

[root@jettoloader nerdctl] wget https://github.com/containerd/containerd/releases/download/v1.5.8/cri-containerd-cni-1.5.8-linux-amd64.tar.gz


解压到/ 下面各自的目录中去
[root@jettoloader containerd]# tar -xf cri-containerd-cni-1.5.8-linux-amd64.tar.gz -C /


启动容器服务
[root@jettoloader containerd]# systemctl enable containerd --now

2.)生成配置:

[root@jettoloader containerd]#  mkdir -p /etc/containerd
[root@jettoloader containerd]# containerd config default > /etc/containerd/config.toml

2 工具介绍

接下来就是crictl的的常见命令,其中能完全替代docker命令的参照下列表格

操作

crictl

docker

查看运行容器

crictl ps

docker ps

查看镜像

crictl images

docker images

查看容器日志

crictl logs

docker logs

登陆容器控制台

crictl exec

docker exec

pull镜像

crictl pull

docker pull

容器启动/停止

crictl start/stop

docker start/stop

容器资源情况

crictl stats

docker stats

这里需注意的是,由于Containerd也有namespaces的概念,对于上层编排系统的支持,主要区分了3个命名空间分别是k8s.io[crictl]moby[docker]default[ctr],以上我们用crictl操作的均在k8s.io命名空间完成如查看镜像列表就需要加上-n参数

Container docker的区别 和 containerd与docker_java_02

 

Container docker的区别 和 containerd与docker_kubernetes_03

操作containerd使用的命名空间不同,镜像物理隔离目录完全不同。

docker变成docker ce后默认命名空间moby

containerd默认空间default

kubernetes默认空间k8s.io

 

3 Containerd与Kubelet集成

3.1 修改kubelet配置,在配置文件/var/lib/kubelet/      KUBELET_KUBEADM_ARGS追加以下部分

KUBELET_KUBEADM_ARGS="--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock --image-service-endpoint=unix:///run/containerd/containerd.sock"

3.2 重启containerd和kubelet服务

systemctl restart containerd kubelet