【发布时间】:2021-06-09 08:06:32
【问题描述】:
我正在尝试连接到 Kubernetes 中的默认 mongo 映像,我正在为 windows 运行 Desktop docker,下面是我在服务器代码中用于连接的 mongo 服务的 YAML 配置。
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth-mongo-depl
spec:
replicas: 1
selector:
matchLabels:
app: auth-mongo
template:
metadata:
labels:
app: auth-mongo
spec:
containers:
- name: auth-mongo
image: mongo
---
apiVersion: v1
kind: Service
metadata:
name: auth-mongo-srv
spec:
selector:
app: auth-mongo
ports:
- name: db
protocol: TCP
port: 27017
targetPort: 27107
尝试通过以下代码连接到 Kubernetes 实例
import express from 'express'
import { json } from 'body-parser'
import mongoose from 'mongoose'
const app = express()
app.use(json())
const start = async () => {
console.log('Starting servers...!')
try {
await mongoose.connect('mongodb://auth-mongo-srv:27017/auth', {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
})
console.log('Connected to MongoDB !')
} catch (err) {
console.log(err)
}
app.listen(3000, () => {
console.log('Listening on port :3000 !')
})
}
start()
服务和 pod 详情
PS D:\auth> kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
auth-mongo-srv ClusterIP 10.103.93.74 <none> 27017/TCP 5h27m
auth-srv ClusterIP 10.101.151.7 <none> 3000/TCP 5h27m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
PS D:\auth> kubectl get ep auth-mongo-srv
NAME ENDPOINTS AGE
auth-mongo-srv 10.1.0.15:27107 5h28m
遇到错误
MongooseServerSelectionError: connect ECONNREFUSED 10.103.93.74:27017
at NativeConnection.Connection.openUri (/app/node_modules/mongoose/lib/connection.js:846:32)
at /app/node_modules/mongoose/lib/index.js:351:10
at /app/node_modules/mongoose/lib/helpers/promiseOrCallback.js:32:5
at new Promise (<anonymous>)
at promiseOrCallback (/app/node_modules/mongoose/lib/helpers/promiseOrCallback.js:31:10)
at Mongoose._promiseOrCallback (/app/node_modules/mongoose/lib/index.js:1149:10)
at Mongoose.connect (/app/node_modules/mongoose/lib/index.js:350:20)
at /app/src/index.ts:28:20
at step (/app/src/index.ts:33:23)
at Object.next (/app/src/index.ts:14:53)
at /app/src/index.ts:8:71
at new Promise (<anonymous>)
at __awaiter (/app/src/index.ts:4:12)
at start (/app/src/index.ts:25:15)
at Object.<anonymous> (/app/src/index.ts:43:1)
at Module._compile (node:internal/modules/cjs/loader:1109:14) {
reason: TopologyDescription {
type: 'Single',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map(1) { 'auth-mongo-srv:27017' => [ServerDescription] },
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null
}
是否需要在本地运行 Mongo DB 服务才能连接到 Kubernetes mongo 映像? 下图是 Docker 和 Kubernetes 版本。
【问题讨论】:
-
检查 MongoDB pod 的日志。另外,我很确定您应该改用 StatefulSet。
-
@Riwen,你能告诉我在哪里可以找到 pod 的日志吗?我已经更新了问题中的pods和services运行状态看看。
-
尝试
kubectl get pods,然后尝试kubectl logs <pod-name>。 -
您的服务中的
targetPort:是27107,而不是27017。这是您问题中的复制粘贴错误吗?这可能会导致这个问题。 -
@DavidMaze,感谢您指出导致问题的原因是一个简单的错字问题。
标签: mongodb docker kubernetes mongoose skaffold