K8s部署mongo-express报UnhandledPromiseRejection错误如何解决?
从报错日志可以看出核心问题是mongo-express无法和MongoDB服务建立网络连接,可按以下步骤排查修复:
1. 修复MongoDB Service端口不匹配问题
你当前配置的mongodb-service端口规则为:集群内访问Service的80端口才会转发到MongoDB Pod的27017端口,但mongo-express默认用27017端口访问MongoDB服务,直接导致连接超时。
推荐将Service端口调整为MongoDB默认的27017,避免后续混淆:
# 修改后的mongodb-service配置 apiVersion: v1 kind: Service metadata: name: mongodb-service spec: selector: app: mongodb ports: - protocol: TCP port: 27017 # 将原来的80改为27017 targetPort: 27017
重新应用该配置即可生效。
2. 修正ConfigMap配置错误
日志中连接串末尾出现多余的"(转义双引号),说明你创建的mongodb-configmap里database_url的值多了多余的引号或特殊字符。正确的ConfigMap配置参考:
apiVersion: v1 kind: ConfigMap metadata: name: mongodb-configmap data: database_url: mongodb-service # 不要加引号、不要加端口、不要加协议前缀
3. 确认Secret资源正常创建
执行以下命令检查Secret是否存在且配置正确:kubectl get secret mongodb-secret -o yaml
如果不存在可以用以下命令快速创建:kubectl create secret generic mongodb-secret --from-literal=mongo-root-username=root --from-literal=mongo-root-password=root
4. 调整资源部署顺序
按以下顺序创建资源,避免依赖项未就绪导致超时:
- 先创建Secret、ConfigMap
- 再创建MongoDB Deployment和Service,等待MongoDB Pod状态变为
Running - 最后创建mongo-express Deployment
5. 手动验证网络连通性
如果修改后仍报错,可以启动临时busybox Pod验证网络连通性:kubectl run -it --rm --image=busybox:1.28 debug -- sh
进入Pod后执行以下命令:
- 验证DNS解析:
nslookup mongodb-service - 验证端口连通性:
nc -zv mongodb-service 27017
日志中关于
useUnifiedTopology的警告属于版本兼容提示,不影响服务正常运行,无需单独处理。
内容的提问来源于stack exchange,提问作者Nagesh Kumbhar

