Java Minikube/kubernetes吊舱无法连接到Mongodb Atlas
我有一个Spring Boot应用程序,我正试图在Minkube中测试它,它应该连接到MongoDb Atlas 在我的电脑上运行应用程序时,它会连接到我的数据库,在创建并运行Docker映像后,它也会连接到我的电脑上的Ubuntu VM上。在Minikube上作为Kubernetes部署运行时,它不会连接到Mongodb Atlas 一定有一个配置步骤我错过了,但我只是不知道什么。我想我的问题是“我是否需要做一些特殊的事情来允许Minikube/Kubernetes查找外部URL” 我将在下面公布我的错误和当前的调查路线,如果有人有任何建议,我将不胜感激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” 我将在下面
在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