Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )
一、概述
作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockershim。在
V1.24
起的版本的kubelet就彻底移除了dockershim
,改为默认使用Containerd
了,当然也可以使用cri-dockerd
适配器来将Docker Engine
与 Kubernetes 集成。可以参考官方文档。
二、Containerd 常见命令操作
更换Containerd后,以往我们常用的docker命令也不再使用,取而代之的分别是
crictl
和ctr
两个命令客户端。
crictl
是遵循CRI接口规范的一个命令行工具,通常用它来检查和管理kubelet
节点上的容器运行时和镜像。ctr
是containerd
的一个客户端工具。ctr -v
输出的是containerd
的版本,crictl -v
输出的是当前 k8s 的版本,从结果显而易见你可以认为crictl
是用于k8s
的。一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。
使用crictl
命令之前,需要先配置/etc/crictl.yaml
如下:
1 | runtime-endpoint: unix:///run/containerd/containerd.sockimage-endpoint: unix:///run/containerd/containerd.socktimeout: 10debug: false |
也可以通过命令进行设置:
1 | crictl config runtime-endpoint unix:///run/containerd/containerd.sockcrictl config image-endpoint unix:///run/containerd/containerd.sock |
命令 | docker | ctr(containerd) | crictl(kubernetes) |
---|---|---|---|
查看运行的容器 | docker ps | ctr task ls/ctr container ls | crictl ps |
查看镜像 | docker images | ctr image ls | crictl images |
查看容器日志 | docker logs | 无 | crictl logs |
查看容器数据信息 | docker inspect | ctr container info | crictl inspect |
查看容器资源 | docker stats | 无 | crictl stats |
启动/关闭已有的容器 | docker start/stop | ctr task start/kill | crictl start/stop |
运行一个新的容器 | docker run | ctr run | 无(最小单元为pod) |
打标签 | docker tag | ctr image tag | 无 |
创建一个新的容器 | docker create | ctr container create | crictl create |
导入镜像 | docker load | ctr image import | 无 |
导出镜像 | docker save | ctr image export | 无 |
删除容器 | docker rm | ctr container rm | crictl rm |
删除镜像 | docker rmi | ctr image rm | crictl rmi |
拉取镜像 | docker pull | ctr image pull | ctictl pull |
推送镜像 | docker push | ctr image push | 无 |
登录或在容器内部执行命令 | docker exec | 无 | crictl exec |
清空不用的容器 | docker image prune | 无 | crictl rmi –prune |
更多命令操作,可以直接在命令行输入命令查看帮助。
1 | docker --help |
由于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
导入镜像的时候特别注意一点,最好指定命名空间。
1 | # 注意-n不能放在命令最后面,下面几行查看的镜像是一样的 |
三、container 客户端工具 nerdctl
推荐使用nerdctl,使用效果与docker命令的语法一致
github下载链接:https://github.com/containerd/nerdctl/releases
精简 (nerdctl-
-linux-amd64.tar.gz): 只包含nerdctl
完整 (nerdctl-full-
-linux-amd64.tar.gz): 包含 containerd, runc, and CNI等依赖
nerdctl
的目标并不是单纯地复制 docker 的功能,它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等。具体看nerdctl。
1)安装 nerdctl(精简版)
1 | wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz |
2)安装 nerdctl(完整版,这里不装)
1 | wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-full-0.22.2-linux-amd64.tar.gz |
启动服务buildkit
1 | systemctl enable buildkit containerd --now |
3)安装 buildkit 支持构建镜像
buildkit GitHub地址:https://github.com/moby/buildkit
使用精简版 nerdctl无法直接通过containerd构建镜像,需要与buildkit组全使用以实现镜像构建。当然你也可以安装上面的完整nerdctl;buildkit项目是Docker公司开源出来的一个构建工具包,支持OCI标准的镜像构建。它主要包含以下部分:
服务端buildkitd,当前支持runc和containerd作为worker,默认是runc;
客户端buildctl,负责解析Dockerfile,并向服务端buildkitd发出构建请求。
buildkit是典型的C/S架构,client和server可以不在一台服务器上。而nerdctl在构建镜像方面也可以作为buildkitd的客户端。
1 | # https://github.com/moby/buildkit/releases |
配置buildkit的启动文件,可以从这里下载:https://github.com/moby/buildkit/tree/master/examples/systemd
buildkit需要配置两个文件
/usr/lib/systemd/system/buildkit.socket
1 | cat > /usr/lib/systemd/system/buildkit.socket <<EOF |
/usr/lib/systemd/system/buildkit.service
1 | cat > /usr/lib/systemd/system/buildkit.service << EOF |
启动buildkit
1 | systemctl daemon-reload |
四、实战操作
1)修改containerd配置文件
可以参考我之前的文章:【云原生.大数据】镜像仓库Harbor对接MinIO对象存储
1 | containerd config default > /etc/containerd/config.toml |
配置如下:
1 | [plugins."io.containerd.grpc.v1.cri".registry] |
重启containerd
1 | #重新加载配置 |
注意:这个配置文件是给
crictl
和kubelet
使用,ctr
是不可以用这个配置文件的,ctr 不使用 CRI,因此它不读取plugins.”io.containerd.grpc.v1.cri”配置。
2)ctr 拉取推送镜像
1 | # 推送镜像到harbor |
不想-u user:password每次必须使用 ctr pull/ctr push, 可以使用nerdctl
。
3)镜像构建
1 | cat > Dockerfile <<EOF |
然后在文件所在目录执行镜像构建命令:
1 | # 不加-n指定命名空间,crictl看不到,kubelet也不能使用它,默认在default命名空间下 |
4)打标签 tag
1 | # crictl没有tag命令,只能使用nerdctl和ctr,必须指定命名空间,要不然kubelet无法使用。 |
5)将镜像推送到 Harbor
第一种情况:http
方式,配置如下:
1 | # 以下两个哪个都可以 |
第一种情况:https
方式,配置如下:
1 | # 以下两个哪个都可以 |
通过 nerdctl 登录 harbor
1 | echo Harbor12345 | nerdctl login --username "admin" --password-stdin myharbor-minio.com:443 |
开始将镜像推送到harbor
1 | ### 推送到Harbor |