Containerd 在 Kubernetes 中创建 Pod 时拉取多个镜像

问题描述

我使用 Containerd 作为容器运行时。当我创建一个 pod 时,包含拉两个图像。 (ctr -n k8s.io i ls -q 的结果)

myprivateregistery/gcr.io/google_containers/kubernetes-dashboard-amd64:v1.7.1                                                                  application/vnd.docker.distribution.manifest.v2+json sha256:2cc826b775aacfb15a89a1f2d6685799f360ddb65f101b656097784cef2bb9d7 39.8 MiB  linux/amd64 io.cri-containerd.image=managed
myprivateregistery/gcr.io/google_containers/kubernetes-dashboard-amd64@sha256:2cc826b775aacfb15a89a1f2d6685799f360ddb65f101b656097784cef2bb9d7 application/vnd.docker.distribution.manifest.v2+json sha256:2cc826b775aacfb15a89a1f2d6685799f360ddb65f101b656097784cef2bb9d7 39.8 MiB  linux/amd64 io.cri-containerd.image=managed

稍后创建了另一个图像,ctr -n k8s.io i ls -q 的结果变为。

myprivateregistery/gcr.io/google_containers/kubernetes-dashboard-amd64:v1.7.1                                                                  application/vnd.docker.distribution.manifest.v2+json sha256:2cc826b775aacfb15a89a1f2d6685799f360ddb65f101b656097784cef2bb9d7 39.8 MiB  linux/amd64 io.cri-containerd.image=managed
myprivateregistery/gcr.io/google_containers/kubernetes-dashboard-amd64@sha256:2cc826b775aacfb15a89a1f2d6685799f360ddb65f101b656097784cef2bb9d7 application/vnd.docker.distribution.manifest.v2+json sha256:2cc826b775aacfb15a89a1f2d6685799f360ddb65f101b656097784cef2bb9d7 39.8 MiB  linux/amd64 io.cri-containerd.image=managed
sha256:294879c6444ed35b8cb94c613e61c47b9938305a1d1eaf452c0d17db471d99e5                                                                              application/vnd.docker.distribution.manifest.v2+json sha256:2cc826b775aacfb15a89a1f2d6685799f360ddb65f101b656097784cef2bb9d7 39.8 MiB  linux/amd64 io.cri-containerd.image=managed

Containerd 收到的事件:

2021-06-03 10:41:41.942185302 +0000 UTC k8s.io /images/create {"name":"myprivateregistry/gcr.io/google_containers/kubernetes-dashboard-amd64:v1.7.1"}
2021-06-03 10:41:41.944191919 +0000 UTC k8s.io /images/create {"name":"sha256:294879c6444ed35b8cb94c613e61c47b9938305a1d1eaf452c0d17db471d99e5","labels":{"io.cri-containerd.image":"managed"}}

问题是为什么 Containerd 会拉取多个相同的镜像。我希望看到一个图像,图像列表命令的输出显示拉取了 3 个图像。此外,如果我创建了很多 pod,它会因此导致磁盘压力。

解决方法

它不会拉两个图像,它只会拉一个图像。标签实际上是对它首先需要解析的特定散列的引用。所以第一个请求只是将标签解析为哈希,第二个是实际下载。

间接证据是两者之间的时间很短,你可以看到只用了 0.002 秒就得到了对第一个请求的回复,然后才开始下载。