k8s系列-06-containerd的基本操作

非淡泊无以明志,非宁静无以致远。这篇文章主要讲述k8s系列-06-containerd的基本操作相关的知识,希望能为你提供帮助。
??声明:本文乃“运维家”原创,转载请注明出处,更多内容请关注公众号“运维家”。??



??主旨??
上一篇我们介绍了containerd的安装,本篇我们来简单介绍下如何进行使用。


??环境??

linux服务器



??前置安装??
【k8s系列-06-containerd的基本操作】躺过的坑,需要安装下面内容,否则执行ctr run的时候会报错如下:
ctr: failed to create shim task: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v2.task/default/redis/log.json: no such file or directory): runc did not terminate successfully: exit status 127: runc: symbol lookup error: runc: undefined symbol: seccomp_notify_respond
: unknown



这个是说缺少依赖包 libseccomp ,需要注意的是centos 7中yum下载的版本是2.3的,版本不满足我们最新containerd的需求,需要下载2.4以上的,故而我这里提供一个2.5.1的版本,公众号“运维家”后台回复“libseccomp”即可获得下载地址。
卸载旧版本:
[yunweijia@localhost ~]$ sudo rpm -qa | grep libseccomp
libseccomp-devel-2.3.1-4.el7.x86_64
libseccomp-2.3.1-4.el7.x86_64
[yunweijia@localhost ~]$ sudo rpm -e libseccomp-devel-2.3.1-4.el7.x86_64 --nodeps
[yunweijia@localhost ~]$ sudo rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps



安装新版本:
[yunweijia@localhost ~]$ sudo rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm



查看现有版本:
[yunweijia@localhost ~]$ sudo rpm -qa | grep libseccomp
libseccomp-2.5.1-1.el8.x86_64
[yunweijia@localhost ~]$



??查看帮助??
# 查看总帮助
[yunweijia@localhost ~]$ ctr -h

# 查看子命令的帮助,举例子如下
[yunweijia@localhost ~]$ ctr i -h



??下载镜像??
# 和docker的差异点需要注意下,他需要你输入完整的地址
[yunweijia@localhost ~]$ sudo ctr i pull docker.io/library/redis:alpine

# 查看现有镜像
[yunweijia@localhost ~]$ sudo ctr i ls



??命名空间??
[yunweijia@localhost ~]$ ctr ns -h
NAME:
ctr namespaces - manage namespaces

USAGE:
ctr namespaces command [command options] [arguments...]

COMMANDS:
create, ccreate a new namespace
list, lslist namespaces
remove, rmremove one or more namespaces
labelset and clear labels for a namespace

OPTIONS:
--help, -hshow help

[yunweijia@localhost ~]$ sudo ctr ns ls
NAMELABELS
default
moby
[yunweijia@localhost ~]$



从上面可以看到我们在没有创建命名空间的时候,直接就有两个命名空间,这是为什么呢?正常情况下哈,containerd下只有一个default空间,我这里出现了两个命名空间是因为我这台服务器之前安装过docker,所以可以看出来docker默认的命名空间是moby。
那么我们看下docker下载的镜像,是不是会在命名空间中显示呢,以及我们上面通过ctr命令下载的镜像会不会在docker images中显示,如下:
[yunweijia@localhost ~]$ sudo ctr i ls
REFTYPEDIGESTSIZEPLATFORMSLABELS
docker.io/library/redis:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:4bed291aa5efb9f0d77b76ff7d4ab71eee410962965d052552db1fb80576431d 10.4 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -
[yunweijia@localhost ~]$
[yunweijia@localhost ~]$ sudo docker images
REPOSITORYTAGIMAGE IDCREATEDSIZE
yunweijiajenkins976d65da21b93 weeks ago874MB
192.168.112.130/yunwei/yunweijiapython331255eafafc33 weeks ago662MB
yunweijiapython331255eafafc33 weeks ago662MB
redislatestf1b6973564e95 weeks ago113MB
nginxlatestc316d5a335a55 weeks ago142MB
[yunweijia@localhost ~]$
[yunweijia@localhost ~]$ sudo ctr -n moby i ls
REF TYPE DIGEST SIZE PLATFORMS LABELS
[yunweijia@localhost ~]$ sudo ctr -n default i ls
REFTYPEDIGESTSIZEPLATFORMSLABELS
docker.io/library/redis:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:4bed291aa5efb9f0d77b76ff7d4ab71eee410962965d052552db1fb80576431d 10.4 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -
[yunweijia@localhost ~]$



