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

    作者:匿名更新于: 2023-02-11 17:31:12

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

      一、概述

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

      二、Containerd 常见命令操作

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

      1.crictl​ 是遵循CRI接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜像。

      2.ctr​ 是 containerd 的一个客户端工具。

      3.ctr -v​ 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。

      4.一般来说你某个主机安装了 k8s 后,命令行才会有 crictl 命令。而 ctr 是跟 k8s 无关的,你主机安装了 containerd 服务后就可以操作 ctr 命令。

      使用crictl​命令之前,需要先配置/etc/crictl.yaml如下:

      复制

      1.  runtime-endpoint: unix:///run/containerd/containerd.sock

      2.  image-endpoint: unix:///run/containerd/containerd.sock

      3.  timeout: 10

      4.  debug: false

      也可以通过命令进行设置:

      复制

      1.  crictl config runtime-endpoint unix:///run/containerd/containerd.sock

      2.  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

      更多命令操作,可以直接在命令行输入命令查看帮助。

      复制

      1.  docker --help

      2.  ctr --help

      3.  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导入镜像的时候特别注意一点,最好指定命名空间。

      复制

      1.  # 注意-n不能放在命令最后面,下面几行查看的镜像是一样的

      2.  ctr -n=k8s.io image ls

      3.  ctr -n k8s.io image ls

          4.

      5.  # crictl 没有-n参数,操作都在`k8s.io`命名空间下。

      6.  crictl image ls

      7.  crictl images

      8.  # crictl image list = ctr -n=k8s.io image list

      9.  # crictl image ls = ctr -n=k8s.io image ls

      10.  # crictl images = ctr -n=k8s.io image list

      11.  # crictl images = ctr -n=k8s.io image ls

          12.

      13.  # 使用ctr命令指定命名空间导入镜像

      14.  ctr -n=k8s.io image import dashboard.tar

          15.

      16.  #查看镜像,可以看到可以查询到了

      17.  crictl images

      三、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 使用 Stargz Snapshotter 延迟拉取镜像

      1)安装 nerdctl(精简版)

      复制

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

      2.  # 解压

      3.  tar -xf nerdctl-0.22.2-linux-amd64.tar.gz

          4.

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

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

      复制

      1.  wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-full-0.22.2-linux-amd64.tar.gz

      2.  tar -xf nerdctl-full-0.16.0-linux-amd64.tar.gz -C /usr/local/

          3.

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

      启动服务buildkit

      复制

      1.  systemctl enable buildkit containerd --now

      2.  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的客户端。

      复制

      1.  # https://github.com/moby/buildkit/releases

      2. wget https://github.com/moby/buildkit/releases/download/v0.10.4/buildkit-v0.10.4.linux-amd64.tar.gz

          3.

      4.  tar -xf buildkit-v0.10.4.linux-amd64.tar.gz -C /usr/local/1.2.3.4.

      配置buildkit的启动文件,可以从这里下载:https://github.com/moby/buildkit/tree/master/examples/systemdbuildkit需要配置两个文件

      /usr/lib/systemd/system/buildkit.socket

      复制

      1.  cat > /usr/lib/systemd/system/buildkit.socket <

      2.  [Unit]

      3.  Descriptinotallow=BuildKit

      4.  Documentatinotallow=https://github.com/moby/buildkit

      5.  [Socket]

      6.  ListenStream=%t/buildkit/buildkitd.sock

      7.  SocketMode=0660

      8.  [Install]

      9.  WantedBy=sockets.target

      10.  EOF

      /usr/lib/systemd/system/buildkit.service

      复制

      1.  cat > /usr/lib/systemd/system/buildkit.service << EOF

      2.  [Unit]

      3.  Descriptinotallow=BuildKit

      4.  Requires=buildkit.socket

      5.  After=buildkit.socket

      6.  Documentatinotallow=https://github.com/moby/buildkit

      7.  [Service]

      8.  # Replace runc builds with containerd builds

      9.  ExecStart=/usr/local/bin/buildkitd --addr fd://

      10.  [Install]

      11.  WantedBy=multi-user.target

      12.  EOF

      启动buildkit

      复制

      1.  systemctl daemon-reload

      2.  systemctl enable buildkit --now

      四、实战操作

      1)修改containerd配置文件

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

      复制

      1.  containerd config default > /etc/containerd/config.toml

      配置如下:

      复制

      1.  [plugins."io.containerd.grpc.v1.cri".registry]

      2.  config_path = ""

          3.

      4.  [plugins."io.containerd.grpc.v1.cri".registry.auths]

          5.

      6.  [plugins."io.containerd.grpc.v1.cri".registry.configs]

      7.  [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".tls]

      8.  insecure_skip_verify = true #跳过认证

      9.  ca_file = "/etc/containerd/myharbor-minio.com/ca.crt"

      10.  [plugins."io.containerd.grpc.v1.cri".registry.configs."myharbor-minio.com".auth]

      11.  username = "admin"

      12.  password = "Harbor12345"

          13. 

      14.  [plugins."io.containerd.grpc.v1.cri".registry.headers]

          15.

      16.  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]

      17.  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."myharbor-minio.com"]

      18.  endpoint = ["https://myharbor-minio.com"]

      重启containerd

      复制

      1.  #重新加载配置

      2.  systemctl daemon-reload

      3.  #重启containerd

      4.  systemctl restart containerd

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

      2)ctr 拉取推送镜像

      复制

      1.  # 推送镜像到harbor

      2.  ctr --namespace=k8s.io images push myharbor-minio.com/bigdata/minio:2022.8.22-debian-11-r0 --skip-verify --user admin:Harbor12345

          3.

      4.  # --namespace=k8s.io 指定命名空间,不是必须,根据环境而定

      5.  # --skip-verify 跳过认证

      6.  # --user 指定harbor用户名及密码

          7.

      8.  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)镜像构建

      复制

      1.  cat > Dockerfile <

      2.  FROM nginx:alpine

      3.  RUN echo 'Hello Nerdctl From Containerd' > /usr/share/nginx/html/index.html

      4.  EOF

      然后在文件所在目录执行镜像构建命令:

      复制

      1.  # 不加-n指定命名空间,crictl看不到,kubelet也不能使用它,默认在default命名空间下

      2.  nerdctl -n k8s.io build -t nginx:nerctl -f ./Dockerfile .

      3.  ### 参数解释

      4.  # -t:指定镜像名称

      5.  # . :当前目录Dockerfile

      6.  # -f:指定Dockerfile路径

      7.  # --no-cache:不缓存

      4)打标签 tag

      复制

      1.  # crictl没有tag命令,只能使用nerdctl和ctr,必须指定命名空间,要不然kubelet无法使用。

      2.  ctr -n k8s.io i tag

      3.  nerdctl -n k8s.io tag nginx:nerctl myharbor-minio.com/bigdata/nginx:nerctl

      4.  # ctr -n k8s.io tag nginx:nerctl myharbor-minio.com/bigdata/nginx:nerctl

      5.  # 查看镜像

      6.  nerdctl -n k8s.io images myharbor-minio.com/bigdata/nginx:nerctl

      5)将镜像推送到 Harbor

      第一种情况:http方式,配置如下:

      复制

      1.  # 以下两个哪个都可以

      2.  # mkdir -p /etc/docker/certs.d/myharbor-minio.com:443

      3.  mkdir -p /etc/containerd/certs.d/myharbor-minio.com:443

          4.

      5.  cat > /etc/containerd/certs.d/myharbor-minio.com\\:443/hosts.toml <

      6.  server = "https://docker.io"

          7.

      8.  [host."http://myharbor-minio.com:80"]

      9.  capabilities = ["pull", "resolve","push"]

      10.  #skip_verify = true

      11.  #ca = "ca.crt" #相对路径

      12.  #ca = "/opt/auth/ca.crt" #绝对路径

      13.  #ca = ["/opt/auth/ca.crt"]

      14.  #ca = ["ca.crt"]

      15.  #client = [["/opt/auth/nginx.cclinux.cn.crt", "/opt/auth/nginx.cclinux.cn.key"]]

          16.

      17.  EOF

      第一种情况:https方式,配置如下:

      复制

      1.  # 以下两个哪个都可以

      2.  # mkdir -p /etc/docker/certs.d/myharbor-minio.com:443

      3.  mkdir -p /etc/containerd/certs.d/myharbor-minio.com:443

          4.

      5.  cat > /etc/containerd/certs.d/myharbor-minio.com\\:443/hosts.toml <

      6.  server = "https://docker.io"

          7.

      8.  [host."https://myharbor-minio.com:443"]

      9.  capabilities = ["pull", "resolve","push"]

      10.  skip_verify = true

      11.  #ca = "ca.crt" #相对路径

      12.  #ca = "/opt/auth/ca.crt" #绝对路径

      13.  #ca = ["/opt/auth/ca.crt"]

      14.  ca = ["/etc/containerd/myharbor-minio.com/ca.crt"]

      15.  #client = [["/opt/auth/nginx.cclinux.cn.crt", "/opt/auth/nginx.cclinux.cn.key"]]

      16.  EOF

      通过 nerdctl 登录 harbor

      复制

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

          2.

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

          4.

      5.  # 登出

      6.  # nerdctl logout

      开始将镜像推送到harbor

      复制

      1.  ### 推送到Harbor

      2.  # --insecure-registry skips verifying HTTPS certs, and allows falling back to plain HTTP

      3.  nerdctl --insecure-registry --namespace=k8s.io push myharbor-minio.com/bigdata/nginx:nerctl

      4.  # ctr --namespace=k8s.io images push myharbor-minio.com/bigdata/nginx:nerctl --skip-verify --user admin:Harbor12345

          5.

      6.  # --namespace=k8s.io 指定命名空间,跟-n一样,不是必须,根据环境而定

      7.  # --skip-verify 跳过认证

      8.  # --user 指定harbor用户名及密码

      来源: 大数据与云原生技术分享

        >>>>>>点击进入计算专题

云计算 更多推荐

课课家教育

未登录