You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K8s中通过服务名从Express连接MongoDB遇400错误排查

问题:Kubernetes内部MongoDB连接失败,切换Atlas正常

所有Pod均正常运行,使用MongoDB Atlas时服务端、客户端及数据库测试均正常,但切换为Kubernetes内的MongoDB Pod后出现400错误。已通过kubectl exec验证MongoDB Pod可正常访问,能查询到数据;但将Express的MongoDB连接地址改为mongodb://mongodb-service:27017后无法正常工作,不确定该ClusterIP连接地址是否正确。


控制器代码(server.js,推送至Docker Hub前)

const Todo = require('./models')

const add = async (req, res) => {
    try {
        const {todo} = req.body
        const new_todo = await Todo.insertOne({todo:todo})
        return res.status(200) 

    } catch (err) {
        return res.status(400)
    }
}
const all = async (req, res) => {
    try {
        const todo = await Todo.find()
        return res.status(200).json({ todo })
    } catch (err) {
        return res.status(404)
    }
}

module.exports = {
    add,
    all
}

MongoDB Service配置(service.yaml)

apiVersion: v1
kind: Service
metadata:
  name: mongodb-service
spec:
  selector:
    app: mongodb
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017

Express连接配置

require('dotenv').config()
const express = require('express')
const cors = require('cors')
const mongoose = require('mongoose')


const app = express()
const port = process.env.PORT
const url = process.env.URL || 'mongodb+srv://najib:123@cluster0.z8y8j9v.mongodb.net/microTest?retryWrites=true&w=majority' // 使用MongoDB Atlas时正常,改为"mongodb://mongodb-service:27017"后失效
const myRoutes = require('./routes')

app.use(cors())
app.use(express.json())

mongoose
    .connect(url, {
        useNewUrlParser: true,
        useUnifiedTopology: true
    })
    .then(() =>{
        console.log("MongoDB successfully connected")
        app.use('/', myRoutes)
    } )
    .catch(err => console.log(err))


app.listen(port, () => {
    console.log(`Server is running at port  ${port}`)
})

MongoDB Deployment配置

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodb-pv
  labels:
    app: mongo-db
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/pv/wp-html
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
  name: mongodb-pvc
  labels: 
    app: mongo-db
spec: 
  accessModes: 
    - ReadWriteOnce
  resources: 
    requests: 
      storage: 100Mi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb
  labels:
    app: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
      - name: mongodb
        image: mongo
        ports:
          - containerPort: 27017
        env:
          - name: MONGO_INITDB_ROOT_USERNAME
            valueFrom:
              secretKeyRef:
                name: creds
                key: username
          - name: MONGO_INITDB_ROOT_PASSWORD
            valueFrom: 
              secretKeyRef:
                name: creds
                key: password 
        volumeMounts: 
          - name: mongodb-storage
            mountPath: /data/db  
      volumes: 
        - name: mongodb-storage
          persistentVolumeClaim: 
            claimName: mongodb-pvc                
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-service
spec:
  type: NodePort
  selector:
    app: mongodb
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017

内容的提问来源于stack exchange,提问作者najib iziki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:15:47