Kubernetes Pod连接MongoDB实例超时问题求助
问题排查:K3s集群Pod无法连接MongoDB(自建/托管)
环境信息
- Kubernetes集群:基于kube-hetzner在Hetzner搭建,Server Version: v1.26.4+k3s1
- Client Version: v1.26.3
- Mongosh版本:1.8.1
- 核心现象:Pod内可正常ping 8.8.8.8、发起curl请求,但连接MongoDB(自建Docker部署或MongoDB Atlas托管)均报错:
本地使用相同连接串可通过MongoDB Compass/mongosh正常连接。MongoServerSelectionError: Server selection timed out after 30000 ms
排查与解决步骤
1. 校验MongoDB的访问权限
- MongoDB Atlas:检查集群IP白名单是否包含K3s集群所有节点的公网IP,测试阶段可临时允许
0.0.0.0/0(生产环境不建议),排除白名单拦截问题。 - 自建MongoDB:
- 检查
mongod.conf中的bindIp配置,确认是否设置为0.0.0.0(允许所有IP访问),默认可能仅绑定127.0.0.1导致外部无法连接。 - 检查宿主机防火墙(ufw/iptables)是否开放MongoDB默认端口
27017,确保集群节点IP能访问该端口。
- 检查
2. 验证端口连通性(TCP层面)
ping仅验证ICMP协议,需用nc或telnet测试TCP端口是否可达:
# 针对MongoDB Atlas:先解析SRV记录,再测试节点端口 nslookup -type=SRV _mongodb._tcp.cluster0.fdofntt.mongodb.net nc -zv cluster0-shard-00-00.fdofntt.mongodb.net 27017 # 针对自建MongoDB nc -zv <自建MongoDB_IP> 27017
若端口不通,回到第一步排查防火墙/白名单配置。
3. 检查K3s网络策略
kube-hetzner默认可能配置网络策略,或自定义策略限制了Pod出站流量:
kubectl get networkpolicies --all-namespaces
若存在阻止Pod访问27017端口的规则,需修改策略添加允许出站的规则。
4. 确认DNS解析正常
测试Pod内是否能正常解析MongoDB域名:
nslookup cluster0.fdofntt.mongodb.net
若解析失败,检查CoreDNS运行状态:
kubectl get pods -n kube-system -l k8s-app=kube-dns
若CoreDNS异常,重启相关Pod或排查集群DNS配置。
5. 核对连接串正确性
- SRV连接串:确认格式无拼写错误,mongosh 1.8.1支持SRV格式,但需确保域名解析正常。
- 自建MongoDB连接串:若开启认证,需指定
authSource(如使用admin用户时添加?authSource=admin):mongosh mongodb://<user>:<password>@<ip>:27017/test?authSource=admin
6. 检查Hetzner服务器出站规则
Hetzner默认开放出站流量,但如果集群使用了kube-hetzner自带的防火墙模块,需在Hetzner控制台确认是否允许TCP 27017端口的出站请求。
内容的提问来源于stack exchange,提问作者cre8
相关产品推荐
相关产品推荐

