mysql - 如何从 kubernetes pod 内的 Nodejs 应用程序访问远程 MySQL 数据库?

标签 mysql node.js kubernetes

我创建了一个 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/

相关文章:

azure - 将 key 从 Keyvault 同步到 Azure AKS 群集

docker - 如何升级自托管 (centOS) kubernetes 集群

kubernetes - 如何使用 Kubernetes 为 Pod 分配静态 IP

mysql - Windows环境下如何将MySQL查询结果输出为csv格式?

错误!服务器没有更新PID文件就退出了?

node.js - 如何检查电子邮件是否已存在(不包括当前记录)

node.js - MongoDB ObjectId 使用

mysql - 车辆年份可能包含证人提供的车辆信息

c++ - 具有多个 MySQL 源代码文件的 GDB

Node.js 服务器 'close' 事件似乎没有触发