Kubernetes跨命名空间访问MongoDB副本集失败求助
MongoDB副本集连接失败问题排查
环境与操作背景
- 集群组件:
- app1命名空间下的GoLang应用,需读写MongoDB数据
- ng-mongo命名空间下以StatefulSet部署的单副本MongoDB副本集
- 已执行操作:
- 在ng-mongo命名空间创建MongoDB无头服务
- 部署MongoDB StatefulSet并执行
rs.initiate({_id: "rs0",members: [{_id: 0, host: "mongo-0"}]})初始化副本集,返回{ ok: 1 } - 在app1命名空间创建ExternalName类型服务
app1,指向mongo.ng-mongo.svc.cluster.local - 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
相关产品推荐
相关产品推荐

