如何在Kubernetes容器内部用Node.js连接MySQL Kubernetes容器?

3

我已经在同一命名空间下创建了mysql k8s容器和nodejs k8s容器。但我无法连接mysql数据库。(使用sequalize)

我尝试使用'''http://mysql.e-commerce.svc.cluster.local:3306'''进行连接,但是出现了"SequelizeHostNotFoundError"错误。

以下是我的服务(service)和部署(deployment)yaml文件。

kind: Service
metadata:
 labels:
   app: mysql
 name: mysql
 namespace: e-commerce
spec:
  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 30306
  selector:
    app: mysql
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mysql
  namespace: e-commerce
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql-container
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim```

请分享您的结果-您尝试下面的解决方案了吗? - Mark
嗨,Mithun,如果您在帖子中发现了最有用的答案,请点赞/接受它。https://stackoverflow.com/help/someone-answers - Black_Bacardi
4个回答

2

使用ClusterIP对我有用,或者更好的方法是使用本地集群服务的主机名,例如db-mysql.default.svc.cluster.local。这样,如果您的集群重新启动并且IP更改,则已经涵盖了此问题。

enter image description here


请问您能否指出一份详细解释 db-mysql.default.svc.cluster.local 的文档? - nyoto arif

1

您正在尝试使用http协议访问数据库,请放弃或更改为mysql://ip:3306。一些客户端不接受数据库的DNS名称,因此您可以检查服务的ClusterIP并尝试使用该IP。


1

如社区成员FL3SH所述,您可以将spec.type更改为clusterIP。 您可以使用稳定的helm图表wordpress/mysql来重现此任务。
对于新创建的Pod:

mysql-mariadb-0
mysql-wordpress

和服务:

mysql-mariadb
mysql-wordpress

成功部署后,您可以通过运行以下命令从mysql-wordpress pod 验证服务是否正常工作:

kubectl exec -it mysql-wordpress-7cb4958654-tqxm6 -- /bin/bash

此外,您可以安装其他工具,如nslookup、telnet:
apt-get update && apt-get install dnsutils telnet
您可以通过运行以下命令测试服务和与数据库的连接:
nslookup mysql-mariadb
telnet mysql-mariadb 3306
mysql -uroot -hmysql-mariadb -p<your_db_password>

示例输出:

示例输出:

nslookup mysql-mariadb  
Server:         10.125.0.10
Address:        10.125.0.10#53
Non-authoritative answer:
Name:   mysql-mariadb.default.svc.cluster.local
Address: 10.125.0.76


mysql -u root -hmysql-mariadb -p<your_db_password>
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2068
Server version: 10.1.40-MariaDB Source distribution

你应该能够使用服务名称或IP地址进行连接。 在这个helm图表中,你还可以找到statefulset的模板,以创建mysql pods。
更新
从第二个pod(例如ubuntu)运行此示例-Node.js Mysql,安装nodes.js并创建到数据库的连接demo_db_connection.js。
示例:
 var mysql = require('mysql');

    var con = mysql.createConnection({
      host: "mysql-mariadb",
      user: "root",
      password: "yourpassword"
    });

    con.connect(function(err) {
      if (err) throw err;
      console.log("Connected!");
    });

run it:

root@ubuntu:~/test# node demo_db_connection.js
Connected!

0

尝试使用:

kind: Service
metadata:
 labels:
   app: mysql
 name: mysql
 namespace: e-commerce
spec:
  clusterIP: None
  type: ClusterIP
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    app: mysql

使用相同的连接字符串。

你确定连接URL是正确的吗 - 我是说语法?尝试只使用服务名称,这样URL将为`http://mysql:3306'。 - FL3SH
在 Node.js 容器内使用 Curl 命令也无法解决问题。这是在 KIND(Docker 中的 Kubernetes)中发生的事情。 - Mithun
当我尝试在Node.js容器内运行wget命令时, 连接到mysql:3306(10.244.0.4:3306) wget:错误的头行:5.6.45。 - Mithun
现在尝试在Node.js容器中安装MySQL客户端并连接到数据库。 - FL3SH
之前我使用node:10-alpine镜像作为我的node容器的基础镜像。现在我改成了node:10.14.2。当我输入curl sql字符串时,我得到了5.6.45o%cHzQf/??Q.1Kf>Aju.!Zmysql_native_password!??#08S01Got packets out of order - Mithun
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接