Openshift Online 3 Starter中MongoDB突发EHOSTUNREACH连接故障求助
首先把你遇到的错误信息贴出来方便上下文参考:
/opt/app-root/src/node_modules/mongodb/lib/server.js:242
process.nextTick(function() { throw err; })
^
Error: connect EHOSTUNREACH 172.30.173.215:27017
at Object.exports._errnoException (util.js:1020:11)
at exports._exceptionWithHostPort (util.js:1043:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1086:14)
npm info lifecycle bolao_2018@0.1.0~start: Faile...
这个错误我在OpenShift集群里处理过好几次,虽然你没手动修改MongoDB连接配置,但OpenShift内部的服务调度、网络状态变化都可能触发这类问题,下面是几个排查和解决的方向:
检查MongoDB服务实例的运行状态
172.30开头的是OpenShift集群的内部ClusterIP,首先得确认MongoDB对应的Pod是否正常运行。你可以用OpenShift CLI执行:oc get pods -n <你的项目命名空间>看看MongoDB的Pod状态是不是
Running,如果是CrashLoopBackOff或者Pending,那问题出在MongoDB服务本身,需要排查Pod启动失败的原因(比如存储卷挂载错误、资源配额不足)。验证MongoDB服务的端点关联情况
有时候服务虽然存在,但对应的端点(Endpoints)没有正确绑定到运行的Pod,导致请求找不到目标。执行命令查看服务详情:oc describe svc <MongoDB服务名称> -n <你的项目命名空间>在输出的
Endpoints部分,如果是空的或者没有匹配到MongoDB Pod的IP,说明服务和Pod的关联出了问题,可能是标签选择器不匹配,或者Pod的标签被意外修改了。检查网络策略的访问限制
OpenShift默认的网络插件会通过网络策略控制Pod间的访问。如果最近集群里新增或修改了网络策略,可能阻止了你应用的Pod访问MongoDB服务的27017端口。你可以执行命令查看当前命名空间的网络策略:oc get networkpolicy -n <你的项目命名空间>确认是否有策略限制了应用Pod到MongoDB服务的流量,如果有,需要调整策略允许相关访问。
重启应用Pod刷新网络配置
偶尔OpenShift的Pod会出现临时的网络配置异常,重启应用Pod可以让它重新获取集群网络的相关配置,解决DNS解析或路由的临时问题。执行命令删除应用Pod(OpenShift会自动重新创建一个):oc delete pod <你的应用Pod名称> -n <你的项目命名空间>排查连接配置是否隐藏硬编码IP的坑
虽然你说没修改配置,但如果你的连接字符串里硬编码了MongoDB的ClusterIP(就是错误里的172.30.173.215),那当MongoDB服务被重新调度或者重启时,ClusterIP可能会变化,导致连接失败。正确的做法是使用MongoDB服务的名称作为连接地址(比如mongodb://<服务名称>:27017/),OpenShift内部DNS会自动解析到对应的ClusterIP,避免IP变动的问题。
内容的提问来源于stack exchange,提问作者Gabriel Muniz Antonio

