【问题标题】:Kubernetes - NodeJs MySQL pod does not connect with MySQL podKubernetes - NodeJs MySQL pod 不与 MySQL pod 连接
【发布时间】:2020-05-16 15:55:43
【问题描述】:

我有一个 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('Database connection failed. ' + err.message)
    } else {
        console.log('Database connected.')
    }
});

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

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

我错过了什么?

【问题讨论】:

  • 你是如何部署数据库的;你确定 mysql 服务实际上连接到它的底层 Pod 吗?
  • MySQL 是使用此 YAML 部署的 - pastebin.com/h6YtMgPC
  • 顺便说一句,在minikube 上,我将服务用作mysql.demo.svc.cluster.local。在minishift,我尝试使用mysql.demo.svc;两种情况下的错误相同。
  • 你是在同一个命名空间demo上使用mysql部署和nodejs客户端吗?例如,您是否能够使用 telnet 从您的节点客户端端口访问 mysql 3306 端口?您可以使用 busybox 图像进行此测试,请参阅 this link,以确保您的问题不是 dns 解析或网络问题....
  • 是的,它们在同一个命名空间demo 中。我关注了this examplenslookup 成功运行。

标签: mysql node.js docker kubernetes database-connection


【解决方案1】:

我得到它的工作如下。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多