前言
在 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 正常。