电脑故障问答网

 找回密码
 立即注册
查看: 80|回复: 1

Containerd ctr、crictl、nerdctl 客户端命令介绍与实战操作

[复制链接]

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2022-9-23 17:50:20 | 显示全部楼层 |阅读模式
一、概述

作为接替 Docker 运行时的 Containerd 在早在 Kubernetes1.7 时就能直接与 Kubelet 集成使用,只是大部分时候我们因熟悉 Docker,在部署集群时采用了默认的 dockershim。在V1.24起的版本的 kubelet 就彻底移除了dockershim,改为默认使用Containerd了,当然也使用cri-dockerd适配器来将Docker Engine与 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如下:
runtime-endpoint:unix:///run/containerd/containerd.sock image-endpoint:unix:///run/containerd/containerd.sock timeout:10 debug:false
也可以通过命令进行设置:
crictlconfigruntime-endpointunix:///run/containerd/containerd.sock crictlconfigimage-endpointunix:///run/containerd/containerd.sock
更多命令操作,可以直接在命令行输入命令查看帮助。
docker--help ctr--help crictl--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导入镜像的时候特别注意一点,最好指定命名空间。
#注意-n不能放在命令最后面,下面几行查看的镜像是一样的 ctr-n=k8s.ioimagels ctr-nk8s.ioimagels # crictl 没有-n参数,操作都在`k8s.io`命名空间下。 crictlimagels crictlimages #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 #查看镜像,可以看到可以查询到了 crictlimages


三、containerd 客户端工具 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。



延迟拉取镜像功能可以参考这篇文章:Containerd 使用 Stargz Snapshotter 延迟拉取镜像
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 #解压 tar-xfnerdctl-0.22.2-linux-amd64.tar.gz ln-s/opt/k8s/nerdctl/nerdctl/usr/local/bin/nerdctl
2)安装 nerdctl(完整版,这里不装)

wgethttps://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-full-0.22.2-linux-amd64.tar.gz tar-xfnerdctl-full-0.16.0-linux-amd64.tar.gz-C/usr/local/ cp/usr/local/lib/systemd/system/*.service/etc/systemd/system/
启动服务 buildkit
systemctlenablebuildkitcontainerd--now systemctlstatusbuildkitcontainerd
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 的客户端。
#https://github.com/moby/buildkit/releases wgethttps://github.com/moby/buildkit/releases/download/v0.10.4/buildkit-v0.10.4.linux-amd64.tar.gz tar-xfbuildkit-v0.10.4.linux-amd64.tar.gz-C/usr/local/
配置 buildkit 的启动文件,可以从这里下载:
https://github.com/moby/buildkit/tree/master/examples/systemd
buildkit 需要配置两个文件

  • /usr/lib/systemd/system/buildkit.socket
cat>/usr/lib/systemd/system/buildkit.socket<<EOF [Unit] Description=BuildKit Documentation=https://github.com/moby/buildkit [Socket] ListenStream=%t/buildkit/buildkitd.sock SocketMode=0660 [Install] WantedBy=sockets.target EOF

  • /usr/lib/systemd/system/buildkit.service
cat>/usr/lib/systemd/system/buildkit.service<<EOF [Unit] Description=BuildKit Requires=buildkit.socket After=buildkit.socket Documentation=https://github.com/moby/buildkit [Service] #Replaceruncbuildswithcontainerdbuilds ExecStart=/usr/local/bin/buildkitd--addrfd:// [Install] WantedBy=multi-user.target EOF
启动 buildkit
systemctldaemon-reload systemctlenablebuildkit--now


四、实战操作

1)修改 containerd 配置文件

可以参考我之前的文章:
containerdconfigdefault>/etc/containerd/config.toml
配置如下:
[plugins."io.containerd.grpc.v1.cri".registry] config_path="" [plugins."io.containerd.grpc.v1.cri".registry.auths] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".tls] insecure_skip_verify=true#跳过认证 ca_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"]



重启 containerd
#重新加载配置 systemctldaemon-reload #重启containerd systemctlrestartcontainerd
注意:这个配置文件是给crictl和kubelet使用,ctr是不可以用这个配置文件的,ctr 不使用 CRI,因此它不读取 plugins."io.containerd.grpc.v1.cri"配置。
2)ctr 拉取推送镜像

#推送镜像到harbor ctr--namespace=k8s.ioimagespushmyharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0--skip-verify--useradmin:Harbor12345 #--namespace=k8s.io指定命名空间,不是必须,根据环境而定 #--skip-verify跳过认证 #--user指定harbor用户名及密码 ctrimagespull--useradmin:Harbor12345--tlscacert=/etc/containerd/myharbor-minio.com/ca.crtmyharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0
不想-u user:password 每次必须使用 ctr pull/ctr push, 可以使用nerdctl。
3)镜像构建

