Kubernetes镜像拉取失败问题的排查与解决

Kubernetes镜像拉取失败问题的排查与解决

问题背景

今天发现有个服务没有正常更新,检查之后发现ConJob执行失败。检查发现Pod状态显示为ImagePullBackOff。具体来说,在尝试拉取bitnami/kubectl:1.23.0镜像时,Pod一直无法正常启动,日志中提示网络超时错误。

错误分析

通过kubectl get pods命令,看到部分Pod状态为ImagePullBackOffErrImagePull

1
2
3
4
5
6
7
8
root@Aliyun-4G:~# kubectl get all                                                                                                                                                          
NAME READY STATUS RESTARTS AGE
pod/cleanup-replicasets-28781040-7dbv2 0/1 ImagePullBackOff 0 11h
pod/lobe-chat-deployment-85fdcc486d-2vd75 1/1 Running 0 9d
pod/lobe-chat-deployment-85fdcc486d-h55xf 1/1 Running 0 9d
pod/lobe-chat-deployment-85fdcc486d-sz24n 1/1 Running 0 9d
pod/lobe-chat-update-28768020-9vvkr 0/1 Completed 0 9d
pod/lobe-chat-update-28780980-86qwf 0/1 ImagePullBackOff 0 12h

进一步使用kubectl describe pod <pod-name>查看Pod事件日志,发现如下错误信息:

1
Warning Failed Failed to pull image "bitnami/kubectl:1.23.0": failed to do request: Head "https://registry-1.docker.io/v2/bitnami/kubectl/manifests/1.23.0": dial tcp: i/o timeout

这说明K3s在从docker.io拉取镜像时遇到了网络连接超时问题。

排查过程

1. 网络连接测试

首先,我们使用curl命令测试节点到Docker Hub的网络连接:

1
curl -v https://registry-1.docker.io/v2/

结果请求超时,初步判断节点无法正常访问Docker Hub仓库。

2. 本地Docker测试

为了进一步确认问题,尝试在节点上使用Docker手动拉取镜像:

1
docker pull bitnami/kubectl:1.23.0

但镜像成功拉取了。这表明节点本地Docker与Docker Hub之间的网络是通的。

查询后发现K3s 使用的是轻量级的容器运行时 containerd,而传统的 Docker 使用的是 dockerd。尽管它们都是用于运行容器的工具,但它们的镜像存储路径和运行方式有所不同,因此 Docker 和 K3s 的镜像并不共享。而我的docker配置了镜像加速,而k3s使用的默认镜像源。

3. containerd镜像检查

使用crictl images命令检查K3s的containerd是否已拉取镜像:

1
crictl images

结果显示containerd中并没有成功拉取所需镜像

解决方案

为containerd配置镜像加速器来解决这个问题。具体步骤如下:

  1. 编辑K3s的containerd配置文件:
1
sudo vim /etc/rancher/k3s/registries.yaml
  1. 添加以下内容,配置多个国内镜像加速器:
1
2
3
4
5
6
7
mirrors:
"docker.io":
endpoint:
- "https://dockerproxy.cn/"
- "https://dockerproxy.com"
- "https://docker.mirrors.ustc.edu.cn"
- "https://docker.nju.edu.cn"
  1. 重启K3s服务使配置生效:
1
sudo systemctl restart k3s
  1. 验证解决效果:
    重新部署之前失败的Pod,观察是否能够成功拉取镜像并启动。

或者看能否直接拉取镜像

1
crictl pull docker.io/bitnami/kubectl:1.23.0 

Kubernetes镜像拉取失败问题的排查与解决
http://example.com/2024/09/21/Kubernetes镜像拉取失败问题的排查与解决/
作者
Sanli Ma
发布于
2024年9月21日
许可协议