猫小白

猫小白

前言

在 Kubernetes 1.20 版本之前,容器的 Runtime 为 Docker,直接导入本地镜像,导入成功后部署 Pod 即可;但是 Kubernetes 1.20 版本之后容器的 Runtime 改为 Containerd,按照之前的经验导入本地镜像后发现 Pod 运行的时候提示找不到镜像。

现象

使用 Containerd 的命令 ctr 导入镜像

[root@CVM12087 ~]# ctr images import xx.tar

导入镜像后 ctr image list 可以看到镜像导入成功

[root@CVM12087 ~]# ctr image list
REF                                    TYPE                                                 DIGEST                                                                  SIZE      PLATFORMS   LABELS
docker.io/i5sing/i5sing-website:latest application/vnd.docker.distribution.manifest.v2+json sha256:24029eb55f55bb52a3da1002bf7e1f5e04239d54edceaecc69b681415a2d47fd 379.1 MiB linux/amd64 io.cri-containerd.image=managed

但是使用 crictl image list 看不到导入的镜像,并且 Pod 运行的时候提示找不到对应镜像。

[root@CVM12087 ~]# crictl image list
IMAGE                                                               TAG                 IMAGE ID            SIZE

原因

Containerd 和 Docker 不同的地方在于 Containerd 使用 Namespace,我们导入的镜像都被放到了 default 命名空间下边,而 Kubernetes 使用的 镜像是被放在 k8s.io 命名空间下边。可以执行如下命令查看:

[root@CVM12087 ~]# ctr namespace ls
NAME   LABELS
k8s.io
default

解决

在导入镜像的时候需要加上 namespace 参数:

[root@CVM12087 ~]# ctr --namespace k8s.io image import xx.tar 

这样,导入成功后 crictl image list 和 ctr --namespace k8s.io image list 都可以看到导入的本地镜像了;运行 Pod 正常。

Kubernetes