【问题标题】:MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster while using MinikubeMongooseServerSelectionError:使用 Minikube 时无法连接到 MongoDB Atlas 集群中的任何服务器
【发布时间】:2021-04-23 13:22:52
【问题描述】:

我使用节点创建了一个 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 支持对其进行了双重检查)。给每个人相关的网络访问权限

我还可以确认可以通过 MongoDB Compass 使用相同的连接 URL 访问 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-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":小写 RFC 1123 子域必须由小写字母数字组成字符、'-' 或 '.',并且必须以字母数字字符开头和结尾(例如,'example.com',用于验证的正则表达式是 'a-z0-9?(.a-z0-9?)*' )

有什么想法吗??

【问题讨论】:

  • 你能分享你的 pod 的 kubernetes 配置以及外部服务吗!
  • @AbhinavKumar 更新了 pod 和外部服务的 kubernetes 配置。请检查

标签: mongodb mongoose minikube


【解决方案1】:

以下步骤对我有用。来自另一个 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

然后我创建了一个部署,它成功地提取了映像并运行了容器,没有任何问题。

【讨论】:

    【解决方案2】:

    在您的配置中,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'```
    

    【讨论】:

    • 我发布了对我有帮助的答案。我没有创建外部服务。但我想知道 ExternalName 配置会发生什么。很有趣的知道
    • 我认为这只适用于本地环境
    • 哦,很高兴知道。非常感谢 Abhinav。感谢您的帮助
    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 2020-09-08
    • 2022-07-30
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多