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