基于hobby-kube指南搭建Scaleway集群时节点无法拉取Docker镜像求助
问题定位与解决方案
核心根因可能性优先级排序
- Docker daemon DNS配置异常
ping公网域名正常说明系统级DNS配置有效,但Docker默认会单独配置8.8.8.8/8.8.4.4作为DNS解析服务器,Scaleway部分可用区会限制公共DNS的出站请求,导致Docker进程无法解析镜像仓库域名,出现拉取超时。 - 节点路由规则冲突
WireGuard配置后可能修改了默认出站路由,或者Docker网桥的出站流量被强制转发到VPN隧道,而集群主节点未配置VPN子网的NAT转发规则,导致Docker的公网请求走隧道后无法正常响应。 - 误配置Docker代理
工作节点的Docker服务可能误配置了不存在的HTTP/HTTPS代理,导致公网请求被拦截。
分步排查&修复方案
第一步:修复Docker DNS配置
- 对比主节点和工作节点的Docker daemon配置,执行命令查看:
cat /etc/docker/daemon.json
- 如果工作节点配置中无
dns字段,在配置文件中添加和系统一致的DNS服务器(可通过主节点cat /etc/resolv.conf获取Scaleway官方DNS地址),示例:
{ "dns": ["10.5.0.1", "1.1.1.1"] }
- 重启Docker服务生效:
systemctl daemon-reload systemctl restart docker
- 验证镜像拉取是否恢复:
docker pull hello-world
第二步:排查路由规则冲突
如果上述操作无效,检查工作节点的路由表:
- 执行
ip route show查看默认路由,确认公网请求的下一跳是公网网关而非WireGuard接口 - 检查iptables NAT规则,确认Docker子网的出站流量走公网接口:
iptables -t nat -L POSTROUTING -n
- 如果确认Docker流量走了WireGuard隧道,在主节点上开启WireGuard子网的IP转发和NAT:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
第三步:检查Docker代理配置
- 查看Docker服务的代理配置文件:
cat /etc/systemd/system/docker.service.d/http-proxy.conf
- 如果存在代理配置且已失效,删除该文件后重启Docker服务即可。
完成上述操作后重新拉取Weave镜像,对应的Pod会自动恢复运行状态。
内容的提问来源于stack exchange,提问作者Łukasz Kot
相关产品推荐
相关产品推荐

