containerd 基本使用

基于nerdctl + buildkitd+containerd构建容器镜像

版本

  • ctr containerd.io 1.6.18
  • crictl version v1.26.0
  • buildkit-v0.11.4.linux-amd64.tar.gz
  • nerdctl version 1.2.1
Containerd和Docker在命令使用上的一些区别

在这里插入图片描述

通过buildkit工具来构建containerd 镜像

链接:https://blog.csdn.net/omaidb/article/details/128673207
https://www.cnblogs.com/gdcplasf/p/16438612.html

下载安装 buildkit
https://github.com/moby/buildkit/releases

创建buildkit对应目录,解压buildkit 安装包到指定路径
[root@k8s-master /]# mkdir -p /usr/local/containerd/
[root@k8s-master /]# tar -xvf buildkit-v0.11.0.linux-amd64.tar.gz -C /usr/local/containerd/

cp /usr/local/containerd/bin/buildctld /usr/local/bin  #复制buildkitd 到 /usr/bin

buildctl -version 验证安装

-----------------------------------
# 编写 buildkit 套接字文件
cat >> /lib/systemd/system/buildkitd.socket << EOF
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Socket]
ListenStream=%t/buildkit/buildkitd.sock

[Install]
WantedBy=sockets.target

EOF
-----------------------------------

三、安装buildkitd 服务
cp /usr/local/containerd/bin/buildkitd /usr/local/bin/

#配置 systemd 服务,编写systemd unit文件
[root@k8s-master /]# vi /usr/lib/systemd/system/buildkit.service
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Service]
ExecStart=/usr/local/containerd/bin/buildkitd --oci-worker=false --containerd-worker=true

[Install]
WantedBy=multi-user.target


#启用buildkit.service并设置开机自动运行
systemctl daemon-reload # 重载服务
systemctl enable --now buildkit.service # 启用buildkit.service 并设置开机自动运行
systemctl daemon-reload && systemctl restart buildkitd && systemctl enable buildkitd
systemctl status buildkit # 查看运行状态

nerdctl

Containerd 官方推出了一个新的 CLI 叫 nerdctl。Containerd高级命令行工具nerdctl。
nerdctl 的目标并不是单纯地复制 docker 的功能,它还实现了docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等。

下载地址 https://developer.aliyun.com/article/1094835

# 下载nerdctl到指定目录
## -c 断点续传, -P 下载到指定目录
wget -c -P /usr/local/ https://github.com/containerd/nerdctl/releases/download/v1.2.1/nerdctl-1.2.1-linux-amd64.tar.gz
# 创建nerdctl对应bin目录
mkdir -p /usr/local/containerd/bin
# 解压nerdctl到指定路径
tar -xvf nerdctl-1.1.0-linux-amd64.tar.gz -C /usr/local/containerd/bin/
# 创建软链接
ln -s /usr/local/containerd/bin/nerdctl /usr/local/bin/nerdctl
# 查看是否安装成功
which nerdctl
------------------------------------------------------------
[root@k8s-master bin]# nerdctl --version
nerdctl version 1.2.1

[root@k8s-master bin]# nerdctl version
Client:
 Version:	v1.2.1
 OS/Arch:	linux/amd64
 Git commit:	a0bbfd75ba92bcb11ac6059bf4f6f4e50c6da0b8
 buildctl:
  Version:	v0.11.4
  GitCommit:	3abd1ef0c195cdc078d1657cb50f62a2cdc26f8f

Server:
 containerd:
  Version:	1.6.18
  GitCommit:	2456e983eb9e37e47538f59ea18f2043c9a73640
 runc:
  Version:	1.1.4
  GitCommit:	v1.1.4-0-g5fd4c4d
------------------------------------------------------------

1、容器管理

nerdctl run # 运行容器
nerdctl exec # 进入容器
nerdctl ps #列出容器
nerdctl inspect #获取容器的详细信息。
nerdctl logs #获取容器日志
nerdctl stop #停止容器
nerdctl rm #删除容器

3、镜像管理
nerdctl images #镜像列表
nerdctl -n k8s.io image ls

nerdctl pull #拉取镜像
nerdctl push #推送镜像
nerdctl tag #镜像标签
nerdctl save #导出镜像
nerdctl rmi #删除镜像
nerdctl load #导入镜像

#镜像构建(安装buildkit)
nerdctl build -t 构建目录

#从 Dockerfile 构建镜像
nerdctl build #其实是使用了 buildctl 命令来构建镜像

# 构建镜像时不使用缓存(默认值:false)
nerdctl build --no-cache 

nerdctl ns ls 查看名字空间,这和K8s的名字空间不是一回事,其中default就是containerd的默认名字空间,http://k8s.io是K8s的名字空间