从上面的执行结果,可以得出结论,ctr下载的镜像不会在docker中显示;同样的,docker下载的镜像,也不会通过moby命名空间来显示出来。


??docker镜像-> ctr镜像??
可以通过docker tag命令打个标签,然后再push到自己的harbor仓库中,再之后通过ctr i pull 命令进行下载,经过验证是可行的,此处就不再做演示了,有兴趣的小伙伴可以自行验证,harbor仓库的搭建,在我之前的文章中有写,可以翻看历史文章。


??容器操作??
c:代表container
t:代表task,和“-t”不要混淆哈,他俩完全不一样
# 启动容器
[yunweijia@localhost ~]$ sudo ctr run -t -d docker.io/library/redis:alpine redis

# 查看进程
[yunweijia@localhost ~]$ sudo ctr c ls
CONTAINERIMAGERUNTIME
redisdocker.io/library/redis:alpineio.containerd.runc.v2
[yunweijia@localhost ~]$

# 查看状态
[yunweijia@localhost ~]$ sudo ctr t ls
TASKPIDSTATUS
redis86082RUNNING
[yunweijia@localhost ~]$]$

# 停止运行中的任务
[yunweijia@localhost ~]$ sudo ctr t kill redis
[yunweijia@localhost ~]$ sudo ctr t ls
TASKPIDSTATUS
redis86082STOPPED
[yunweijia@localhost ~]$

# 删除停止状态的任务
[yunweijia@localhost ~]$ sudo ctr t delete redis
[yunweijia@localhost ~]$ sudo ctr t ls
TASKPIDSTATUS
[yunweijia@localhost ~]$

# 删除容器,我们上面删除的只是容器运行的任务
[yunweijia@localhost ~]$ sudo ctr c ls
CONTAINERIMAGERUNTIME
redisdocker.io/library/redis:alpineio.containerd.runc.v2
[yunweijia@localhost ~]$ sudo ctr c delete redis
[yunweijia@localhost ~]$ sudo ctr c ls
CONTAINERIMAGERUNTIME
[yunweijia@localhost ~]$



??CRICTL??
这个很重要,后面我们会经常使用这个命令,这个是k8s提供给我们的一个容器操作命令,类似于docker,且常用命令和docker也是非常相似的,我们下面看看。
[yunweijia@localhost ~]$ sudo crictl images
IMAGETAGIMAGE IDSIZE
[yunweijia@localhost ~]$ sudo crictl ps
CONTAINERIMAGECREATEDSTATENAMEATTEMPTPOD ID
[yunweijia@localhost ~]$ sudo crictl pods
POD IDCREATEDSTATENAMENAMESPACEATTEMPTRUNTIME
[yunweijia@localhost ~]$ sudo crictl ps -a
CONTAINERIMAGECREATEDSTATENAMEATTEMPTPOD ID
[yunweijia@localhost ~]$



以上命令除了pods之外,别的是不是全部是docker所拥有的命令,我们再使用帮忙命令看下,会更加细致,在这里就不进行演示结果了,太多,命令如下:
[yunweijia@localhost ~]$ sudo crictl -h



声明一下,为什么使用crictl命令的时候查不到镜像,因为他使用的命名空间是k8s.io,这个原理和docker是一样的,总的图如下:



至此,本文结束,还是要多多锻炼、实践。



    推荐阅读