kubernetes - 服务器选择在 30000 毫秒后超时 {"name":"MongooseTimeoutError","reason":{"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 中的我的 VPC 网络中添加一个新的防火墙规则:
gcloud compute firewall-rules create allow-mongodb --allow tcp:27017
在我的 deployment.yml 中添加以下键/值:
dnsPolicy: Default
结论
在这个问题上花费了几个小时后,我仍然没有找到任何解决方案,而且我的想法已经不多了。仅供参考,我是 GCP 和 Kubernetes 的新手,所以我可能在这里遗漏了一些重要的东西,但不确定是什么。
如果某个好心人最终出现在那个帖子上并且知道答案,如果他/她能在这里帮助我,我会很高兴。
祝你有个好的一天。
干杯,
解决方案
如果你认为网络策略已经通过 GCP 防火墙规则正确设置,让我们在 kubernetes 中一步一步地解决它。
- 检查您是否可以从容器本身连接到 mongodb Atlas。
kubectl exec <node_app_pod> --command -- curl <mongo_url>:27017
- 检查 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/
让我知道现在是否更好。
推荐阅读
- firebase - NoSuchMethodError:在 null 上调用了 getter 数据,接收者:null
- android - 查尔斯在浏览器上工作,但不适用于应用程序 - Android
- python - python 多处理 __getnewargs__()
- angular - mat-form-field matInput、matSuffix 和反应形式的意外行为
- apache-spark - Kubernetes 运动以集群模式提交——包没有按预期工作
- c++ - 我的 C++ 程序有一个大问题
- python - 在 anaconda 中安装 OpenCV 未显示在 Windows 10 的 VS Code 中
- swift - 使用 NSArrayController 绑定在核心数据中保存 NSTableView 重新排序
- c# - 为什么 Azure 搜索索引器会停止在 Live 应用上工作
- ruby-on-rails - 模型之间的 Rails 关联