You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法拉取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识别。先确认节点运行时:
    kubectl get nodes -o wide | grep digi1036734
    
    若为containerd,需将Docker镜像导入:
    docker 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:45:04