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
相关产品推荐
相关产品推荐

