如何解决MongooseServerSelectionError:在使用 Minikube 时无法连接到 MongoDB Atlas 集群中的任何服务器
我使用 node 创建了一个 REST API,并使用 Kubernetes 和 Docker 将它容器化。 出于开发目的,kubernetes pod 在 minikube 环境中运行。
应用程序运行良好,现在出现以下错误。
[distribution] Initial Distribution API Database connection error occured - MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted. Make sure your current IP address is on your Atlas cluster's IP whitelist: https://docs.atlas.mongodb.com/security-whitelist/
[distribution] at NativeConnection.Connection.openUri (/app/node_modules/mongoose/lib/connection.js:830:32)
[distribution] at Mongoose.connect (/app/node_modules/mongoose/lib/index.js:335:15)
[distribution] at /app/src/index.ts:60:8
[distribution] at step (/app/src/index.ts:34:23)
[distribution] at Object.next (/app/src/index.ts:15:53)
[distribution] at fulfilled (/app/src/index.ts:6:58)
[distribution] at processTicksAndRejections (node:internal/process/task_queues:93:5) {
[distribution] reason: TopologyDescription {
[distribution] type: 'ReplicaSetNoPrimary',[distribution] setName: null,[distribution] maxSetVersion: null,[distribution] maxElectionId: null,[distribution] servers: Map(3) {
[distribution] 'cluster0-shard-00-00.psdty.mongodb.net:27017' => [ServerDescription],[distribution] 'cluster0-shard-00-01.psdty.mongodb.net:27017' => [ServerDescription],[distribution] 'cluster0-shard-00-02.psdty.mongodb.net:27017' => [ServerDescription]
[distribution] },[distribution] stale: false,[distribution] compatible: true,[distribution] compatibilityError: null,[distribution] logicalSessionTimeoutMinutes: null,[distribution] heartbeatFrequencyMS: 10000,[distribution] localThresholdMS: 15,[distribution] commonWireVersion: null
[distribution] }
[distribution] }
该问题似乎是 MongoDB 连接 URL/访问问题,但连接字符串是正确的。 (使用 MongoDB Cloud 支持进行了双重检查)。给每个人相关的网络访问权限
我还可以确认可以使用相同的连接 URL 通过 MongoDB Compass 访问 MongoCloudDB
我的猜测是无法从 minikube 内的 pod 与 MongoDB 数据库建立连接。
你们有没有人知道如何克服这个问题??
pod 和外部服务的 kubernetes 配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: distribution-depl
spec:
replicas: 1
selector:
matchLabels:
app: distribution
template:
metadata:
labels:
app: distribution
spec:
containers:
- name: distribution
image: ssomlk/distribution
env:
- name: MONGO_URI
value: 'mongodb://ssomlk:<password>@cluster0-shard-00-00.yeu7t.mongodb.net:27017,cluster0-shard-00-01.yeu7t.mongodb.net:27017,cluster0-shard-00-02.yeu7t.mongodb.net:27017/<db_name>?ssl=true&replicaSet=atlas-fznj9q-shard-0&authSource=admin&retryWrites=true&w=majority'
- name: JWT_ACCESS_TOKEN_KEY
valueFrom:
secretKeyRef:
name: jwt-secret
key: JWT_ACCESS_TOKEN_KEY
- name: JWT_REFRESH_TOKEN_KEY
valueFrom:
secretKeyRef:
name: jwt-secret
key: JWT_REFRESH_TOKEN_KEY
- name: JWT_ACCESS_TOKEN_EXPIRES_IN
value: '15m'
- name: JWT_REFRESH_TOKEN_EXPIRES_IN
value: '60m'
- name: NATS_CLIENT_ID
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NATS_URL
value: 'http://nats-srv:4222'
- name: NATS_CLUSTER_ID
value: nats-distribution-mailing
- name: MAIL_USER
valueFrom:
secretKeyRef:
name: mail-secret
key: MAIL_USER
- name: MAIL_PWD
valueFrom:
secretKeyRef:
name: mail-secret
key: MAIL_PWD
- name: POOL_SIZE
value: '8'
---
apiVersion: v1
kind: Service
metadata:
name: distribution-srv
spec:
type: ClusterIP
selector:
app: distribution
ports:
- name: distribution
protocol: TCP
port: 3000
targetPort: 3000
使用尝试实施 ExternalService 时收到的错误进行编辑
- 服务“distribution-database-srv”无效:
- spec.externalName: 无效值:"mongodb://ssomlk:@cluster0-shard-00-00.y8kuj.mongodb.net:27017,cluster0-shard-00-01.y8kuj.mongodb.net:27017,cluster0-shard-00-02.y8kuj.mongodb.net:27017/
?ssl=true&replicaSet=atlas-fznj9q-shard-0&authSource=admin&retryWrites=true&w=majority”:不得超过253个字符 - spec.externalName: 无效值:"mongodb://ssomlk:@cluster0-shard-00-00.y8kuj.mongodb.net:27017,cluster0-shard-00-02.y8kuj.mongodb.net:27017/
?ssl=true&replicaSet=atlas-fznj9q-shard-0&authSource=admin&retryWrites=true&w=majority”:小写的 RFC 1123 子域必须由小写字母数字组成字符,“-”或“.”,并且必须以字母数字字符开头和结尾(例如“example.com”,用于验证的正则表达式为“a-z0-9?(.a-z0-9?)*” )
有什么想法吗??
解决方法
在您的配置中,mongdb uri 无法从集群内部解析,您必须创建一个外部服务以使 uri 可解析。请参阅下面的配置作为示例。
kind: Deployment
metadata:
name: distribution-depl
spec:
replicas: 1
selector:
matchLabels:
app: distribution
template:
metadata:
labels:
app: distribution
spec:
containers:
- name: distribution
image: ssomlk/distribution
env:
- name: MONGO_URI
value: my-service
- name: JWT_ACCESS_TOKEN_KEY
valueFrom:
secretKeyRef:
name: jwt-secret
key: JWT_ACCESS_TOKEN_KEY
- name: JWT_REFRESH_TOKEN_KEY
valueFrom:
secretKeyRef:
name: jwt-secret
key: JWT_REFRESH_TOKEN_KEY
- name: JWT_ACCESS_TOKEN_EXPIRES_IN
value: '15m'
- name: JWT_REFRESH_TOKEN_EXPIRES_IN
value: '60m'
- name: NATS_CLIENT_ID
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: NATS_URL
value: 'http://nats-srv:4222'
- name: NATS_CLUSTER_ID
value: nats-distribution-mailing
- name: MAIL_USER
valueFrom:
secretKeyRef:
name: mail-secret
key: MAIL_USER
- name: MAIL_PWD
valueFrom:
secretKeyRef:
name: mail-secret
key: MAIL_PWD
- name: POOL_SIZE
value: '8'
---
apiVersion: v1
kind: Service
metadata:
name: distribution-srv
spec:
type: ClusterIP
selector:
app: distribution
ports:
- name: distribution
protocol: TCP
port: 3000
targetPort: 3000
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: 'mongodb://ssomlk:<password>@cluster0-shard-00-00.yeu7t.mongodb.net:27017,cluster0-shard-00-01.yeu7t.mongodb.net:27017,cluster0-shard-00-02.yeu7t.mongodb.net:27017/<db_name>?ssl=true&replicaSet=atlas-fznj9q-shard-0&authSource=admin&retryWrites=true&w=majority'```
,
以下步骤对我有用。来自其他 Github 用户的帮助。
I have stopped and deleted the existing minikube
Downloaded "https://github.com/kubernetes/minikube/releases/download/v1.8.2/minikube-windows-amd64.exe" and renamed it to minikube.exe
Placed the above exe in the same folder in which my kubectl.exe is existing. (C:\kube). This path is added to the environment variable "Path" of my user.
Created a hyperv switch,Open Hyper-V Manager,Click on Virtual Switch Manager,Create New Virtual Network Switch,Select external type,and OK.
Ran this command `minikube start driver="hyperv" --hyperv-virtual-switch="MY-SWITCH"`
minikube successfully started
然后我创建了一个部署,它成功地拉取了镜像并运行了容器,没有任何问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。