我在 gke 中创建了一个集群,然后创建了一些特定于我的应用程序的部署。我的问题是如何删除已经存在的特定图像,因为即使我设置了 imagePullPolicy: Always 在我的部署文件中,它也不会提取最新的图像,而是使用缓存的图像。
当我在我的 minikube 上工作时,我曾经通过这个命令 minikube ssh -- docker rmi image-name 手动删除这些镜像 但在 gke 中,具体的过程是什么呢? 另外,我确实想知道为什么它不根据 imagePullPolicy:始终拉取我的最新图像?
手动删除 Kubernetes 缓存的图像的一个挑战是您需要为每个节点执行此操作。如果您使用自动驾驶仪,这可能无法实现。
我没有在 GKE 上尝试过此操作,但是,GKE 默认 (!?) 为
containerd
(容器运行时),因此您应该 (!?) 能够使用 ctr
等工具来连接到每个节点的containerd套接字,枚举|删除缓存的图像。
imagePullPolicy: Always
应该(如文档|名称所示)始终(从存储库中)提取图像但是这只会在 Pod 创建期间发生。
如果您有一个现有的 Pod,使用
imagePullPolicy: Always
并且您更改更新镜像,则不会发生拉取。在这种情况下,敲击(删除)Pod 应该(!?)触发重新拉取。
如果底层图像发生变化,不建议重复使用图像标签。
是的,在开发过程中,不断修改图像变化的标签变得很乏味,但这是一个很好的做法,应该始终在生产中使用。最好(虽然稍微乏味)始终通过图像的摘要(SHA-256 哈希)来引用图像。当底层图像发生变化时,哈希值很可能会发生变化,因此这提供了一种(大部分)独特的方式来识别图像。任何更改都需要修改
image
值,并且在 Pod 重新创建时,拉动将始终发生。代替:
- image: foo:never-changed
你会
- image: foo@sha256:123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0