K8s排错--Failed to pull image “redis:6.2“: rpc error: code = NotFound desc = failed to pull and unpack


报错信息
Failed to pull image “redis:6.2”: rpc error: code = Unknown desc = failed to pull and unpack image “docker.io/library/redis:6.2”: failed to resolve reference “docker.io/library/redis:6.2”: pulling from host s8gkwcex.mirror.aliyuncs.com failed with status code [manifests 6.2]: 403 Forbidden

意思是说从s8gkwcex.mirror.aliyuncs.com这个镜像地址拉取redis:6.2时失败,无法解析"docker.io/library/redis:6.2",报错码是403 Forbidden,可能是没有权限访问该地址。

该错误导致了Pod的status为ImagePullBackOff

1.ImagePullBackOff

在 Kubernetes 中,ImagePullBackOff 是一种 Pod 处于非正常运行状态的错误,表明 Kubernetes 无法拉取容器镜像。通常,这种错误会导致 Pod 进入 CrashLoopBackOff 状态,持续重试镜像拉取操作。

我的redis.yaml配置很简单,就是创建一个redis的pod的资源清单。

apiVersion: v1
kind: Pod
metadata:
  name: redis4
spec:
  containers:
  - name: redis
    image: redis:6.2

执行kubectl create -f redis.yaml后,虽然pod/redis4 created了,但此时Pod的status为ImagePullBackOff在这里插入图片描述
于是使用kubectl describe 查看具体pod报错信息时,就出现了文章开头红色字体描述的问题。

kubectl describe pod redis4

在这里插入图片描述
导致pod 的状态为ImagePullBackOff的原因有很多,我这里遇到的是集群网络连接问题

2.网络连接问题

1.k8s集群无法连接到镜像仓库

在这里插入图片描述
注意看describe描述的事件信息为:Events:Successfully assigned default/redis4 to k8s-node1
也就是说,此时k8s-node1节点已经成功被master节点调度了,那么此时,pod的创建就需要在k8s-node1节点上完成。如果此时k8s-node1节点上的镜像地址不通,那pod内的容器镜像拉取就会不成功。

我之前一直傻傻的以为,pod的创建都是在master上完成,之后才会调度到node节点上。所以我master节点上手动拉取镜像时,无论使用docker还是ctr,镜像都能拉取成功,但redis这个pod就是一直ImagePullBackOff。

docker pull docker.io/library/redis:6.2

在这里插入图片描述
在这里插入图片描述

ctr images pull docker.io/library/redis:6.2

在这里插入图片描述

2.配置node节点的镜像源

因为我的k8s集群使用的是containerd的容器运行时,所以我需要在/etc/containerd/config.toml 配置镜像源。使用以下命令可以查看容器运行时使用组件是containerd。

kubectl get node -o wide

在这里插入图片描述

config.toml 配置文件插件格式

vim /etc/containerd/config.toml

主要配置sandbox_image、endpoint、overlayfs
  [plugins."io.containerd.grpc.v1.cri"]
     sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
     endpoint = ["https://hub-mirror.c.163.com", "https://registry.aliyuncs.com"]

  [plugins."io.containerd.snapshotter.v1"]
     name = "overlayfs"

注意:以上配置是有对齐格式的。不然配置后会重启containerd会报错
在这里插入图片描述
根据报错信息 invalid plugin key URI “io.containerd.snapshotter” expect io.containerd.x.vx,说明 containerd 的配置文件中插件名称的格式不符合要求。

version = 2

[plugins]
  # CRI plugin configuration for Kubernetes integration
  [plugins."io.containerd.grpc.v1.cri"]
    # Sandbox image for Kubernetes (Pause container)
    #sandbox_image = "registry.k8s.io/pause:3.6"
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

    # Stream server port configuration
    [plugins."io.containerd.grpc.v1.cri".containerd]
      snapshotter = "overlayfs"
      no_pivot = false

    # Registry mirrors for faster image pulls
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        # Docker official mirror
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://hub-mirror.c.163.com", "https://registry.aliyuncs.com"]
        # endpoint = ["https://registry-1.docker.io"]
        # Custom mirror example (uncomment and modify if needed)
        # [plugins."io.containerd.grpc.v1.cri".registry.mirrors."your.custom.mirror"]
        #   endpoint = ["https://your.custom.mirror"]

    # Configurations related to image pull protocols
    [plugins."io.containerd.grpc.v1.cri".image_service]
      max_parallel_downloads = 10

[plugins."io.containerd.snapshotter.v1"]
  name = "overlayfs"

[proxy_plugins]
  # Configuration for various plugins, if needed

# Define snapshotter plugins
[plugins."io.containerd.snapshotter.v1.overlayfs"]
  root_path = "/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs"

[plugins."io.containerd.snapshotter.v1.native"]
  root_path = "/var/lib/containerd/io.containerd.snapshotter.v1.native"

[metrics]
  address = "127.0.0.1:1338" # Enable metrics on localhost

[cgroup]
  path = ""

重启 containerd 服务,使配置生效:

sudo systemctl restart containerd

检查日志

sudo journalctl -u containerd -xe

Pod终于Running了

配置完k8s-node1的镜像地址后,在重新create就Successfully了。我这个镜像拉取成功,还是需要开启VPN。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值