You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes跨命名空间访问MongoDB副本集失败求助

MongoDB副本集连接失败问题排查

环境与操作背景

  • 集群组件:
    • app1命名空间下的GoLang应用,需读写MongoDB数据
    • ng-mongo命名空间下以StatefulSet部署的单副本MongoDB副本集
  • 已执行操作:
    1. 在ng-mongo命名空间创建MongoDB无头服务
    2. 部署MongoDB StatefulSet并执行rs.initiate({_id: "rs0",members: [{_id: 0, host: "mongo-0"}]})初始化副本集,返回{ ok: 1 }
    3. 在app1命名空间创建ExternalName类型服务app1,指向mongo.ng-mongo.svc.cluster.local
    4. Go应用使用连接字符串mongodb://app1尝试连接

报错信息

2022/11/22 12:49:47 server selection error: server selection timeout, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: mongo-0:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp: lookup mongo-0 on 10.96.0.10:53: no such host }, ] }

补充说明:未设置MongoDB用户名和密码

问题原因

核心问题是MongoDB副本集初始化时使用的节点短域名mongo-0仅在ng-mongo命名空间内可解析,app1所在命名空间无法识别该地址。

具体过程:

  • Go应用通过mongodb://app1连接时,先通过ExternalName服务成功定位到mongo.ng-mongo.svc.cluster.local,建立初始连接
  • 但MongoDB驱动会从副本集配置中获取成员列表(即mongo-0:27017),并尝试直接连接这些成员
  • 由于app1命名空间的DNS无法解析mongo-0这个短域名,驱动后续连接失败,最终触发服务器选择超时。

解决建议

重新初始化副本集时使用跨命名空间可解析的完整FQDN:

rs.initiate({_id: "rs0",members: [{_id: 0, host: "mongo-0.mongo.ng-mongo.svc.cluster.local"}]})

这里的mongo-0.mongo.ng-mongo.svc.cluster.local是StatefulSet Pod的完整域名(Pod名+无头服务名+命名空间+集群域名),集群内任意命名空间都能正常解析。


内容的提问来源于stack exchange,提问作者Jananath Banuka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:30:49