Kubernetes Containerd ctr、crictl、nerdctl -容器和镜像操作命令工具

一、概述

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

https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#docker

二、Containerd 常见命令操作

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

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

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

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

或者使用命令:

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 crictl pull

推送镜像 docker push ctr image push 无

登录或在容器内部执行命令 docker exec 无 crictl exec

清空不用的容器 docker image prune 无 crictl rmi --prune

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

注意-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 客户端工具 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 延迟拉取镜像

https://icloudnative.io/posts/startup-containers-in-lightning-speed-with-lazy-image-distribution-on-containerd/

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 <<EOF

[Unit]

Description=BuildKit

Documentation=https://github.com/moby/buildkit

[Socket]

ListenStream=%t/buildkit/buildkitd.sock

SocketMode=0660

[Install]

WantedBy=sockets.target

EOF

/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

systemctl daemon-reload

systemctl enable buildkit --now

四、实战操作

1)修改 containerd 配置文件

配置如下:

[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"]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#重新加载配置

systemctl daemon-reload

#重启containerd

systemctl restart containerd

注意:这个配置文件是给crictl和kubelet使用,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 <<EOF

FROM nginx:alpine

RUN echo ‘Hello Nerdctl From Containerd’ > /usr/share/nginx/html/index.html

EOF

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

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

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

参数解释

-t:指定镜像名称

. :当前目录Dockerfile

-f:指定Dockerfile路径

–no-cache:不缓存

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 <<EOF

server = “https://docker.io”

[host.“http://myharbor-minio.com:80”]

capabilities = [“pull”, “resolve”,“push”]

#skip_verify = true

#ca = “ca.crt” #相对路径

#ca = “/opt/auth/ca.crt” #绝对路径

#ca = [“/opt/auth/ca.crt”]

#ca = [“ca.crt”]

#client = [[“/opt/auth/nginx.cclinux.cn.crt”, “/opt/auth/nginx.cclinux.cn.key”]]

EOF

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

server = “https://docker.io”

[host.“https://myharbor-minio.com:443”]

capabilities = [“pull”, “resolve”,“push”]

skip_verify = true

#ca = “ca.crt” #相对路径

#ca = “/opt/auth/ca.crt” #绝对路径

#ca = [“/opt/auth/ca.crt”]

ca = [“/etc/containerd/myharbor-minio.com/ca.crt”]

#client = [[“/opt/auth/nginx.cclinux.cn.crt”, “/opt/auth/nginx.cclinux.cn.key”]]

EOF

通过 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

开始将镜像推送到 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用户名及密码

kubernetesdocker容器

AI必读

发布于2022-12-11

著作权归作者所有

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容