Minikube / kubernetes吊舱无法连接到Mongodb Atlas

时间:2020-05-15 13:14:13

标签: java spring-boot kubernetes minikube mongodb-atlas

我有一个正在尝试在Minkube中测试的Spring Boot应用程序,该应用程序应连接到MongoDb Atlas。

在我的PC上运行应用程序时,它连接到我的数据库,在创建并作为Docker映像运行后,它也连接到我的PC上的Ubuntu VM。在Minikube上作为Kubernetes部署运行时,它不会连接到Mongodb Atlas。

必须缺少一个配置步骤,但我只是不知道什么。我认为我的问题是“我需要做些特殊的事情来允许Minikube / Kubernetes查找外部URL吗?”

如果有人有任何建议,我会在下面将我的错误和当前的调查途径公布下来。


在Kubernetes中运行时出现嵌套错误(错误消息很长,所以只是相关的错误-我认为),因为您可以看到它找不到我的数据库URL,并抱怨“找不到DNS名称”。可以通过在Intelij中本地运行程序并稍微修改URL来复制此内容

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mongodb.client.MongoClient]: Factory method 'mongo' threw exception; nested exception is com.mongodb.MongoConfigurationException: Unable to look up TXT record for host xxxxxx-erble.gcp.mongodb.net
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
        ... 128 common frames omitted
Caused by: com.mongodb.MongoConfigurationException: Unable to look up TXT record for host xxxxxx-erble.gcp.mongodb.net
        at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:131) ~[mongodb-driver-core-4.0.1.jar:na]
        at com.mongodb.ConnectionString.<init>(ConnectionString.java:378) ~[mongodb-driver-core-4.0.1.jar:na]
        at org.springframework.boot.autoconfigure.mongo.MongoClientFactorySupport.applyHostAndPort(MongoClientFactorySupport.java:101) ~[spring-boot-autoconfigure-2.3.0.M4.jar:2.3.0.M4]
        at org.springframework.boot.autoconfigure.mongo.MongoClientFactorySupport.computeClientSettings(MongoClientFactorySupport.java:69) ~[spring-boot-autoconfigure-2.3.0.M4.jar:2.3.0.M4]
        at org.springframework.boot.autoconfigure.mongo.MongoClientFactorySupport.createMongoClient(MongoClientFactorySupport.java:60) ~[spring-boot-autoconfigure-2.3.0.M4.jar:2.3.0.M4]
        at org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration.mongo(MongoAutoConfiguration.java:57) ~[spring-boot-autoconfigure-2.3.0.M4.jar:2.3.0.M4]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
        ... 129 common frames omitted
Caused by: javax.naming.NameNotFoundException: DNS name not found [response code 3]
        at jdk.naming.dns/com.sun.jndi.dns.DnsClient.checkResponseCode(DnsClient.java:664) ~[jdk.naming.dns:na]
        at jdk.naming.dns/com.sun.jndi.dns.DnsClient.isMatchResponse(DnsClient.java:582) ~[jdk.naming.dns:na]
        at jdk.naming.dns/com.sun.jndi.dns.DnsClient.doUdpQuery(DnsClient.java:430) ~[jdk.naming.dns:na]
        at jdk.naming.dns/com.sun.jndi.dns.DnsClient.query(DnsClient.java:214) ~[jdk.naming.dns:na]
        at jdk.naming.dns/com.sun.jndi.dns.Resolver.query(Resolver.java:81) ~[jdk.naming.dns:na]
        at jdk.naming.dns/com.sun.jndi.dns.DnsContext.c_getAttributes(DnsContext.java:434) ~[jdk.naming.dns:na]
        at java.naming/com.sun.jndi.toolkit.ctx.ComponentDirContext.p_getAttributes(ComponentDirContext.java:235) ~[na:na]
        at java.naming/com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:141) ~[na:na]
        at java.naming/com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.getAttributes(PartialCompositeDirContext.java:129) ~[na:na]
        at java.naming/javax.naming.directory.InitialDirContext.getAttributes(InitialDirContext.java:171) ~[na:na]
        at com.mongodb.internal.dns.DefaultDnsResolver.resolveAdditionalQueryParametersFromTxtRecords(DefaultDnsResolver.java:114) ~[mongodb-driver-core-4.0.1.jar:na]
        ... 139 common frames omitted

我尝试过的事情:

  • 在我的deployment.yaml中:将dnsPolicy设置为Default(加上所有其他可能的值)
  • 创建外部服务,并使用externalName代替我的URL
kind: Service
apiVersion: v1
metadata:
  name: mongodbatlas
spec:
  type: ExternalName
  externalName: xxxxx-erble.gcp.mongodb.net
  • 创建允许所有出口的网络策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-egress
spec:
  podSelector: {}
  egress:
    - {}
  policyTypes:
    - Egress

下面是我的部署和服务YAML,其中删除了个人用户名/密码/存储库详细信息:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
  labels:
    app: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      dnsPolicy: Default
      containers:
        - name: frontend
          image: <DOCKERRPO>/<REPO>:front
          imagePullPolicy: Always
          env:
            - name: MONGODB_ATLAS
              value: mongodb+srv://<USERNAME>:<PASSWORD>@xxxxxx-erble.gcp.mongodb.net/test?retryWrites=true&w=majority
            - name: FRONT_SERVER_PORT
              value: "8080"
            - name: spring_profiles_active
              value: dev
          ports:
            - containerPort: 8080
          resources:
            limits:
              memory: 512Mi
      imagePullSecrets:
        - name: <SECRET>
---
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  ports:
    - nodePort: 32000
      port: 80
      targetPort: 8080
  selector:
    app: frontend
  type: NodePort

1 个答案:

答案 0 :(得分:1)

找到了解决方法:

由于某种原因,我的设置中的一个组件(spring boot / kubernetes / minikube / virtualbox等)在解决DNS SRV URI时出现问题。提供用于连接到我的集群的MongoDB Atlas URI失败,将其更改为已贬值的URI样式似乎允许我的服务连接。

GAE unable to look up SRV record for mongodb atlas instance