从 Google Container Registry 中删除镜像并上传另一个具有相同标签的镜像后,删除的仍然被拉取

After deleting image from Google Container Registry and uploading another with the same tag, deleted one is still pulled

我不知道这是 GCR 中的预期行为还是错误。 基本上我试过这样做:

  1. 在 Windows(基于 Linux 的图像)上使用 Docker 从本地文件创建图像。
  2. 在创建图像之前,我删除了具有相同 name/tag 的所有本地图像。
  3. 图像被标记为 repostiory/project/name:v1
  4. 在本地测试时图像具有正确版本的可执行文件(docker 运行 imageID)。
  5. 在将图像推送到 GCR 之前,我从 GCR 中删除了具有相同 tag/name 的所有图像。
  6. 当尝试从 GCR 提取新图像到 kubernetes 示例时,它会提取在特定标签下上传的第一个(有史以来)图像。

我想重复使用同一个标签,而不是每次测试都更改配置文件,而且我真的不需要存储以前版本的图像。

听起来您遇到了 kubernetes/kubernetes#42171 中描述的问题。

tl;dr,kubernetes 的默认拉取策略被设计破坏,因此您不能重复使用标签 (other than latest)。我相信 k8s 社区的指导是使用 "immutable tags",这有点矛盾。

您有几个选择:

  1. 切换到使用 latest 标签,因为 kubernetes 已经在他们的 default pull policy logic 中对此进行了硬编码(我相信这是为了缓解您遇到的问题)。
  2. 切勿重复使用标签。
  3. 切换到显式使用 PullAlways ImagePullPolicy。如果这样做,您将产生少量开销,因为您的节点将必须向注册表检查标签是否未更改。
  4. 切换到使用 PullIfNotPresent ImagePullPolicy 按映像摘要部署。我链接的 PR 中有更详细的解释,但这可以让你两全其美。