从外部源连接到Kubernetes中的MongoDB副本集失败,并出现getaddrinfo ENOTFOUND错误,但单机版可以正常工作

从外部源连接到Kubernetes中的MongoDB副本集失败,并出现getaddrinfo ENOTFOUND错误,但单机版可以正常工作,mongodb,amazon-web-services,kubernetes,Mongodb,Amazon Web Services,Kubernetes,我有一个运行在Kubernetes(AWS EKS)中的MongoDB副本集,它是使用Bitnami的Helm图表创建的。服务配置为面向外部,并设置为NodePort mongo-mongodb-0-external NodePort 10.100.83.252 27017:30030/TCP mongo-mongodb-1-external NodePort 10.100.15.184 27017:30031/TCP mongo-mongod

我有一个运行在Kubernetes(AWS EKS)中的MongoDB副本集,它是使用Bitnami的Helm图表创建的。服务配置为面向外部,并设置为NodePort

mongo-mongodb-0-external         NodePort    10.100.83.252  27017:30030/TCP

mongo-mongodb-1-external         NodePort    10.100.15.184  27017:30031/TCP

mongo-mongodb-2-external         NodePort    10.100.90.128  27017:30032/TCP

mongo-mongodb-arbiter-headless   ClusterIP   None           27017/TCP

mongo-mongodb-headless           ClusterIP   None           27017/TCP
在我的笔记本电脑上,我可以将Mongo CLI连接到副本,但从MongoDB Compass和Studio 3T连接失败

以下是我的笔记本电脑上的Mongo CLI的作品

mongo'mongodb://root:mypassword@k8s_节点_ip:30030,k8s_节点_ip:30031,k8s_节点_ip:30032/mydb?authSource=admin'

…这是有效的

mongo-admin——主机“k8s\u节点\u ip:30030,k8s\u节点\u ip:30031,k8s\u节点\u ip:30032”--身份验证数据库管理员-u根-p mypassword

…但这在MongoDB Compass和Studio 3T中失败了

mongodb://root:mypassword@k8s_节点_ip:30030,k8s_节点_ip:30031,k8s_节点_ip:30032/mydb?authSource=admin

错误消息是:

getaddrinfo ENOTFOUND mongo-mongodb-0.mongo-mongodb-headless.mynamespace.svc.cluster.local

奇怪的是,以下独立连接在Studio 3T中工作:


mongodb://root:mypassword@k8s_node_ip:30030/?serverSelectionTimeoutMS=5000&connectTimeoutMS=10000&authSource=admin&authMechanism=SCRAM-SHA-256

连接到副本集时,连接字符串中的主机:端口对是种子列表

驱动程序/客户端将尝试依次连接到种子列表中的每个主机,直到获得连接为止

它运行
isMaster
命令来确定哪个节点是主节点,并获取所有副本集成员的列表

然后is丢弃原始种子列表连接,并尝试使用检索到的主机和端口信息连接到每个副本集成员

isMaster
返回的主机信息通常与
rs.conf()
中的条目相匹配,这是用于启动复制集的主机名

在Kubernetes集群中,节点具有用于启动副本集的内部主机名,但外部客户端无法解析这些主机名

为了实现这一点,您需要让mongod nodes isMaster命令根据客户端请求的来源返回一组不同的主机名。这类似于拆分地平线DNS

查看mongodb/kubernetes的文档和设置