我创建了一个 POD,其中包含一个 Nodejs 应用程序,我试图从中连接到另一台服务器中的远程数据库。我的 POD 配置如下:
apiVersion : "v1"
kind : "Service"
metadata :
name : "mysql"
spec :
ports :
-
name : "mysql"
protocol : "TCP"
port : 3306
targetPort : 3306
nodePort : 0
---
kind: "Endpoints"
apiVersion: "v1"
metadata:
name: "mysql"
subsets:
-
addresses:
-
ip: "xxx.xxx.xxx.xxx" #The IP Address of the external web server
ports:
-
port: 3306
name: "mysql"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productos
labels:
app: productos
spec:
replicas: 3
selector:
matchLabels:
app: productos
tier: backend
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: productos
tier: backend
spec:
restartPolicy: Always
containers:
- image: sospinah/tutorial:lopido-ms-productos6
name: productos
env:
- name: MYSQL_HOST
value: "mysql.default.svc.cluster.local"
- name: MYSQL_USER
value: "<username>"
- name: MYSQL_DATABASE
value: "<dbname>"
- name: MYSQL_PASSWORD
value: "<password>"
ports:
- containerPort: 4000
在我的 Nodejs 应用程序中,我定义了数据库连接,如下所示:
const connection = mysql.createConnection({
host: process.env.MYSQL_HOST,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_PASSWORD,
database: process.env.MYSQL_DATABASE,
});
我在应用启动时遇到超时错误
> nodejs-microservice@1.0.0 start /usr/src/app
> node index.js
server listening at port 0.0.0.0:4000
error connecting mysql: { Error: connect ETIMEDOUT
at Connection._handleConnectTimeout (/usr/src/app/node_modules/mysql/lib/Connection.js:419:13)
at Object.onceWrapper (events.js:313:30)
at emitNone (events.js:106:13)
at Socket.emit (events.js:208:7)
at Socket._onTimeout (net.js:422:8)
at ontimeout (timers.js:498:11)
at tryOnTimeout (timers.js:323:5)
at Timer.listOnTimeout (timers.js:290:5)
--------------------
at Protocol._enqueue (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:145:48)
at Protocol.handshake (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:52:23)
at Connection.connect (/usr/src/app/node_modules/mysql/lib/Connection.js:130:18)
at Object.bdConfig.testConection (/usr/src/app/database/config.js:16:23)
at Object.<anonymous> (/usr/src/app/index.js:18:14)
at Module._compile (module.js:653:30)
at Object.Module._extensions..js (module.js:664:10)
at Module.load (module.js:566:32)
at tryModuleLoad (module.js:506:12)
at Function.Module._load (module.js:498:3)
errorno: 'ETIMEDOUT',
code: 'ETIMEDOUT',
syscall: 'connect',
fatal: true }
我想知道我的 POD 配置和/或应用程序配置中缺少什么。
最佳答案
您已将 mysql 主机定义为 mysql.default.svc.cluster.local
如果 Nodejs 和 mysql 在同一个 kubernetes 集群中运行,则这将起作用。
关于mysql - 如何从 kubernetes pod 内的 Nodejs 应用程序访问远程 MySQL 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56762324/