Always 和 IfNotPresent 之间的区别 imagePullPolicy

Aks*_*sal 3 kubernetes

我正在检查 Kubernetes文档以获取图像。其中,我看到了两个策略 IfNotPresent 和 Always。在“总是”中指出

如果 kubelet 有一个容器镜像,该镜像在本地缓存了确切的摘要,那么 kubelet 将使用其缓存的镜像;否则,kubelet 会拉取已解析摘要的镜像,并使用该镜像来启动容器。

我无法理解这里的本地内容。它是节点、Pod 还是集群?如果是在节点级别,Always 和 IfNotPresent 有什么区别?这很令人困惑。

Vis*_*esn 8

当您使用不带标签的镜像时,Kubernetes 会假设您需要最新版本的镜像,默认情况下由最新标签标识。如果您的存储库中具有不同标签的同一镜像的多个版本,例如 img1:1.0.0、img1:1.1.0 和 img1:latest,Kubernetes 将使用具有 pod 规范中指定的标签的镜像。

如果您使用 IfNotPresent 并且具有指定标签的镜像已存在于工作节点上,Kubernetes 将使用该镜像来启动容器,即使存储库中存在具有相同标签的较新版本的镜像。

但是,如果您使用“始终”,Kubernetes 将始终尝试从存储库下载具有指定标签的最新版本的映像,即使工作节点上已存在映像的缓存副本。如果您想确保容器始终运行最新版本的映像,这会很有用。

考虑这样一种场景:容器在使用 img1:latest 作为最新标记的工作节点上运行,然后容器在另一个具有指向旧版本映像的相同标记的工作节点上重新启动或重新调度,IfNotPresent 将使用本地图像存在于工作节点上,而Always将尝试从存储库下载最新版本的图像。

但是,请务必注意,Always 的行为基于图像的摘要,而不是标签。摘要是基于图像内容的图像特定版本的唯一标识符。当您指定“始终”时,Kubernetes 将根据存储库中具有相同标签的最新版本映像的摘要来检查工作节点上的映像摘要。如果摘要匹配,Kubernetes 将使用工作节点上镜像的缓存副本。如果摘要不同,Kubernetes 将从存储库下载最新版本的映像并使用它来启动容器。