Kubernetes Can';t在ExpressJS应用程序中使用GKE上的ExternalName连接到数据库

Kubernetes Can';t在ExpressJS应用程序中使用GKE上的ExternalName连接到数据库,kubernetes,google-kubernetes-engine,kubernetes-ingress,nginx-ingress,kube-dns,Kubernetes,Google Kubernetes Engine,Kubernetes Ingress,Nginx Ingress,Kube Dns,我想将Google Kubernetes引擎上托管的多个微服务连接到MongoDB Atlas数据库 群集中的所有部署和服务都位于gitlab managed apps的命名空间上 我已创建以下ExternalName服务: mongo外部名称.yaml 种类:服务 版本:v1 元数据: 姓名:mongo 命名空间:gitlab托管的应用程序 规格: 类型:ExternalName 外部名称:db_name.mrud5.mongodb.net 为了连接到MongoDB Atlas,我尝试使用E

我想将Google Kubernetes引擎上托管的多个微服务连接到MongoDB Atlas数据库

群集中的所有部署和服务都位于gitlab managed apps的
命名空间上

我已创建以下ExternalName服务:

mongo外部名称.yaml

种类:服务
版本:v1
元数据:
姓名:mongo
命名空间:gitlab托管的应用程序
规格:
类型:ExternalName
外部名称:db_name.mrud5.mongodb.net
为了连接到MongoDB Atlas,我尝试使用ExternalName,因为使用db_name.mrud5.MongoDB.net将尝试解析为内部服务:

//connect.js
mongoose.connect(`mongodb+srv://${global.DB_USER}:${global.DB_PASSWORD}@mongo.gitlab managed apps.svc.cluster.local/${global.DB_NAME}?retryWrites=true&w=maist`{
useNewUrlParser:true,
useCreateIndex:true,
useUnifiedTopology:正确,
UseFindModify:false
});
根据部署,我在几个舵图中有它们。我认为这与
dnsPolicy:ClusterFirst
有关,并尝试将其设置为
dnsPolicy:Default
,但这没有什么区别

在其中一个pod上执行bash时,我尝试了许多其他问题所建议的
nslookup
,结果如下:

bash-5.0#nslookup mongo.gitlab-managed-apps.svc.cluster.local
服务器:10.1.0.10
地址:10.1.0.10:53
mongo.gitlab-managed-apps.svc.cluster.local canonical name=db_name.mrud5.mongodb.net
mongo.gitlab-managed-apps.svc.cluster.local canonical name=db_name.mrud5.mongodb.net
我想,如果pod可以看到CNAME记录,那么肯定还有一些我做得不对的事情

我无法
ping mongo.gitlab managed apps.svc.cluster.local

bash-5.0#ping mongo.gitlab-managed-apps.svc.cluster.local
ping:错误地址'mongo.gitlab托管应用程序.svc.cluster.local'
我的集群的主版本是
1.15.11-gke.15
。我没有用这个版本创建集群,在创建集群时,Gitlab会自动选择
1.14.10
。在阅读了GitHub上的多个问题后,我了解到版本
1.14.9
上的
kube dns
存在一些问题。一、 因此,运行下面的命令尝试修复此问题

kubectl设置映像部署/kube dns-n kube系统\
kubedns=gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.10\
dnsmasq=gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.10\
sidecar=gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.10
正如我所想,这也不是解决办法。不顾一切,我使用上述命令将集群升级到
1.15.11-gke.15
和kube-dns。这也不是解决办法

我不认为这会导致此问题,但我已在我的入口控制器下方发布:

入口服务。yaml

apiVersion:extensions/v1beta1
种类:入口
元数据:
注释:
kubernetes.io/ingres.class:nginx
nginx.ingres.kubernetes.io/rewrite-target://$1
nginx.ingres.kubernetes.io/proxy-body-size:“100m”
certmanager.k8s.io/cluster-issuer:letsencrypt产品
nginx.ingres.kubernetes.io/proxy-connect-timeout:“7200”
nginx.ingres.kubernetes.io/proxy-read-timeout:“7200”
nginx.ingres.kubernetes.io/proxy-send-timeout:“7200”
名称:入口服务
命名空间:gitlab托管的应用程序
规格:
tls:
-主持人:
-我的主人
秘书名称:letsencrypt产品
规则:
-主持人:我的
http:
路径:
-后端:
serviceName:我的群集ip服务
服务端口:3000
路径:/?(*)

非常感谢您的任何建议

嗯,
ExternalName
配置是正确的✅. 集群吊舱为您提供了正确的规范名称。但是,
db_name.mrud5.mongodb.net
甚至不可ping,也不可访问。它基本上是一个TXT DNS记录。我之所以这样说,是因为我自己用我的数据库进行了尝试我还没有使用AWS托管的Atlas群集使数据库正常工作,但是我能够连接到使用GCP托管的Atlas群集。

因此,如果有人遇到这个问题,作为临时解决方案,只需使用GCP创建一个Atlas集群


我将保留这个问题,因为这个问题已被避免,尚未解决。

您的群集是vpc本机群集吗?@SebaArriagada我不确定,因为群集是通过Gitlab创建的,所以它可能使用了REST API,但我可以告诉您,vpc本机(别名IP)已启用,因此我假设它必须是vpc本机群集。我明白了。我尝试使用ExternalNames的原因是因为我一直收到错误
MongooseServerSelectionError:无法连接到MongoDB Atlas群集中的任何服务器。
如果我使用像
MongoDB+srv://:@mycluster.vvcme.MongoDB.net/?retryWrites=true&w=maist这样的连接字符串
。这只发生在吊舱内,在我不使用Kubernetes的开发机器上,连接成功。您能否共享一个在本例中使用的连接字符串?编辑:0.0.0.0/0在Atlas中被列为白名单。我想指出,我已经设法解决了这个问题,但不是我想要的方式。我使用AWS在Atlas上托管数据库。我在GCP上创建了另一个集群,它工作起来很有魅力。这是否意味着我需要添加一些特殊权限才能从GKE连接到Atlas托管的AWS MongoDB集群?我不知道我怎么能做到这一点,因为Atlas不提供直接访问AWS的权限。