求助:K8s拉取Podman本地仓库镜像时出现连接拒绝错误
问题分析
kubelet尝试访问localhost:5001时出现连接拒绝,核心原因是:你用Podman搭建的本地镜像仓库大概率只绑定了主机的127.0.0.1地址,而K8s的容器运行时(如containerd)的网络上下文与主机命令行不同,或者仓库未监听虚拟机的实际网卡IP,导致kubelet无法建立连接。
解决方案
1. 修改镜像仓库的监听地址
默认启动的Podman仓库仅监听127.0.0.1,需改为监听所有可用网卡,确保节点的实际IP能访问仓库:
- 停止并删除现有仓库容器:
podman stop registry podman rm registry
- 重新启动仓库,指定监听
0.0.0.0:
podman run -d -p 0.0.0.0:5001:5000 --name registry registry:2
2. 替换镜像地址为节点实际IP
将K8s部署文件中的镜像引用从localhost:5001/datawire/aes:3.1.0改为虚拟机的实际网卡IP(比如192.168.1.100:5001/datawire/aes:3.1.0)。
kubelet运行在节点环境中,localhost指向节点自身,但容器运行时的网络与主机网络存在隔离,使用节点实际IP可确保请求能正确路由到镜像仓库。
3. 配置containerd允许访问非安全仓库
如果你的仓库是HTTP协议(未配置HTTPS),containerd默认会拒绝访问,需修改配置:
- 编辑containerd配置文件
/etc/containerd/config.toml,添加以下内容:
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."[你的仓库IP]:5001"] endpoint = ["http://[你的仓库IP]:5001"] [plugins."io.containerd.grpc.v1.cri".registry.configs."[你的仓库IP]:5001".tls] insecure_skip_verify = true
- 重启containerd服务:
sudo systemctl restart containerd
4. 验证仓库连通性
在节点上执行curl命令,确认仓库可正常访问:
curl http://[你的仓库IP]:5001/v2/datawire/aes/manifests/3.1.0
若能返回镜像manifest内容,说明仓库已可被节点正常访问,此时K8s即可拉取镜像。
内容的提问来源于stack exchange,提问作者BKruger
相关产品推荐
相关产品推荐

