如何在 kubernetes 中重新拉取已缓存的图像?

6 containers image docker kubernetes

我正在使用具有 20 个工作节点的 kubernetes 集群。我已将映像拉取策略设置为 IfNotPresent 以减少创建时间。图像托管在 dockerhub 上。

当我更新 dockerhub 中的映像时,我需要清除所有 20 个工作节点的缓存。目前我正在所有 20 个工作节点上进行 docker pull 来更新最新的镜像。

是否有任何 kubernetes 本机解决方案或任何其他最佳行业解决方案来更新所有节点上的映像?

Dan*_*ell 11

最好的行业解决方案是为每个部署的映像使用唯一的标签。更改镜像标签,k8s 将为您处理升级。你只会遇到这个问题,因为即使图像发生变化,你也想使用相同的标签。无论您认为不值得明确版本化您的图像的原因是什么,您都错了:P。显式版本可以很好地指定它们

  • 我认为这是正确的答案,如果人们不会在没有给出任何理由的情况下投反对票,这将会很有用。已投赞成票。 (2认同)

小智 6

您需要在 ImagePullPolicy 中使用 Always。如果是这样,每当特定标签的提交哈希发生变化时,K8S 就会再次拉取。记得也要设置rollingUpdate。

  • imagePullPolicy=总是完全下载图像,即使它没有改变? (3认同)

Cro*_*rou 5

这取决于您是否在 Docker Hub 上对映像进行版本控制。

强烈建议对图像进行版本控制,原因如下。

  • 如果出现问题,回滚速度更快,因为您只需将版本号更改为以前的版本号

  • 您的所有 pod 将使用相同版本的映像

您可以在 Kubernetes 文档中阅读有关容器镜像的配置。

imagePullPolicy 和镜像的标签会影响 kubelet 尝试拉取指定镜像的时间。

  • imagePullPolicy: IfNotPresent:仅当本地尚不存在图像时才会拉取该图像。

  • imagePullPolicy: Always:每次 pod 启动时都会拉取镜像。

  • imagePullPolicy 被省略,并且图像标签被应用 :latest 或被省略: Always 被应用。

  • imagePullPolicy 被省略并且图像标签存在但不 应用:latest: 。IfNotPresent

  • imagePullPolicy: Never:假设图像存在于本地。没有尝试拉取图像。

注意: 为了确保容器始终使用相同版本的镜像,您可以指定其 摘要,例如 sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2。摘要唯一地标识了映像的特定版本,因此 Kubernetes 永远不会更新它,除非您更改摘要值。

注意:在生产环境中部署容器时, 您应该避免使用该 :latest 标签,因为很难跟踪正在运行的映像版本,也更难以正确回滚。

注意: 底层图像提供者的缓存语义甚至更加 imagePullPolicy: Always 高效。例如,对于 Docker,如果镜像已存在,则拉取尝试会很快,因为所有镜像层都会被缓存,并且无需下载镜像。