k8s 拉取镜像时,请求提前断开(EOF)导致拉取失败

这次问题发生在使用 Keycloak 官方 quickstart YAML 部署资源时:

复制代码
kubectl create -f https://raw.githubusercontent.com/keycloak/keycloakquickstarts/refs/heads/main/kubernetes/keycloak.yaml

创建出来的资源包括:

复制代码
service/keycloak
service/keycloak-discovery
statefulset.apps/keycloak
deployment.apps/postgres
service/postgres

但是 Postgres Pod 一直无法启动,事件中反复出现镜像拉取失败:

复制代码
Failed to pull image "mirror.gcr.io/postgres:17":failed to pull and unpack image "mirror.gcr.io/postgres:17":failed to copy:failed to do request:Get "https://mirror.gcr.io/v2/postgres/..." EOF

这里的关键错误是:

复制代码
EOF

它表示 containerd 在拉取镜像时,请求还没正常完成,连接就被提前断开了。最开始怀疑是 k3s 节点没有配置代理,或者 containerd 没有走代理。

随后检查了 k3s 的配置目录:

复制代码
sudo ls -l /etc/rancher/k3s/

结果只有:

复制代码
config.yamlk3s.yaml

没有:

复制代码
registries.yaml

说明当前 k3s 没有通过 /etc/rancher/k3s/registries.yaml 配置镜像仓库 mirror。

然后继续检查 k3s 的 systemd 环境变量:

复制代码
sudo systemctl show k3s --property=Environment

发现 k3s 已经配置了代理:

复制代码
HTTP_PROXY=http://127.0.0.1:7897HTTPS_PROXY=http://127.0.0.1:7897NO_PROXY=...

为了确认代理本身是否可用,又分别用普通用户和 root 用户测试:

复制代码
curl -I -x http://127.0.0.1:7897 https://mirror.gcr.iosudo curl -I -x http://127.0.0.1:7897 https://mirror.gcr.io

返回中出现:

复制代码
HTTP/1.1 200 Connection established

说明代理连接本身是通的。后面的 HTTP/2 405 只是因为 mirror.gcr.io 根路径不接受这种 HEAD 请求,并不代表代理失败。

最后直接用 k3s 的 crictl 测试两个镜像源:

复制代码
sudo k3s crictl pull mirror.gcr.io/postgres:17

结果失败:

复制代码
EOF

再测试 Docker Hub 原始镜像:

复制代码
sudo k3s crictl pull docker.io/library/postgres:17

结果成功:

复制代码
Image is up to date for sha256:...

这一步最终定位出问题原因:
k3s 的代理链路是可用的,postgres:17 镜像本身也可以正常拉取,真正的问题是 mirror.gcr.io/postgres:17 这个镜像源在当前网络环境下不稳定。

最终解决方式是不要继续使用:

复制代码
image: mirror.gcr.io/postgres:17

而是改成:

复制代码
image: docker.io/library/postgres:17

如果资源已经创建,可以直接修改 Deployment 镜像:

复制代码
kubectl set image deployment/postgres postgres=docker.io/library/postgres:17 -n keycloak

然后查看 rollout 状态:

复制代码
kubectl rollout status deployment/postgres -n keycloak

也可以把远程 YAML 下载到本地后替换镜像地址:

复制代码
curl -L -o keycloak.yaml https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/refs/heads/main/kubernetes/keycloak.yamlsed -i 's#mirror.gcr.io/postgres:17#docker.io/library/postgres:17#g' keycloak.yamlkubectl apply -n keycloak -f keycloak.yaml

总结来说,这次排查链路是:
Pod 拉取镜像失败 → 发现错误为 mirror.gcr.io/postgres:17 EOF → 检查 k3s 是否配置 registry mirror → 检查 k3s 是否配置 HTTP 代理 → 验证代理端口可用 → 使用 crictl pull 分别测试 mirror.gcr.iodocker.io → 确认 Docker Hub 原始镜像可拉、mirror.gcr.io 不可拉 → 将 YAML 中的镜像源从 mirror.gcr.io/postgres:17 改为 docker.io/library/postgres:17,问题解决。

相关推荐
风曦Kisaki32 分钟前
# Kubernetes(K8s)笔记Day12 :K8s 七层代理(Ingress 和 Ingress Controller)
linux·笔记·云原生·容器·kubernetes
雨辰AI5 小时前
达梦 DM9 K8s 密评合规部署|等保三级 + 密评双标准安全加固(金融级实测通过)
安全·云原生·容器·金融·kubernetes·政务
雨辰AI6 小时前
K8s 数据库 Secret 加密实战|密码明文漏洞彻底修复,等保密评双合规(金仓 / 达梦双库适配)
数据库·容器·kubernetes
人间凡尔赛6 小时前
Kubernetes十周年:从Cloud Native到AI Native的架构范式跃迁
后端·云原生·架构
Elastic 中国社区官方博客6 小时前
一个字段,覆盖所有模态:Elasticsearch 的 semantic 字段如何自动索引和搜索图像、音频、视频和 PDF
大数据·数据库·elasticsearch·ai·云原生·pdf·全文检索
Chasing__Dreams7 小时前
Go 语言学习笔记
云原生·容器·kubernetes
聚搜云——JuSouClouD8 小时前
深圳阿里云代理商:K8s Pod OOM智能排查修复指南
阿里云·kubernetes·云计算
明王明王8 小时前
从零搭建一个单节点 K8S 可观测实验室(六):安装 Tempo + OpenTelemetry,构建链路追踪链路
云原生·容器·kubernetes
wsad05328 小时前
Docker 网络故障排查记:当 bridge 模式失效时,host 模式如何救场
运维·docker·容器
张毅2004-10-108 小时前
docker详解:安装docker,docker架构,docker镜像、容器、网络、存储,容器监控,容器日志,综合实验
linux·运维·docker·云原生·云计算