#查看网络
[root@k8s-master /]# nerdctl network ls
NETWORK ID    NAME    FILE
              cbr0    /etc/cni/net.d/10-flannel.conf
              cbr0    /etc/cni/net.d/10-flannel.conflist
              host    
              none 

containerd的本地CLI工具ctr命令

命令介绍:
ctr:是containerd本身的CLI
crictl :是Kubernetes社区定义的专门CLI工具

containerd安装

yum list | grep containerd

容器运行时containerd安装配置
https://blog.csdn.net/rendongxingzhe/article/details/124595415

ctr 命令

ctr -v 和 crictl -v
[root@k8s-master ~]# ctr -v
ctr containerd.io 1.6.18

[root@k8s-master ~]# containerd -v
containerd containerd.io 1.6.18 2456e983eb9e37e47538f59ea18f2043c9a73640

#crictl -v 输出的是当前 k8s 的版本,可以认为 crictl 是用于 k8s 的。
[root@k8s-master containerd]# crictl -v
crictl version v1.26.0

镜像操作

ctr images list  或者 crictl images  #1.查看本地镜像列表
ctr images ls  查看导入的镜像

 #拉取镜像
ctr image  pull docker.io/jenkins/jenkins:lts

# 6.删除本地镜像
ctr images ls
ctr i ls -q # 查看容器名称列表
# 导出
ctr images export busybox-1.28.tar.gz docker.io/library/busybox:1.28
# 删除
[root@node1 ~]# ctr images rm docker.io/library/busybox:1.28
docker.io/library/busybox:1.28
# 导入
[root@node1 ~]# ctr images import busybox-1.28.tar.gz 


[root@master containerd]# ctr image --help
NAME:
   ctr images - manage images
USAGE:
   ctr images command [command options] [arguments...]
COMMANDS:
   check                    check existing images to ensure all content is available locally
   export                   export images
   import                   import images
   list, ls                 list images known to containerd
   mount                    mount an image to a target path
   unmount                  unmount the image from the target
   pull                     pull an image from a remote
   push                     push an image to a remote
   delete, del, remove, rm  remove one or more images by reference
   tag                      tag an image
   label                    set and clear labels for an image
   convert                  convert an image

11.查看containerd默认命名空间 
[root@k8s-master manifests]# ctr namespace ls
NAME   LABELS 
k8s.io        
moby

ctr 用命名空间 namespace 来指定类似于工作空间的隔离区域。使用方法 ctr -n default images ls来查看 default 命名空间的镜像,不加 -n 参数,默认也是使用 default 的命名空间。

12.查看默认名称空间下镜像
REF                                                                           TYPE                                                      DIGEST                                                                  SIZE      PLATFORMS                                                                        LABELS                          
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.26.1        application/vnd.docker.distribution.manifest.list.v2+json sha256:85f705e7d98158a67432c53885b0d470c673b0fad3693440b45d07efebcda1c3 20.5 MiB  linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x                   io.cri-containerd.image=managed
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6                 application/vnd.docker.distribution.manifest.list.v2+json sha256:3d380ca8864549e74af4b29c10f9cb0956236dfb01c40ca076fb6c37253234db 294.7 KiB linux/amd64,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x,windows/amd64     io.cri-containerd.image=managed
4.运行容器,基于containerd

https://www.cnblogs.com/yangmeichong/p/16661444.html

# 查看容器在宿主机的PID
[root@moban containerd]# ctr task ls
TASK          PID     STATUS    
busybox-v1    3914    RUNNING
# 删除容器
# 先停止容器再删除
[root@moban containerd]# ctr task kill --signal 9 jenkins
[root@moban containerd]# ctr task ls
TASK PID STATUS
busybox-v1 4233 STOPPED

# 删除容器
ctr task rm -f jenkins

三、crictl 命令

安装 k8s 后,命令行才会有 crictl 命令。


[root@k8s-master containerd]# crictl ps  显示运行的容器列表

CONTAINER           IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID              POD
534cd8cf47936       e9c08e11b07f6       7 days ago          Running             kube-controller-manager   0                   cd0b94604efe5       kube-controller-manager-k8s-master
29f4d8e77d817       fce326961ae2d       7 days ago          Running             etcd                      0                   1590d35e04aff       etcd-k8s-master
af18b87b9297c       655493523f607       7 days ago          Running             kube-scheduler            0                   20f08e8387045       kube-scheduler-k8s-master
6b71a949ca15f       deb04688c4a35       7 days ago          Running             kube-apiserver            0                   c2c699bdd5bc2       kube-apiserver-k8s-master

关于 crictl ps 报错 runtime connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]

