【云原生】Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )

一、概述

作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockershim。在 V1.24起的版本的kubelet就彻底移除了 dockershim,改为默认使用 Containerd了,当然也可以使用 cri-dockerd 适配器来将 Docker Engine 与 Kubernetes 集成。可以参考官方文档

【云原生】Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )

二、Containerd 常见命令操作

更换Containerd后,以往我们常用的docker命令也不再使用,取而代之的分别是 crictlctr 两个命令客户端。

  • crictl 是遵循CRI接口规范的一个命令行工具,通常用它来检查和管理 kubelet节点上的容器运行时和镜像。
  • ctrcontainerd 的一个客户端工具。
  • 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

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:d7106863-545c-42fe-bc4e-b04a847aeb8c

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:e2b41d77-70be-47b4-85e1-02675a90b8cb

crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl 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

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:63ccc6f2-e892-4445-bbca-a0fd90e5b7e3

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:453e8991-162e-43cf-a6cd-d4460b6abeb9

docker --help
ctr --help
crictl --help

由于Containerd也有namespaces的概念,对于上层编排系统的支持, ctr 客户端 主要区分了3个命名空间分别是 k8s.iomobydefault,以上我们用 crictl操作的均在 k8s.io命名空间,使用 ctr 看镜像列表就需要加上-n参数。crictl是只有一个 k8s.io命名空间,但是没有-n参数。

【温馨提示】ctr images pull 拉取的镜像默认放在 default,而crictl pull 和 kubelet 默认拉取的镜像都在k8s.io命名空间下。所以通过 ctr导入镜像的时候特别注意一点,最好指定命名空间。

注意-n不能放在命令最后面,下面几行查看的镜像是一样的
ctr -n=k8s.io image ls
ctr -n k8s.io image ls

crictl 没有-n参数,操作都在k8s.io命名空间下。
crictl image ls
crictl images
crictl image list = ctr -n=k8s.io image list
crictl image ls = ctr -n=k8s.io image ls
crictl images = ctr -n=k8s.io image list
crictl images = ctr -n=k8s.io image ls

使用ctr命令指定命名空间导入镜像
ctr -n=k8s.io image import dashboard.tar

#查看镜像,可以看到可以查询到了
crictl images

【云原生】Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )

三、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。

【云原生】Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )
延迟拉取镜像功能可以参考这篇文章:Containerd 使用 Stargz Snapshotter 延迟拉取镜像

1)安装 nerdctl(精简版)

wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz
解压
tar -xf nerdctl-0.22.2-linux-amd64.tar.gz

ln -s /opt/k8s/nerdctl/nerdctl /usr/local/bin/nerdctl

2)安装 nerdctl(完整版,这里不装)

wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-full-0.22.2-linux-amd64.tar.gz
tar -xf nerdctl-full-0.16.0-linux-amd64.tar.gz -C /usr/local/

cp /usr/local/lib/systemd/system/*.service /etc/systemd/system/

启动服务buildkit

systemctl enable  buildkit containerd --now
systemctl status buildkit containerd

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
wget https://github.com/moby/buildkit/releases/download/v0.10.4/buildkit-v0.10.4.linux-amd64.tar.gz

tar -xf buildkit-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 <
  • /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]
Replace runc builds with containerd builds
ExecStart=/usr/local/bin/buildkitd --addr fd://
[Install]
WantedBy=multi-user.target
EOF

启动buildkit

systemctl daemon-reload
systemctl enable buildkit --now

【云原生】Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )

四、实战操作

1)修改containerd配置文件

可以参考我之前的文章:【云原生.大数据】镜像仓库Harbor对接MinIO对象存储

containerd config default > /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 ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )
重启containerd
#重新加载配置
systemctl daemon-reload
#重启containerd
systemctl restart containerd

注意:这个配置文件是给 crictlkubelet使用, ctr是不可以用这个配置文件的,ctr 不使用 CRI,因此它不读取plugins.”io.containerd.grpc.v1.cri”配置。

2)ctr 拉取推送镜像

推送镜像到harbor
ctr --namespace=k8s.io images push myharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0 --skip-verify --user admin:Harbor12345

--namespace=k8s.io 指定命名空间,不是必须,根据环境而定
--skip-verify 跳过认证
--user 指定harbor用户名及密码

ctr  images pull --user admin:Harbor12345  --tlscacert=/etc/containerd/myharbor-minio.com/ca.crt myharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0

不想-u user:password每次必须使用 ctr pull/ctr push, 可以使用 nerdctl

3)镜像构建

cat > Dockerfile < /usr/share/nginx/html/index.html
EOF

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:0bade81a-488c-4868-b9a9-064d037b97b9

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:216877e0-e560-4336-b27a-b13c43fcf934

不加-n指定命名空间,crictl看不到,kubelet也不能使用它,默认在default命名空间下
nerdctl -n k8s.io build -t nginx:nerctl -f ./Dockerfile .
### 参数解释
-t:指定镜像名称
. :当前目录Dockerfile
-f:指定Dockerfile路径
 --no-cache:不缓存

【云原生】Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )

4)打标签 tag

crictl没有tag命令,只能使用nerdctl和ctr,必须指定命名空间,要不然kubelet无法使用。
ctr -n k8s.io i tag
nerdctl -n k8s.io tag nginx:nerctl myharbor-minio.com/bigdata/nginx:nerctl
ctr -n k8s.io tag nginx:nerctl myharbor-minio.com/bigdata/nginx:nerctl
查看镜像
nerdctl  -n k8s.io  images myharbor-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 <

第一种情况: 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 <

通过 nerdctl 登录 harbor

echo Harbor12345 | nerdctl login --username "admin" --password-stdin  myharbor-minio.com:443

nerdctl login --username "admin" --password Harbor12345 myharbor-minio.com:443

登出
nerdctl logout

【云原生】Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )

开始将镜像推送到harbor

### 推送到Harbor
--insecure-registry        skips verifying HTTPS certs, and allows falling back to plain HTTP
nerdctl --insecure-registry --namespace=k8s.io push myharbor-minio.com/bigdata/nginx:nerctl
ctr --namespace=k8s.io images push myharbor-minio.com/bigdata/nginx:nerctl --skip-verify --user admin:Harbor12345

--namespace=k8s.io 指定命名空间,跟-n一样,不是必须,根据环境而定
--skip-verify 跳过认证
--user 指定harbor用户名及密码

【云原生】Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )

Containerd ctr,crictl,nerdctl 客户端命令介绍与实战操作就到这里了,有疑问的小伙伴欢迎给我留言哦,后续文章更精彩,请耐心等待~

Original: https://www.cnblogs.com/liugp/p/16633732.html
Author: 大数据老司机
Title: 【云原生】Containerd ctr 和 crictl 客户端命令介绍与实战操作(nerdctl )

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/562637/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球