cat>Dockerfile<<EOF FROMnginx:alpine RUNecho'HelloNerdctlFromContainerd'>/usr/share/nginx/html/index.html EOF
然后在文件所在目录执行镜像构建命令:
#不加-n指定命名空间,crictl看不到,kubelet也不能使用它,默认在default命名空间下 nerdctl-nk8s.iobuild-tnginx:nerctl-f./Dockerfile. ###参数解释 #-t:指定镜像名称 # . :当前目录Dockerfile #-f:指定Dockerfile路径 #--no-cache:不缓存


4)打标签 tag

# crictl没有tag命令,只能使用nerdctl和ctr,必须指定命名空间,要不然kubelet无法使用。 ctr-nk8s.ioitag nerdctl-nk8s.iotagnginx:nerctlmyharbor-minio.com/bigdata/nginx:nerctl #ctr-nk8s.iotagnginx:nerctlmyharbor-minio.com/bigdata/nginx:nerctl #查看镜像 nerdctl-nk8s.ioimagesmyharbor-minio.com/bigdata/nginx:nerctl
5)将镜像推送到 Harbor

第一种情况:http方式,配置如下:
#以下两个哪个都可以 #mkdir-p/etc/docker/certs.d/myharbor-minio.com:443 mkdir-p/etc/containerd/certs.d/myharbor-minio.com:443 cat>/etc/containerd/certs.d/myharbor-minio.com\:443/hosts.toml<<EOF server="https://docker.io" [host."http://myharbor-minio.com:80"] capabilities=["pull","resolve","push"] #skip_verify=true #ca="ca.crt"#相对路径 #ca="/opt/auth/ca.crt"#绝对路径 #ca=["/opt/auth/ca.crt"] #ca=["ca.crt"] #client=[["/opt/auth/nginx.cclinux.cn.crt","/opt/auth/nginx.cclinux.cn.key"]] EOF
第一种情况:https方式,配置如下:
#以下两个哪个都可以 #mkdir-p/etc/docker/certs.d/myharbor-minio.com:443 mkdir-p/etc/containerd/certs.d/myharbor-minio.com:443 cat>/etc/containerd/certs.d/myharbor-minio.com\:443/hosts.toml<<EOF server="https://docker.io" [host."https://myharbor-minio.com:443"] capabilities=["pull","resolve","push"] skip_verify=true #ca="ca.crt"#相对路径 #ca="/opt/auth/ca.crt"#绝对路径 #ca=["/opt/auth/ca.crt"] ca=["/etc/containerd/myharbor-minio.com/ca.crt"] #client=[["/opt/auth/nginx.cclinux.cn.crt","/opt/auth/nginx.cclinux.cn.key"]] EOF
通过 nerdctl 登录 harbor
echoHarbor12345|nerdctllogin--username"admin"--password-stdinmyharbor-minio.com:443 #nerdctllogin--username"admin"--passwordHarbor12345myharbor-minio.com:443 #登出 #nerdctllogout


开始将镜像推送到 harbor
###推送到Harbor #--insecure-registryskipsverifyingHTTPScerts,andallowsfallingbacktoplainHTTP nerdctl--insecure-registry--namespace=k8s.iopushmyharbor-minio.com/bigdata/nginx:nerctl #ctr--namespace=k8s.ioimagespushmyharbor-minio.com/bigdata/nginx:nerctl--skip-verify--useradmin:Harbor12345 #--namespace=k8s.io指定命名空间,跟-n一样,不是必须,根据环境而定 #--skip-verify跳过认证 #--user指定harbor用户名及密码


Containerd ctr,crictl,nerdctl 客户端命令介绍与实战操作就到这里了,有疑问的小伙伴欢迎给我留言哦!
链接:https://www.cnblogs.com/liugp/p/16633732.html

(版权归原作者所有,侵删)

<hr/>免责声明:本文内容来源于网络,所载内容仅供参考。转载仅为学习和交流之目的,如无意中侵犯您的合法权益,请及时联系Docker中文社区!
<hr/>
回复

使用道具 举报

0

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2025-3-6 19:05:02 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

云顶设计嘉兴有限公司模板设计.

免责声明:本站上数据均为演示站数据,如购买模板可以上DISCUZ应用中心购买,欢迎惠顾.

云顶官方站点:云顶设计 模板原创设计:云顶模板   Powered by Discuz! X3.4© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表