深圳幻海软件技术有限公司 欢迎您!

K8s 都开始放弃 Docker了,Containerd 命令走起

2023-02-28

当前containerd已经取代docker成为默认的容器运行时了,我们在日常排查问题的时候,经常会使用containerd的客户端去排查问题。所以日常的命令还是需要掌握的。containerd目前有三个客户端,分别是ctr、nerdctl、crictl下面我们逐一讲解一下。ctrctr是conta

当前 containerd 已经取代docker 成为默认的容器运行时了,我们在日常排查问题的时候,经常会使用containerd 的客户端去排查问题。所以日常的命令还是需要掌握的。

containerd 目前有三个客户端,分别是 ctr、nerdctl、crictl 下面我们逐一讲解一下。

ctr

ctr 是containerd 的亲儿子,containerd 的所有功能都可以通过ctr 命令去操作。

比如我们可以通过ctr 拉一个镜像

ctr images pull docker.io/library/nginx:1.21
  • 1.

或者通过ctr 创建一个容器

 ctr container create -t docker.io/library/nginx:latest nginx_1
  • 1.

最后通过ctr 启动容器,这里是 task 子命令,containerd 中只要涉及进程相关的都使用task

 ctr task start -d nginx_1  
  • 1.

容器启动后,就可以通过 exec 进入容器

ctr task exec -t --exec-id bash_1 nginx_1 bash
  • 1.

nerdctl

nerdctl 的命令,我就不说了,因为 nerdctl 目的就是为了做一个兼容 docker 命令的客户端,所以使用的命令和 docker 完全保持一致。

我们就可以直接抛弃 docker + dockerd了,直接通过 nerdctl + containerd 了。

crictl

crictl 在k8s里面非常常用,严格来说,它并不是 containerd 的客户端,只是因为containerd 实现了crictl 的接口,所以可以使用 crictl 。crictl 是k8s CRI 客户端,所以,所有实现CRI 接口的服务,都可以使用 crictl

我们可以先通过

crictl pull xxx
  • 1.

拉镜像,然后启动 Pod(sandbox)

crictl runp pod.json
  • 1.

其中pod.json 内容如下:

{
    "metadata": {
        "name": "nginx-sandbox",
        "namespace": "default",
        "attempt": 1,
        "uid": "hdishd83djaidwnduwk28bcsb"
    },
    "log_directory": "/tmp",
    "linux": {
      "security_context": {
         "namespace_options":{
            "network": 2
          }
       }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

然后为这个pod 添加一个容器

 crictl create podID  container.json pod.json
  • 1.

其中,container.json 内容如下:

{
  "metadata": {
      "name": "busybox"
  },
  "image":{
      "image": "busybox"
  },
  "command": [
      "top"
  ],
  "log_path":"busybox.log",
  "linux": {
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

创建成功后,我们再通过 ctr 命令检查一下。

# ctr -n k8s.io c ls
CONTAINER                                                           IMAGE                               RUNTIME
56ae054eed20d0e4dbaf2bf300406baaedaa63646a3b0dc39911daaaff4cd569    docker.io/library/busybox:latest    io.containerd.runc.v2
e23205e980b40ebeef875f9489321fe67906cbe62b6b6232912aa69b58842b95    k8s.gcr.io/pause:3.2                io.containerd.runc.v2
  • 1.
  • 2.
  • 3.
  • 4.

可以看到成功的启动了两个容器。