文章目录
报错信息
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。


2万+

被折叠的 条评论
为什么被折叠?



