首页 > 解决方案 > 服务器选择在 30000 毫秒后超时 {"name":"MongooseTimeoutError","re​​ason":{"name":"MongoNetworkError"}}

问题描述

语境

我正在使用GCP,更具体地说是GKE在容器/pod 中部署我的应用程序。我正在尝试部署的应用程序位于节点 js(express js)中。此应用程序连接到MongoDB Atlas (免费层 M0)

在本地运行项目时没有问题。它连接到数据库,我可以毫无问题地添加/删除文档。

我允许任何人 (0.0.0.0/0) 访问我的 MongoDB Atlas Cluster 以使其更容易调试。

当我使用 CI/CD Deploy to GKE 部署我的项目时,一切都很顺利。

问题

一旦我部署了我的项目,事情就开始变得棘手。我得到一个CrashLoopBackOff。检查日志后它一直在崩溃,这是我发现的:

error: Server selection timed out after 30000 ms {"name":"MongooseTimeoutError","reason":{"name":"MongoNetworkError"}}

潜在客户

我认为问题在于我的 pod 无法通过其常规端口 27017 连接到 MongoDB Atlas,这向我发送了超时错误。

这是我尝试过的:

结论

在这个问题上花费了几个小时后,我仍然没有找到任何解决方案,而且我的想法已经不多了。仅供参考,我是 GCP 和 Kubernetes 的新手,所以我可能在这里遗漏了一些重要的东西,但不确定是什么。

如果某个好心人最终出现在那个帖子上并且知道答案,如果他/她能在这里帮助我,我会很高兴。

祝你有个好的一天。

干杯,

标签: kubernetesgoogle-cloud-platformgoogle-kubernetes-enginekubernetes-podmongodb-atlas

解决方案


如果你认为网络策略已经通过 GCP 防火墙规则正确设置,让我们在 kubernetes 中一步一步地解决它。

  1. 检查您是否可以从容器本身连接到 mongodb Atlas。
kubectl exec <node_app_pod> --command -- curl <mongo_url>:27017
  1. 检查 Kubernetes 中的网络策略。为了简化,允许所有出口
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all
spec:
  podSelector: {}
  egress:
  - {}
  policyTypes:
  - Egress

如果您只想设置端口 27017,您可以使用此文档进行调整:

https://kubernetes.io/docs/concepts/services-networking/network-policies/

让我知道现在是否更好。


推荐阅读