Minikube/kubernetes pod 无法连接到 Mongodb Atlas
Minikube/kubernetes pod cant connect to Mongodb Atlas
我有一个要在 Minkube 中测试的 Spring 启动应用程序,它应该连接到 MongoDb Atlas。
它在我的电脑上 运行 应用程序时连接到我的数据库,它也在创建 运行 作为 Docker 图像后连接,运行 在 Ubuntu 我电脑上的虚拟机。当 运行 作为 Minikube 上的 Kubernetes 部署时,它不会连接到 Mongodb Atlas。
我肯定缺少配置步骤,但我只是不知道是什么。我想我的问题是 "Do i need to do anything special to allow Minikube/Kubernetes to find external URLs"?
我将 post 我的错误和当前的调查路线如下,如果有人有任何建议,他们将不胜感激。
在 Kubernetes 中 运行 时出现嵌套错误(它是一条很长的错误消息,所以只是相关的位 - 我认为),正如您所看到的,它无法找到我的数据库 URL,并抱怨"DNS name not found"。可以通过 运行 本地程序在 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 设置为默认值(加上所有其他可能的值)
- 创建外部服务,并使用 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,删除了个人 username/password/repository 详细信息:
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
已找到解决方案:
出于某种原因,我的设置组件之一(spring boot/kubernetes/minikube/virtualbox 等)在解析 DNS SRV URI 时出现问题。为连接到我的集群提供的 MongoDB Atlas URI 失败,将其更改为 URI 的贬值样式似乎允许我的服务连接。
GAE unable to look up SRV record for mongodb atlas instance
我有一个要在 Minkube 中测试的 Spring 启动应用程序,它应该连接到 MongoDb Atlas。
它在我的电脑上 运行 应用程序时连接到我的数据库,它也在创建 运行 作为 Docker 图像后连接,运行 在 Ubuntu 我电脑上的虚拟机。当 运行 作为 Minikube 上的 Kubernetes 部署时,它不会连接到 Mongodb Atlas。
我肯定缺少配置步骤,但我只是不知道是什么。我想我的问题是 "Do i need to do anything special to allow Minikube/Kubernetes to find external URLs"?
我将 post 我的错误和当前的调查路线如下,如果有人有任何建议,他们将不胜感激。
在 Kubernetes 中 运行 时出现嵌套错误(它是一条很长的错误消息,所以只是相关的位 - 我认为),正如您所看到的,它无法找到我的数据库 URL,并抱怨"DNS name not found"。可以通过 运行 本地程序在 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 设置为默认值(加上所有其他可能的值)
- 创建外部服务,并使用 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,删除了个人 username/password/repository 详细信息:
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
已找到解决方案:
出于某种原因,我的设置组件之一(spring boot/kubernetes/minikube/virtualbox 等)在解析 DNS SRV URI 时出现问题。为连接到我的集群提供的 MongoDB Atlas URI 失败,将其更改为 URI 的贬值样式似乎允许我的服务连接。
GAE unable to look up SRV record for mongodb atlas instance