如何排查从GitLab Registry拉取镜像时的BackOff问题?
Kubernetes镜像拉取失败排查方案求助
我刚接手一个运行中的Kubernetes集群运维工作,集群内有个Operator通过Helm Release生成Web实例。近期我用GitLab CI/CD构建了新镜像,尝试更新Deployment拉取该镜像时遇到问题:旧镜像能在所有节点正常拉取,但新镜像始终找不到。
我已经尝试过用SSH登录节点,使用GitLab令牌对应的Docker登录凭证拉取新镜像,但依旧只能拉取同Registry下的旧镜像,新镜像始终拉取不到。我检查过镜像名称拼写,之后直接用GitLab容器镜像仓库的复制按钮获取名称,问题依旧存在。
kubectl describe pod的事件日志如下:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal BackOff 4m8s (x290 over 73m) kubelet Back-off pulling image "reg.dafni.rl.ac.uk/dafni/nivs/operator/20230801:latest"
更新内容
提问后我做了以下操作:
- 本地可以拉取该新镜像,将其重命名后推回仓库,现在集群节点能拉取这个重命名后的镜像,但原名称的镜像还是无法拉取。
- 用container-diff工具在本地检查原镜像,虽然本地能拉取,但工具提示:
ERRO[0004] error retrieving image reg.dafni.rl.ac.uk/dafni/nivs/operator/20230801: MANIFEST_UNKNOWN: OCI manifest found, but accept header does not support OCI manifests
排查建议
结合当前现象和错误提示,重点从以下方向排查:
- 镜像manifest格式兼容性:错误提示显示新镜像是OCI格式的manifest,但节点容器运行时(kubelet依赖的Docker/containerd等)的请求头不支持该格式。旧镜像可能是Docker V2 Schema 2格式,而新镜像被构建为纯OCI格式,导致无法识别。
- 检查GitLab CI/CD的镜像构建配置,尝试强制构建为Docker兼容格式(比如
docker build时添加--output type=docker参数,或调整buildx配置)。 - 查看节点容器运行时版本,确认是否支持OCI manifest格式,若版本过旧,考虑升级容器运行时。
- 检查GitLab CI/CD的镜像构建配置,尝试强制构建为Docker兼容格式(比如
- 镜像仓库的manifest异常:原镜像的manifest可能在仓库端存在缓存异常、同步延迟,或未正确上传。
- 在GitLab容器仓库后台检查该镜像的manifest状态,确认是否存在多架构manifest异常,或推送不完整的情况。
- 在节点上手动清除容器运行时的镜像缓存(比如执行
docker system prune -a或crictl rmi --prune),再尝试拉取原镜像。
- 镜像路径/名称问题:原镜像路径包含日期格式的目录
20230801,检查仓库是否对这类路径有特殊限制,或存在大小写敏感问题(部分Registry配置可能区分大小写)。 - CI/CD推送完整性:检查GitLab CI/CD构建日志,确认镜像推送过程是否完整,是否存在manifest推送超时、权限不足导致的推送失败情况。
内容的提问来源于stack exchange,提问作者Lewis Sampson
相关产品推荐
相关产品推荐

