mysql - Kubernetes - NodeJs MySQL pod 无法与 MySQL pod 连接

标签 mysql node.js docker kubernetes database-connection

我有一个 MySQL pod 已启动并正在运行。我为此 Pod 打开了一个终端并创建了一个数据库和一个用户。

create database demodb;
create user demo identified by 'Passw0rd';
grant all on demodb.* to 'demo';

我有这个部署来为MySQL pod启动NodeJs客户端。这是我的本地 minikube 安装。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demos
spec:
  selector:
    matchLabels:
      app: demos
  template:
    metadata:
      labels:
        app: demos
    spec:
      containers:
      - name: demo-db
        image: 172.30.1.1:5000/demo/db-demos:0.1.0
        resources:
          limits:
            memory: "128Mi"
            cpu: "200m"
        ports:
        - containerPort: 4000
          name: probe-port
---
apiVersion: v1
kind: Service
metadata:
  name: demos
spec:
  selector:
    app: demos
  ports:
  - name: probe-port
    port: 4001
    targetPort: probe-port

图像的Dockerfile传递环境变量供NodeJs客户端使用。

FROM node:alpine
ADD . .
RUN npm i

WORKDIR /app

ENV PROBE_PORT 4001

ENV MYSQL_HOST "mysql.demo.svc"
ENV MYSQL_PORT "3306"
ENV MYSQL_USER "demo"
ENV MYSQL_PASSWORD "Passw0rd"
ENV MYSQL_DATABASE "demodb"

CMD ["node", "index.js"]

并且,NodeJs 客户端连接如下。

const mysql = require('mysql')

const connection = mysql.createConnection({
    host: process.env.MYSQL_HOST,
    port: process.env.MYSQL_PORT,
    user: process.env.MYSQL_USER,
    password: process.env.MYSQL_PASSWORD,
    database: process.env.MYSQL_DATABASE
});

connection.connect((err) => {
    if (err) {
        console.log('Database connection failed. ' + err.message)
    } else {
        console.log('Database connected.')
    }
});

数据库连接不断失败,并显示一条消息:数据库连接失败。连接 ENOENT tcp://172.30.88.64:3306。此消息中显示的 TCP/IP 地址是正确的,即它与正在运行的 MySQL pod 的服务 mysql.demo.svc 匹配。

在 MySQL 配置文件中,我没有看到 bind-address。这应该意味着,MySQL 应该接受来自“任何地方”的连接。我正在创建不带位置限定符的用户,即用户是 'demo'@'%'。显然,连接不是通过套接字,因为我正在传递连接的主机和端口值。

我错过了什么?

最佳答案

我的工作原理如下。

const mysql = require('mysql')

const connection = mysql.createConnection({
    host: process.env.MYSQL_HOST,
//    port: process.env.MYSQL_PORT,
    user: process.env.MYSQL_USER,
    password: process.env.MYSQL_PASSWORD,
    database: process.env.MYSQL_DATABASE
});

connection.connect((err) => {
    if (err) {
        console.log('Database connection failed. ' + err.message)
    } else {
        console.log('Database connected.')
    }
});

没错;我从选项中删除了端口号。 :rolleyes: 这个example from RedHat这是我见过的最接近的。

此外,我使用 mysql_native_password 创建了用户,因为这是 NodeJs 客户端支持的唯一插件机制。请参阅here .

关于mysql - Kubernetes - NodeJs MySQL pod 无法与 MySQL pod 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59996105/

相关文章:

mysql - 选择不同的 table4_id、table3_id 和 table2_id

PHP 和 MySQL 从时间中减去秒数

node.js - jsDOM 和 Meteor 出现意外 token 错误

java - Bitbucket 管道的测试容器问题

docker - Docker build:无法满足的约束

python - python如何查看xampp中的MySQL数据库

javascript - JSON 中的嵌套数组 : Push/Unshift with date object creates double entry

node.js - 如何从 Meteor 上的 Selenium 错误中恢复?

docker - 解决 command terminated with exit code 137 in pod Kubernetes

mysql - 如何在 MySQL 中添加附加标题行