crictl依次查找容器运行时,当查找第一个unix:///var/run/dockershim.sock 没有找到,需要手动指定当前k8s的容器运行时,例如:
kubernetes 1.24+ 之后,如果dockershim已经变成了cri-docker,所以你需要执行:
crictl config runtime-endpoint unix:///var/run/cri-dockerd.sock

如果你的容器运行时,已经换成了containerd,则执行:
crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock

另外:生成的配置在cat /etc/crictl.yaml,可以随时修改。

a

# 5.显示运行的容器列表
crictl ps 
# 7. 查看容器资源情况
crictl stats 
# 8.登录容器平台
crictl exec 
# 9.容器启动和停止
crictl start/stop
# 10.查看容器日志
crictl logs 

containerd的组件

containerd提供包括容器的运行、测试、发布和接口调用的工具。

在这里插入图片描述

containerd和k8s的关系

kubelet通过grpc协议和containerd交互。k8s规定了这个交互的规范,这就是大名鼎鼎的CRI。这里我们理解CRI为一个k8s定义的接口。它定义在 k8s.io/cri-api 中。只要实现了这套规范,就可以成为k8s的容器运行时。

Containerd 创建一个容器时会创建一个containerd-shim进程,然后container-shim进程创建业务进程。
对于k8s中的pod,可以通过containerd创建一个pause 容器,然后创建业务容器,这两个容器共享特定的namespace即可

docker-containerd的作用

1.创建容器记录的metadata
2.请求 containerd 的 task 模块,task 模块会在 runtime 中创建 task 实例,分别会加入 task list, 监控 cgroup 等操作
3.每个 task 实例则调用 shim 去创建container

k8s使用containerd具体原因:

使用 containerd 作为K8S 容器运行时, kubelet 可以直接调用 containerd。(调用链变短了)

如果你使用 Docker作为 K8S 容器运行时,kubelet 需先通过 dockershim 去调用 Docker,再通过 Docker 去调用containerd。
如果你使用 containerd 作为K8S 容器运行时的话, kubelet 可以直接调用 containerd。
使用 containerd 不仅性能提高了(调用链变短了),而且资源占用也会变小(Docker 不是一个纯粹的容器运行时,具有大量其他功能)。

调用链
Docker 作为 k8s 容器运行时,调用关系如下:
kubelet -> docker shim(在 kubelet 进程中)-> dockerd -> containerd

Containerd 作为 k8s 容器运行时,调用关系如下:
kubelet --> cri plugin(在 containerd 进程中) --> containerd
使用 containerd 作为K8S 容器运行时, kubelet 可以直接调用 containerd。
Containerd的运行优势
  • container和docker不同,containerd重点是继承在大规模的系统中,例如kubernetes,而不是面向开发者,让开发者使用,更多的是容器运行时的概念,承载容器运行。
  • 官方提供sdk,可以在工程中实现镜像、容器得全部操作。
  • 从k8s的角度看,可以选择 containerd 或 docker 作为运行时组件:其中 containerd 调用链更短,组件更少,更稳定,占用节点资源更少。
  • containerd 相比于docker 多了 namespace 概念,每个 image 和 container 都会在各自的namespace下可见。
Containerd 启动流程
Docker和 Containerd 的区别

Docker 包含 Containerd,Containerd 专注于运行时的容器管理,而 Docker 除了容器管理之外,还可以完成镜像构建之类的功能。
Containerd 提供的 API 偏底层,不是给普通用户直接用的,容器编排的开发者才需要Containerd。

containerd 相比于docker , 多了namespace概念, 每个image和container 都会在各自的namespace下可见, 目前k8s会使用k8s.io 作为命名空间

在这里插入图片描述

Containerd常用命令
1.查看容器运行状态

# 1.ctr
ctr container ls
#指定命名空间
ctr --namespace=k8s.io container ls
 
# 2.crictl
crictl ps
 
# 3.nerdctl
nerdctl ps
2.查看镜像

# 1.ctr
ctr image ls
#指定命名空间
ctr --namespace=k8s.io image ls
 
# 2.crictl
crictl image
 
# 3.nerdctl
nerdctl image

3.查看容器日志
#ctr 没有相关命令
crictl logs
nerdctl logs

4.修改镜像标签
ctr image tag
# crictl 没有相关命令
nerdctl tag

5.导出镜像
ctr image export
crictl 没有相关命令
nerdctl save

6.导入镜像
ctr image import
# crictl 没有相关命令
nerdctl load

7.删除镜像
ctr image rm
crictl rmi
nerdctl rmi

8.拉取镜像
ctr image pull
crictl pull
nerdctl pull

9.推送镜像
ctr image push
 
# crictl 没有相关命令
 
nerdctl push
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值