无法从其他Pod访问MicroK8s中MongoDB StatefulSet Pod:EHOSTUNREACH
解决方案
1. 初始化MongoDB副本集
你的MongoDB Pod已启用副本集模式(启动参数包含--replSet MainRepSet),但未完成副本集初始化,这是导致连接失败的核心原因。
执行以下操作完成初始化:
- 进入MongoDB Pod的交互式终端:
kubectl exec -it mongod-0 -- mongosh - 在MongoDB Shell中执行初始化命令(使用集群内部可解析的FQDN):
rs.initiate({ _id: "MainRepSet", members: [{ _id: 0, host: "mongod-0.mongodb-service.default.svc.cluster.local:27017" }] })
执行完成后,可通过rs.status()确认副本集状态为PRIMARY。
2. 调整Node.js连接配置
确保Mongoose连接URI使用集群内部可访问的域名,且副本集参数与配置一致:
mongoose.connect( 'mongodb://mongod-0.mongodb-service.default.svc.cluster.local:27017/authDB?replicaSet=MainRepSet&readPreference=primaryPreferred', { useNewUrlParser: true } )
如果不需要副本集功能,可修改MongoDB启动命令移除--replSet MainRepSet参数,同时简化连接URI:
mongoose.connect('mongodb://mongodb-service:27017/authDB', { useNewUrlParser: true })
3. 网络连通性排查
若初始化后仍无法连接,在Node.js Pod中验证网络:
- 解析Headless Service域名:
kubectl exec -it <你的Node.js Pod名称> -- nslookup mongod-0.mongodb-service - 测试端口连通性:
kubectl exec -it <你的Node.js Pod名称> -- telnet mongod-0.mongodb-service 27017
若域名解析失败,检查MicroK8s的CoreDNS组件状态;若端口不通,确认MongoDB容器bind_ip已设置为0.0.0.0(你的配置已正确设置),且无网络策略限制Pod间通信。
内容的提问来源于stack exchange,提问作者Prathmesh Deshmukh
相关产品推荐
相关产品推荐

