无法拉取Docker Hub自有镜像及K8s本地镜像识别异常问题排查
问题解决:K8s拉取自定义Docker镜像失败的排查与修复
问题现象
- 自定义镜像已推送到Docker Hub且目标节点本地存在,但K8s拉取时出现授权错误:
Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m39s default-scheduler Successfully assigned default/classification-pod to digi1036734 Warning Failed 30s kubelet Failed to pull image "vikash112/pathology:0.1.0": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/vikash112/pathology:0.1.0": failed to copy: httpReadSeeker: failed open: server message: invalid_token: authorization failed Warning Failed 30s kubelet Error: ErrImagePull Normal BackOff 30s kubelet Back-off pulling image "vikash112/pathology:0.1.0" Warning Failed 30s kubelet Error: ImagePullBackOff Normal Pulling 16s (x2 over 7m38s) kubelet Pulling image "vikash112/pathology:0.1.0"
- 设置
imagePullPolicy: Never后,节点本地明明存在镜像却仍报错:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 83s default-scheduler Successfully assigned default/classification-pod to digi1036734 Warning ErrImageNeverPull 5s (x9 over 82s) kubelet Container image "vikash112/kftools:0.0.1" is not present with pull policy of Never Warning Failed 5s (x9 over 82s) kubelet Error: ErrImageNeverPull
节点本地镜像确认:
(base) gupta@DIGI1036734:~/disk/Tools/kfp_pipeline_7/app/CAII/cai2package$ docker images | grep kftools vikash112/kftools 0.0.2 90e48f4cee7b 4 months ago 13.4GB vikash112/kftools 0.0.1 1f00fe6b3e82 4 months ago 13.4GB
- 已创建Docker登录Secret但问题依旧;公共镜像(如mongodb、busybox)可正常拉取。
复现步骤
使用以下YAML文件(myscript.yaml):
apiVersion: v1 kind: Pod metadata: name: classification-pod spec: restartPolicy: OnFailure containers: - name: caiiapp image: vikash112/hellok8s:v1 imagePullPolicy: IfNotPresent resources: limits: nvidia.com/gpu: 1 nodeSelector: kubernetes.io/hostname: digi1036734
执行命令:
kubectl apply -f myscript.yaml
排查与修复方案
1. 解决公共镜像拉取的invalid_token授权错误
- 确认仓库可见性:登录Docker Hub检查对应镜像仓库的可见性为
Public,避免因仓库默认私有导致拉取需授权。 - 核对镜像标签:确保YAML中镜像的名称、标签与Docker Hub上完全一致,排除拼写错误。
- 重置节点Docker授权缓存:在目标节点执行以下命令清理旧缓存:
docker logout docker.io docker login docker.io # 公共镜像无需输入凭证,直接回车即可
2. 解决imagePullPolicy: Never时的镜像不存在错误
- 确认镜像完整匹配:K8s会自动补全registry前缀(如
vikash112/kftools:0.0.1等价于docker.io/vikash112/kftools:0.0.1),在目标节点执行docker images --digests,检查镜像的完整名称、标签、摘要与YAML完全一致。 - 检查容器运行时一致性:若K8s使用的容器运行时不是Docker(如containerd),Docker本地镜像无法被kubelet识别。先确认节点运行时:
若为containerd,需将Docker镜像导入:kubectl get nodes -o wide | grep digi1036734docker save vikash112/kftools:0.0.1 -o kftools.tar ctr image import kftools.tar - 验证kubelet镜像存储:检查kubelet配置文件(通常在
/var/lib/kubelet/config.yaml),确认镜像存储路径与Docker一致,或手动导入镜像到对应路径。
3. 清理无效的ImagePullSecret
公共镜像无需配置ImagePullSecret,错误的Secret可能干扰拉取:
- 删除已创建的Secret:
kubectl delete secret <你的secret名称> - 确保Pod的YAML中未指定
imagePullSecrets字段。
内容的提问来源于stack exchange,提问作者screamingmamba
相关产品推荐
相关产品推荐

