相信大家在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命令的参照下列表格

操作crictldocker
查看运行容器crictl psdocker ps
查看镜像crictl imagesdocker images
查看容器日志crictl logsdocker logs
登陆容器控制台crictl execdocker exec
pull镜像crictl pulldocker pull
容器启动/停止crictl start/stopdocker start/stop
容器资源情况crictl statsdocker 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

Logo

开源、云原生的融合云平台

更多推荐