如何通过MongoDB Compass连接K8s集群中的MongoDB副本集
我通过Bitnami Helm Chart在K8s集群中部署了包含3个副本的MongoDB副本集,对应的Pod地址如下:
mongodb-0.mongodb-headless.mongodb.svc.cluster.local:27017 mongodb-1.mongodb-headless.mongodb.svc.cluster.local:27017 mongodb-2.mongodb-headless.mongodb.svc.cluster.local:27017
我希望使用MongoDB Compass进行连接,由于本地27017端口已运行MongoDB,因此执行了端口转发命令:
kubectl port-forward svc/mongodb-headless -n mongodb 27018:27017
随后尝试通过URI mongodb://localhost:27018连接Compass,但出现错误:
getaddrinfo ENOTFOUND mongodb-0.mongodb-headless.mongodb.svc.cluster.local
请问我在连接过程中哪里操作有误?
更新信息
Kubernetes资源状态
% kubectl get all -n mongodb NAME READY STATUS RESTARTS AGE pod/mongodb-0 1/1 Running 0 25h pod/mongodb-1 1/1 Running 0 25h pod/mongodb-2 1/1 Running 0 25h pod/mongodb-arbiter-0 1/1 Running 0 2d14h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/mongodb-arbiter-headless ClusterIP None <none> 27017/TCP 2d14h service/mongodb-headless ClusterIP None <none> 27017/TCP 2d14h NAME READY AGE statefulset.apps/mongodb 3/3 2d14h statefulset.apps/mongodb-arbiter 1/1 2d14h
Bitnami Helm Chart的values.yaml配置
image: registry: docker.io repository: bitnami/mongodb digest: "sha256:916202d7af766dd88c2fff63bf711162c9d708ac7a3ffccd2aa812e3f03ae209" # tag: 4.4.15 pullPolicy: IfNotPresent architecture: replicaset replicaCount: 2 updateStrategy: type: RollingUpdate containerPorts: mongodb: 27017 auth: enabled: true rootUser: root rootPassword: "password" usernames: ["user"] passwords: ["userpass"] databases: ["db"] service: portName: mongodb ports: mongodb: 27017 persistence: enabled: true accessModes: - ReadWriteOnce size: 8Gi volumePermissions: enabled: true livenessProbe: enabled: false readinessProbe: enabled: false
问题核心是副本集节点的内部域名无法在本地解析:
当你连接副本集时,MongoDB服务会返回集群内的所有节点地址(mongodb-0.mongodb-headless.mongodb.svc.cluster.local这类K8s内部域名)给Compass,但这些域名仅能在集群内部被识别,本地机器无法解析,因此抛出getaddrinfo ENOTFOUND错误。同时,你针对无头服务的端口转发只能映射单个端口,无法处理副本集多节点的地址解析需求。
具体解决方案
方案一:临时连接单个副本节点
直接转发某个具体Pod的端口,绕过副本集地址返回逻辑:
kubectl port-forward pod/mongodb-0 -n mongodb 27018:27017
使用带认证的URI连接Compass:mongodb://root:password@localhost:27018/db?authSource=admin
注意:此方式仅能连接单个节点,无法使用副本集的故障转移功能,适合临时调试。
方案二:支持完整副本集功能的本地连接
- 修改本地
hosts文件(Windows:C:\Windows\System32\drivers\etc\hosts;Linux/macOS:/etc/hosts),添加内部域名映射:
127.0.0.1 mongodb-0.mongodb-headless.mongodb.svc.cluster.local 127.0.0.1 mongodb-1.mongodb-headless.mongodb.svc.cluster.local 127.0.0.1 mongodb-2.mongodb-headless.mongodb.svc.cluster.local
- 打开3个终端窗口,分别转发每个副本节点的端口到本地不同端口:
kubectl port-forward pod/mongodb-0 -n mongodb 27017:27017 kubectl port-forward pod/mongodb-1 -n mongodb 27018:27017 kubectl port-forward pod/mongodb-2 -n mongodb 27019:27017
- 使用完整副本集URI连接Compass:
mongodb://root:password@mongodb-0.mongodb-headless.mongodb.svc.cluster.local:27017,mongodb-1.mongodb-headless.mongodb.svc.cluster.local:27018,mongodb-2.mongodb-headless.mongodb.svc.cluster.local:27019/db?authSource=admin&replicaSet=rs0
注意:Bitnami默认副本集名称为
rs0,若你自定义过需替换为对应名称。
方案三:生产环境长期连接方案
通过K8s Ingress或LoadBalancer类型服务暴露MongoDB副本集,确保外部可以正确解析所有节点地址,同时需配置TLS认证、访问控制等安全策略,避免未授权访问。
内容的提问来源于stack exchange,提问作者user3142695

