从外部源连接到Kubernetes中的MongoDB副本集失败,并出现getaddrinfo ENOTFOUND错误,但单机版可以正常工作
我有一个运行在Kubernetes(AWS EKS)中的MongoDB副本集,它是使用Bitnami的Helm图表创建的。服务配置为面向外部,并设置为NodePort从外部源连接到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
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的文档和设置