You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中Always与IfNotPresent镜像拉取策略差异及疑问

Kubernetes镜像拉取策略:“本地”定义与Always/IfNotPresent差异解析

一、“本地”指的是节点(Node)层面

这里的“本地”明确是指Pod所在的节点,原因如下:

  • kubelet是每个节点上独立运行的组件,负责该节点上容器的启停、镜像管理等核心操作;
  • 节点本地有专属的镜像存储目录(比如Docker的/var/lib/docker/images、containerd的/var/lib/containerd/io.containerd.content.v1.content),kubelet只会检查当前节点的本地缓存,不会跨节点查询或访问集群级别的镜像存储;
  • Pod是运行在节点上的临时实例,没有持久化的镜像缓存能力;集群是多节点的集合,不存在“集群本地缓存”的概念。

二、Always与IfNotPresent的核心差异

两者的行为差异需结合镜像的标识方式(标签 vs 摘要)具体分析:

1. 使用镜像标签(如nginx:latest)时

  • IfNotPresent:只要节点上存在任何nginx相关镜像(无论标签是否匹配、摘要是否一致),就直接使用本地缓存启动容器;仅当节点完全没有该镜像时,才会从仓库拉取。
  • Always:每次启动容器前,kubelet都会向镜像仓库发起请求,校验该标签对应的最新镜像摘要:
    • 如果本地缓存的镜像与仓库返回的最新摘要完全一致,就使用本地镜像;
    • 如果本地无匹配摘要的镜像,或仓库中该标签已指向新的镜像(比如镜像更新后,latest标签绑定了新的摘要),则拉取最新镜像到节点后再启动容器。

2. 使用镜像摘要(如nginx@sha256:abc123...)时

  • IfNotPresent:只要节点存在该确切摘要的镜像,就直接用本地缓存;无匹配镜像时才拉取。
  • Always:与IfNotPresent行为几乎一致——因为摘要唯一锁定一个镜像,仓库中该摘要对应的镜像不会变更,kubelet校验后发现本地有匹配项,就直接使用;无匹配时才拉取。这也是官方文档中Always策略说明的核心场景。

一句话总结

  • IfNotPresent优先复用本地已有镜像(无论是否为仓库最新版),减少镜像拉取次数;
  • Always会主动校验仓库的最新状态(针对标签),确保使用仓库当前对应标签的最新镜像;仅当用摘要锁定镜像时,才与IfNotPresent行为趋同。

内容的提问来源于stack exchange,提问作者Akshit Bansal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:55:33