"IfNotPresent"-CachePolicy使用的Kubernetes缓存图片存放在哪里,如何删除缓存?

Where does Kubernetes store cached images for use of "IfNotPresent"-CachePolicy and how to delete the cache?

我有一个要管理的集群,其中 Pods 运行 Image-CachePolicy 设置为“IfNotPresent”。

containers:
  - name: test-app
    image: myimages/test-app
    imagePullPolicy: "IfNotPresent"

我已经熟悉IfNotPresentAlways的区别了。

在我们的例子中,如果 Pod 重生,K8s 将由于“IfNotPresent”从一些缓存中加载图像,而不是从 docker-hub 中获取图像。

我们要实现的是找到kubectl缓存图片的这个地方,然后删除缓存,以便下次Pod重启时K8s重新获取图片。

我们不希望应用imagePullPolicy设置为Always的新策略,因为这已经获取最新版本的Pod,我们还不想要。相反,它只会在下次重新启动 pod 时获取新的最新图像。

有什么办法吗?在哪里可以找到这个缓存位置?

Kubernetes 本身不缓存图像,它是底层 OCI 运行时进行缓存。

如果 k8s 集群正在使用 docker,可以使用以下命令从节点中删除图像:

docker image rm <name_or_checksum>

如果您想象 Kubernetes 是 运行 Docker,它的作用相当于:

  1. docker images.
  2. 如果图像不存在,docker pull它。
  3. docker run 结果图像。

(imagePullPolicy: Always 跳过第一步,始终拉取镜像;Never 跳过拉取,如果镜像不存在则拉取失败。)

每个节点都有自己的图像副本;其中具体取决于正在使用的特定容器运行时。每个节点依次知道如何 garbage collect images not currently in use,尽管旧图像通常会一直存在,直到本地磁盘填满(或直到像集群自动缩放器这样的工具删除节点)。

Kubernetes 中的一般假设是给定的 registry.example.com/name/image:tag 字符串唯一标识图像。您的 CI/CD 系统应该与此合作,并为每个图像构建分配一个不同的标签(可能基于提交 ID 或日期戳)。如果这样做,您不需要调整 imagePullPolicy: 的默认值或尝试手动从节点中删除图像。

欢迎使用 stackOverflow,与缓存图像的位置有关,如上文 @David Maze and @Matt 所述,这取决于您的 OCI。

我想对这个声明多了解一点

> We don't want to apply a new Policy with imagePullPolicy set to Always because this would already fetch the latest version of the Pod, which we don't want yet. Instead, it shall only fetch new newest image on the next restart of the pod.

当您提到“我们还不需要”时,这是否意味着您当前在该标签上的图像还不正确。是否有可能修改您的 CI/CD 以便仅根据促销流程生成或创建图像标签(Kubernetes 清单中使用的标签)(这意味着仅在您希望该特定标签为 Kubernetes 准备好时集群)?这是 Kubernetes 使用的处理图像的正常方式。

我的建议的原因是,你的 pod 也可以重新调度到其他节点的原因可能有多种(没有任何缓存的节点和 k8s 可以指示 OCI 重新获取,因为该节点可能没有此缓存) 在任何时间点。 假设 pods 生命周期可能会产生一些意想不到的结果。

我建议坚持 Kubernetes 镜像政策并修改 CI/CD 流程或推广流程以处理为哪个 Kubernetes 环境准备好哪个镜像。

如果您仍然觉得需要修改和使用图像缓存,请详细说明实际用例,可能还有其他选择。