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

Java Minikube/kubernetes吊舱无法连接到Mongodb Atlas,java,spring-boot,kubernetes,minikube,mongodb-atlas,Java,Spring Boot,Kubernetes,Minikube,Mongodb Atlas,我有一个Spring Boot应用程序,我正试图在Minkube中测试它,它应该连接到MongoDb Atlas 在我的电脑上运行应用程序时,它会连接到我的数据库,在创建并运行Docker映像后,它也会连接到我的电脑上的Ubuntu VM上。在Minikube上作为Kubernetes部署运行时,它不会连接到Mongodb Atlas 一定有一个配置步骤我错过了,但我只是不知道什么。我想我的问题是“我是否需要做一些特殊的事情来允许Minikube/Kubernetes查找外部URL” 我将在下面

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

在我的电脑上运行应用程序时,它会连接到我的数据库,在创建并运行Docker映像后,它也会连接到我的电脑上的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
  • 创建允许所有出口的网络策略:

以下是我的部署和服务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
apiVersion:apps/v1 种类:部署 元数据: 名称:前端 标签: 应用程序:前端 规格: 副本:1份 选择器: 火柴标签: 应用程序:前端 模板: 元数据: 标签: 应用程序:前端 规格: dnsPolicy:默认值 容器: -名称:前端 图片:/:前面 imagePullPolicy:始终 环境: -名称:MONGODB_ATLAS 值:mongodb+srv://:@xxxxxx-erble.gcp.mongodb.net/test?retryWrites=true&w=mailty -名称:前\u服务器\u端口 值:“8080” -名称:spring\u profiles\u active 值:dev 端口: -集装箱港口:8080 资源: 限制: 内存:512Mi 你的秘密: -姓名: --- 版本:v1 种类:服务 元数据: 名称:前端 规格: 端口: -节点端口:32000 港口:80 目标港:8080 选择器: 应用程序:前端 类型:节点端口 已找到解决方案:

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

更多信息请参见:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-all-egress
spec:
  podSelector: {}
  egress:
    - {}
  policyTypes:
    - Egress
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