Kubernetes中MongoExpress无法连接MongoDB的问题求助
错误信息
Could not connect to database using connectionString: mongodb://username:password@mongodbservice:27017/" (node:7) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [mongodbservice:27017] on first connect [Error: getaddrinfo EAI_AGAIN mongodbservice at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26) { name: 'MongoNetworkError'
该错误核心是DNS解析失败,MongoExpress Pod无法识别mongodbservice服务名,按以下步骤排查:
1. 确认资源所在命名空间一致性
Kubernetes服务名默认仅在同一命名空间内可解析:
- 执行
kubectl get pods -A,查看MongoDB和MongoExpress Pod的命名空间 - 执行
kubectl get services -A,查看mongodbservice的命名空间
若不在同一命名空间,要么将所有资源迁移至同一命名空间,要么连接时使用跨命名空间地址:mongodbservice.<目标命名空间>.svc.cluster.local
2. 验证服务与Pod的关联状态
执行kubectl describe service mongodbservice,查看Endpoints字段是否包含MongoDB Pod的IP地址:
- 若Endpoints为空,检查Pod标签与Service选择器是否匹配(你的配置中
app: mongo是匹配的,但仍需确认Pod状态) - 执行
kubectl get pods -l app=mongo,确保MongoDB Pod处于Running状态 - 执行
kubectl logs <mongodb-pod-name>,查看MongoDB初始化日志,确认服务正常启动
3. 检查环境变量加载正确性
验证MongoExpress的ME_CONFIG_MONGODB_SERVER环境变量:
kubectl exec <mongoexpress-pod-name> -- env | grep ME_CONFIG_MONGODB_SERVER
确认值为mongodbservice,无多余引号或空格
4. 手动测试Pod内连通性
进入MongoExpress Pod:
kubectl exec -it <mongoexpress-pod-name> -- /bin/sh
执行ping测试:
ping mongodbservice
若ping不通,检查集群CoreDNS状态:
kubectl get pods -n kube-system -l k8s-app=kube-dns
若CoreDNS Pod异常,重启或修复该组件
5. 后续认证验证(连通性解决后)
连通性修复后若仍无法连接,检查认证配置:
- 确认Secret
secret-mongodb中的userName和password与MongoDB初始化值一致 - 测试MongoDB认证:
kubectl exec <mongodb-pod-name> -- mongo -u <用户名> -p <密码> --authenticationDatabase admin
配置优化建议
为所有YAML资源统一添加命名空间字段,避免跨命名空间问题:
metadata: name: xxx namespace: default # 可替换为自定义命名空间
内容的提问来源于stack exchange,提问作者Unknown

