Kubernetes镜像拉取失败问题的排查与解决
Kubernetes镜像拉取失败问题的排查与解决
问题背景
今天发现有个服务没有正常更新,检查之后发现ConJob执行失败。检查发现Pod状态显示为ImagePullBackOff。具体来说,在尝试拉取bitnami/kubectl:1.23.0镜像时,Pod一直无法正常启动,日志中提示网络超时错误。
错误分析
通过kubectl get pods命令,看到部分Pod状态为ImagePullBackOff或ErrImagePull。
1 | |
进一步使用kubectl describe pod <pod-name>查看Pod事件日志,发现如下错误信息:
1 | |
这说明K3s在从docker.io拉取镜像时遇到了网络连接超时问题。
排查过程
1. 网络连接测试
首先,我们使用curl命令测试节点到Docker Hub的网络连接:
1 | |
结果请求超时,初步判断节点无法正常访问Docker Hub仓库。
2. 本地Docker测试
为了进一步确认问题,尝试在节点上使用Docker手动拉取镜像:
1 | |
但镜像成功拉取了。这表明节点本地Docker与Docker Hub之间的网络是通的。
查询后发现K3s 使用的是轻量级的容器运行时 containerd,而传统的 Docker 使用的是 dockerd。尽管它们都是用于运行容器的工具,但它们的镜像存储路径和运行方式有所不同,因此 Docker 和 K3s 的镜像并不共享。而我的docker配置了镜像加速,而k3s使用的默认镜像源。
3. containerd镜像检查
使用crictl images命令检查K3s的containerd是否已拉取镜像:
1 | |
结果显示containerd中并没有成功拉取所需镜像
解决方案
为containerd配置镜像加速器来解决这个问题。具体步骤如下:
- 编辑K3s的containerd配置文件:
1 | |
- 添加以下内容,配置多个国内镜像加速器:
1 | |
- 重启K3s服务使配置生效:
1 | |
- 验证解决效果:
重新部署之前失败的Pod,观察是否能够成功拉取镜像并启动。
或者看能否直接拉取镜像
1 | |
Kubernetes镜像拉取失败问题的排查与解决
http://example.com/2024/09/21/Kubernetes镜像拉取失败问题的排查与解决/