K8s CronJob未运行最新代码但手动创建Job可正常运行问题求助
问题根因排查方向
- 镜像拉取策略与镜像标签覆盖问题
这是该类问题最常见的诱因:你大概率在构建镜像时,给新镜像复用了旧的标签(即你用到的security/portal:3c62acai标签被新构建的镜像覆盖后重新推送至镜像仓库)。K8s默认镜像拉取策略imagePullPolicy为IfNotPresent,只要节点本地存在对应标签的镜像,就不会主动去仓库拉取最新版本。
你手动创建Job时,Pod刚好调度到了没有该标签镜像缓存的节点,因此自动拉取了仓库里最新的同标签镜像,运行新代码;而CronJob自动触发的Pod长期调度到存有旧版本同标签镜像的节点,直接使用本地缓存的旧镜像,因此运行的是旧代码。 - CronJob调度规则限制
如果你给CronJob配置了节点亲和性、污点容忍或其他调度规则,导致CronJob自动生成的Pod只会被调度到某几个固定节点,而这几个节点的本地镜像缓存一直是旧版本,也会触发该问题。手动创建的Job可能没有继承对应的调度规则,因此可以调度到存有新镜像的节点。 - CronJob配置更新未实际生效
虽然你已经删除原有CronJob重新apply配置,但若你使用了helm、kustomize等编排工具,可能存在配置缓存未清理、实际生效的CronJob模板仍为旧配置的情况,可执行kubectl get cronjob severity -o yaml确认CronJob的jobTemplate中镜像配置确实为预期版本。
解决方案
- 在CronJob的Pod模板中添加
imagePullPolicy: Always配置,强制每次Pod启动时都去镜像仓库拉取最新版本镜像,彻底规避节点缓存问题。 - 规范镜像标签使用规则,每次构建新镜像都使用唯一标签(如完整Git commit hash、构建时间戳等),不要覆盖已存在的镜像标签,从根源上避免同标签镜像内容不一致的问题。
- 清理集群所有节点上的
security/portal:3c62acai旧镜像缓存,确保后续调度的Pod都会重新拉取镜像。 - 若配置了私有镜像仓库,确认CronJob对应的ServiceAccount持有镜像拉取权限,避免拉取失败降级使用本地旧镜像的情况。
内容的提问来源于stack exchange,提问作者Neuro Astro
相关产品推荐
相关产品推荐

