当前位置: 首页 > 科技观察

Containerdctr、crictl、nerdctl客户端命令介绍及实际操作

时间:2023-03-13 13:14:37 科技观察

一、概述在kubeletV1.24开始的版本中,dockershim被完全移除,默认使用Containerd。当然,cri-dockerd适配器也用于将DockerEngine与Kubernetes集成。可以参考官方文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#docker二、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如下::10debug:false也可以通过命令设置:crictlconfigruntime-endpointunix:///run/containerd/containerd.sockcrictlconfigimage-endpointunix:///run/containerd/containerd.sock命令dockerctr(containerd)crictl(kubernetes)查看正在运行的容器dockerpsctrtaskls/ctrcontainerlscrictlps查看图像dockerimagessctrimagelscrictlimages查看容器日志dockerlogsnocrictllogs查看容器数据信息dockerinspectctrcontainerinfocrictlinspect查看容器资源dockerstatsnocrictlstatsstartup/shutdown现有容器dockerstart/stopctrtaskstart/killcrictlstart/stop运行一个新的容器dockerrunctrrunnone(最小单位是pod)tagdockertagctrimagetagnone新建一个容器dockercreatectrcontainercreatecrictlcreateimportimagedockerloadctrimageimportnoneexportimagedockersavectrimageexportnonedeletecontainerdockerrmctrcontainerrmcrictlrmdeleteimagedockerrmictrimagermcrictlrmipullimagedockerpullctrimagepullctctlpullpushimagedockerpushctrimagepushnologin或者在容器内执行命令dockerexecwithoutcrictlexec清空不用的容器dockerimageprunewithoutcrictlrmi--prune更多命令操作可以直接在命令行输入命令查看帮助docker--helpctr--helpcrictl--help因为Containerd也有命名空间的概念,为了上层编排系统的支持,ctr客户端主要区分3个命名空间,分别是k8s.io、moby和default。以上我们使用crictl的操作都在k8s.io命名空间下。使用ctr查看镜像列表需要加上-n参数。crictl只有一个k8s.io命名空间,但没有-n参数。【温馨提示】ctrimagespull拉取的镜像默认放在default中,而crictlpull和kubelet拉取的镜像默认都在k8s.io命名空间下。所以通过ctr导入图片的时候要特别注意,最好指定一个命名空间。#注意-n不能放在命令的末尾,后面几行查看的图片都是一样的ctr-n=k8s.ioimagelsctr-nk8s.ioimagels#crictl没有-n参数,并且操作都在`k8s.io`命名空间中。crictlimagelscrictlimages#crictlimagelist=ctr-n=k8s.ioimagelist#crictlimagels=ctr-n=k8s.ioimagels#crictlimages=ctr-n=k8s.ioimagelist#crictlimages=ctr复制代码-n=k8s.ioimagels#使用ctr命令指定命名空间导入镜像ctr-n=k8s.ioimageimportdashboard.tar#查看镜像,可以看到可以查询crictl镜像3.containerd客户端工具nerdctl推荐nerdctl,使用效果与docker命令语法一致,github下载地址:https://github.com/containerd/nerdctl/releasesStreamlined(nerdctl--linux-amd64.tar.gz):onlycontainsnerdctlcomplete(nerdctl-full--linux-amd64.tar.gz):包含containerd,runc,和CNI等,依赖nerdctl的目的不是简单的复制docker的功能,它还实现了很多docker没有的功能,比如延迟镜像拉取(lazy-pulling),镜像加密(imgcrypt)等,详见nerdctl。延迟镜像拉取功能可以参考这篇文章:Containerd使用StargzSnapshotter延迟镜像拉取https://icloudnative.io/posts/startup-containers-in-lightning-speed-with-lazy-image-distribution-on-containerd/1)安装nerdctl(精简版)wgethttps://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz#unziptar-xfnerdctl-0.22.2-linux-amd64.tar.gzln-s/opt/k8s/nerdctl/nerdctl/usr/local/bin/nerdctl2)安装nerdctl(完整版,这里没有安装)wgethttps://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-full-0.22.2-linux-amd64.tar.gztar-xfnerdctl-full-0.16.0-linux-amd64.tar.gz-C/usr/local/cp/usr/local/lib/systemd/system/*.service/etc/systemd/system/startservicebuildkitsystemctlenablebuildkitcontainerd--nowsystemctlstatusbuildkitcontainerd3)安装buildkit支持构建镜像buildkitGitHub地址:https://github。com/moby/buildkit不能直接通过containerd使用简化版的nerdctl构建镜像,需要结合buildkit来实现镜像构建。当然你也可以安装上面完整的nerdctl;buildkit项目是Docker开源的构建工具包,支持OCI标准镜像构建。主要包括以下几个部分:服务端buildkitd,目前支持runc和containerd作为worker,默认是runc;client-sidebuildctl,负责解析Dockerfile并将构建请求发送到server-sidebuildkitd。buildkit是典型的C/S架构,client和server不一定在同一台服务器上。而nerdctl在构建镜像方面也可以作为buildkitd的客户端。#https://github.com/moby/buildkit/releaseswgethttps://github.com/moby/buildkit/releases/download/v0.10.4/buildkit-v0.10.4.linux-amd64.tar.gztar-xfbuildkit-v0.10.4.linux-amd64.tar.gz-C/usr/local/配置buildkit的启动文件,可以从这里下载:https://github.com/moby/buildkit/tree/master/examples/systemdbuildkit需要配置两个文件/usr/lib/systemd/system/buildkit.socketcat>/usr/lib/systemd/system/buildkit.socket</usr/lib/systemd/system/buildkit.service</etc/containerd/config.toml配置如下:containerd.grpc.v1.cri".registry]config_path=""[plugins."io.containerd.grpc.v1.cri".registry.auths][plugins."io.containerd.grpc.v1.cri".registry.configs][插件。"io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".tls]insecure_skip_verify=true#skipauthenticationca_file="/etc/containerd/myharbor-minio.com/ca.crt"[plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".auth]username="admin"password="Harbor12345"[plugins."io.containerd.grpc.v1.cri".registry.headers][plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor-minio.com"]endpoint=["https://myharbor-minio.com"]restartcontainerd#reloadconfigurationsystemctldaemon-reload#restartcontainerrdsystemctlrestartcontainerd注意:此配置文件用于crictl和kubelet。Ctr不能使用这个配置文件。CTR不使用CRI,因此它不读取插件。"io.containerd.grpc.v1.cri"配置2)ctrpullandpushimage#Pushimagetoharborctr--namespace=k8s.ioimagespushmyharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0--skip-verify--useradmin:Harbor12345#--namespace=k8s.io指定命名空间,不是必须的,视环境而定#--skip-verify跳过认证#--user指定harbor用户名和密码ctr图像pull--useradmin:Harbor12345--tlscacert=/etc/containerd/myharbor-minio.com/ca.crtmyharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0不想-uuser:password每次都必须用ctrpull/ctrpush,可以用nerdctl。3)镜像构建cat>Dockerfile</usr/share/nginx/html/index.htmlEOF然后在文件所在目录执行镜像构建命令:#Do不加-n指定nameSpace,crictl看不到,kubelet也用不了。默认在默认命名空间下nerdctl-nk8s.iobuild-tnginx:nerctl-f./Dockerfile.###参数说明#-t:指定镜像名称#。:当前目录Dockerfile#-f:specifyDockerfilepath#--no-cache:nocache4)tagtag#crictl没有tag命令,只能用nerdctl和ctr,必须指定namespace,否则kubelet不能用过的。ctr-nk8s.ioitagnerdctl-nk8s.io标签nginx:nerctlmyharbor-minio.com/bigdata/nginx:nerctl#ctr-nk8s.io标签nginx:nerctlmyharbor-minio.com/bigdata/nginx:nerctl#查看镜像nerdctl-nk8s.ioimagesmyharbor-minio.com/bigdata/nginx:nerctl5)将镜像推送到Harbor第一种情况:http方式,配置如下:#以下两种任选其一即可#mkdir-p/etc/docker/certs.d/myharbor-minio.com:443mkdir-p/etc/containerd/certs.d/myharbor-minio.com:443cat>/etc/containerd/certs.d/myharbor-minio.com\:443/hosts.toml</etc/containerd/certs.d/myharbor-minio.com\:443/hosts.toml<