Kubernetes使用PullIfNotPresent策略时如何替换同名同标签运行中镜像
Kubernetes
PullIfNotPresent 镜像拉取策略同标签不同内容镜像的处理规则 首先明确场景:当Deployment、DaemonSet等工作负载配置imagePullPolicy: PullIfNotPresent,节点上已有同名同标签的旧镜像且存在运行中Pod,此时镜像仓库更新了同名同标签但内容不同的新镜像时,整体运行逻辑校验及补充如下:
你梳理的4条逻辑校验
- 第1条:基本正确。Kubelet将Pod调度到节点后,首先检查节点本地是否存在对应
镜像名:标签的镜像,不存在才会向仓库发起拉取请求;Pod启动时实际是基于镜像对应的唯一SHA256哈希值运行,和镜像标签无直接绑定关系。补充:如果工作负载的镜像字段直接指定了哈希值(格式为镜像名@sha256:xxx),拉取策略会被忽略,直接匹配对应哈希的镜像。 - 第2条:完全正确。容器运行时(Docker、Containerd等)的镜像标签是*可变更(mutable)*属性,当节点拉取同标签的新镜像时,运行时只会将标签的指向从旧镜像哈希切换到新镜像哈希,已经运行的旧Pod是基于旧镜像的文件层启动的独立进程,完全不受标签变更影响,不会被中断。
- 第3条:基本正确。节点上会同时留存旧、新两个镜像,旧镜像仅在没有任何运行中容器/ Pod引用、且没有绑定其他有效标签时,才会被标记为虚悬镜像;如果还有Pod引用旧镜像,旧镜像不会被当做垃圾回收的清理对象。
- 第4条:基本正确。只有当工作负载关联的Pod触发重建时,Kubelet才会重新执行镜像检查逻辑,如果此时节点本地的
镜像名:标签已经指向新的镜像哈希,才会使用新镜像启动Pod。如果Pod重建前节点从未触发过新镜像的拉取操作,Kubelet仍会使用本地已有的旧镜像启动Pod,不会主动向仓库校验标签对应的镜像是否更新。
补充遗漏核心要点
- 节点不会主动同步镜像仓库的标签变更:只有当节点上首次调度使用该
镜像名:标签的Pod、或有其他Pod配置imagePullPolicy: Always触发拉取、或手动在节点执行拉取命令时,才会拉取新镜像并更新本地标签指向。 - 多节点场景会出现版本不一致:如果集群中只有部分节点拉取了新的同标签镜像,此时滚动重建Pod会出现分片版本混乱的问题,调度到已拉取新镜像节点的Pod用新版本,调度到未拉取节点的Pod继续用旧版本。
- 生产环境规避方案:如果要避免同标签镜像变更带来的一致性问题,推荐每次更新镜像时使用唯一的新标签,或直接指定镜像哈希部署,必须用固定标签的场景可以将拉取策略设置为
Always。
内容的提问来源于stack exchange,提问作者lucidquiet
相关产品推荐
相关产品推荐

