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
相关产品推荐
相关产品推荐

