ctr和crictl显示镜像不一致
# ctr和crictl显示镜像列表不一致
现象
安装k3s后,使用ctr i import xxx.tar镜像之后,k3s通过yaml启动容器后报镜像未找到。
原因
这台节点原先已经安装了docker,安装时产生ctr命令,默认使用 docker的 --containerd=/run/containerd/containerd.sock,先记作containerd1
然后又安装了k3s,安装时产生crictl命令,默认使用 k3s的-address /run/k3s/containerd/containerd.sock(虽然k3s安装时也会产生ctr,但如果先安装了docker,就默认使用原有的ctr),先记作containerd2
ctr是containerd的一个客户端工具,crictl是k8s/k3s调用containerd的接口 crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序 crictl 则直接对应了命名空间 k8s.io,即”crictl image list“等同于“ctr -n=k8s.io image list“ 所以crictl是kubernetes专属的containerd管理命令,crictl -v 输出的是当前 k8s 的版本。
ctr指向了containerd1,crictl指向了containerd2,所以用ctr导入的镜像用crictl命令查不到,又因为k3s是通过crictl接口调用的containerd2,所以会报镜像未找到
两种解决方案
卸载docker,重新安装k3s,简单粗暴
ctr导入镜像时指定k3s的containerd
可以在运行命令时通过 -a
或 --address
参数指定套接字路径。例如:
ctr -a /run/k3s/containerd/containerd.sock i import xx.tar
1
上次更新: 2024/03/13, 13:59:39