服务器选择在30000毫秒后超时{“ name”:“ MongooseTimeoutError”,“ reason”:{“ name”:“ MongoNetworkError”}}

时间:2020-01-19 01:48:52

标签: kubernetes google-cloud-platform google-kubernetes-engine kubernetes-pod mongodb-atlas

上下文

我正在使用 GCP ,更具体地说是 GKE 将我的应用程序部署在容器/吊舱中。我正在尝试部署的应用程序在node js(express js)中。该应用程序连接到 MongoDB Atlas (免费M0层)。

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

我允许MongoDB Atlas集群的任何人(0.0.0.0/0)访问,从而使调试变得更容易。

当我将我的项目与CI / CD一起部署到GKE时,一切都会顺利进行。

问题

部署项目后,事情开始变得棘手。我收到 CrashLoopBackOff 。检查日志后,它一直崩溃,这是我找到的:

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

我相信问题是我的Pod无法通过其常规端口27017连接到MongoDB Atlas ,从而向我发送超时错误。

这是我尝试过的:

  • 在GCP的VPC网络中添加新的防火墙规则gcloud compute firewall-rules create allow-mongodb --allow tcp:27017

  • 在我的deployment.yml中添加以下键/值:dnsPolicy: Default

结论

花了几个小时解决这个问题之后,我仍然找不到任何解决方案,而且我的想法已经用完了。 仅供参考,我是GCP和Kubernetes的新手,所以我可能在这里错过了一些重要内容,但不确定是什么。

如果某个善良的人最终找到该职位,并且知道答案,我会很高兴他/她可以在这里帮助我。

有一个好的。

干杯

1 个答案:

答案 0 :(得分:2)

如果您认为已使用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/

让我知道现在是否更好。