K8s环境下Mongoose连接MongoDB副本集超时问题排查
针对你遇到的MongooseServerSelectionError: connection timed out错误,结合mongo Shell能正常连接的情况,以下是具体排查方向:
副本集成员地址解析不匹配
MongoDB副本集初始化时会将成员的主机名/IP记录到自身配置中。如果初始化用的是短域名(如mongodb-0)而非完整的Headless Service域名(mongodb-0.mongodb-headless.staging.svc.cluster.local),Node.js驱动连接后会从MongoDB获取成员列表并尝试用短域名访问,但应用Pod的DNS可能无法正确解析这些短域名,最终导致超时。而mongo Shell通常能自动补全域名或兼容短域名解析,所以可以正常连接。网络策略/防火墙限制
先确认mongo Shell的运行环境:如果是在MongoDB Pod内部或同Namespace的Pod中执行,而应用Pod所在Namespace的网络策略未允许访问MongoDB服务的27017端口,就会出现驱动连接超时。检查应用Namespace的网络策略规则,确保存在允许TCP 27017端口流量到MongoDB Headless Service的规则。Mongoose/驱动版本兼容性或配置缺失
部分旧版本的Mongoose或其依赖的MongoDB驱动,对K8s环境下的副本集连接逻辑存在兼容问题。另外,连接字符串中虽指定了replicaSet=rs0,可尝试添加directConnection=false(确保驱动以副本集模式连接,而非直连单个节点),或检查是否配置了connectTimeoutMS(当前仅设置了serverSelectionTimeoutMS,连接阶段的超时时间可能不足)。副本集Primary节点不稳定
日志中显示ReplicaSetNoPrimary,说明驱动无法识别到可用的Primary节点。mongo Shell可自动切换到Secondary节点执行操作,但Mongoose默认优先尝试连接Primary,若副本集正处于选举过程、Primary节点频繁宕机或成员状态异常,就会触发超时。查看MongoDB节点的日志,确认是否有频繁选举、节点离线等情况。应用Pod的DNS解析异常
应用Pod的DNS服务(如CoreDNS)可能存在延迟或缓存失效,导致无法及时解析MongoDB节点的Headless Service域名。在应用Pod内执行nslookup mongodb-0.mongodb-headless.staging.svc.cluster.local,检查解析是否正常、是否存在延迟。
内容的提问来源于stack exchange,提问作者Margach Chris

