Kubernetes - NodeJs MySQL pod无法与MySQL pod建立连接

9 浏览
0 Comments

Kubernetes - NodeJs MySQL pod无法与MySQL pod建立连接

我有一个正在运行的MySQL Pod。我为这个Pod打开了一个终端,并创建了一个数据库和一个用户。

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

我有一个Deployment来启动一个用于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('数据库连接失败。' + err.message)
    } else {
        console.log('数据库已连接。')
    }
});

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

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

我错过了什么?

0
0 Comments

问题原因:在连接MySQL pod时,代码中指定的端口号被注释掉,导致连接失败。

解决方法:将代码中的端口号注释取消,确保连接MySQL pod时指定了正确的端口号。另外,创建MySQL用户时,需要使用mysql_native_password插件机制,因为这是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('数据库连接失败。' + err.message)
    } else {
        console.log('数据库已连接。')
    }
});

没错,我从选项中移除了端口号。:rolleyes: 这是我找到的最接近的RedHat示例

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

0