簡體   English   中英

Kubernetes - NodeJs MySQL pod 未與 MySQL pod 連接

[英]Kubernetes - NodeJs MySQL pod does not connect with 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('Database connection failed. ' + err.message)
    } else {
        console.log('Database connected.')
    }
});

數據庫連接不斷失敗,並顯示一條消息,因為Database connection failed. connect ENOENT tcp://172.30.88.64:3306 Database connection failed. connect 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: 這個來自 RedHat 的例子是我見過的最接近的例子

此外,我使用mysql_native_password創建了用戶,因為這是 NodeJs 客戶端支持的唯一插件機制。 這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM