如何在内部将MySQL Kubernetes容器与Node.js K8S容器内部连接?

时间:2019-08-12 18:27:14

标签: mysql node.js docker service kubernetes

我已经在同一个命名空间下创建了mysql k8s容器和nodejs k8s容器。我无法连接mysql db。(sequalize)

我尝试使用'''http://mysql.e-commerce.svc.cluster.local:3306'''连接。但是我收到“ SequelizeHostNotFoundError”错误。

这是我的服务和部署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```

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

从ClusterIP为我工作,或者采用更好的方法来使用本地群集服务ex的主机名。 db-mysql.default.svc.cluster.local。这样,如果集群重新启动并且IP发生了变化,那么您就可以覆盖它。

enter image description here

答案 2 :(得分: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

具有相同的连接字符串。

答案 3 :(得分:0)

如社区成员FL3SH所述,您可以将var comments = await _unitOfWork.Repository<Comment>().Query() .Include(x => x.User) .Include(c => c.Post) .Select(x => new CommentViewModel { Comment = _mapper.Map<Comment, CommentDto>(x), }) .ToListAsync(); 更改为spec.type。 您可以使用稳定的头盔图表wordpress/mysql重现此任务。
对于新创建的广告连播:

clusterIP

和服务:

mysql-mariadb-0
mysql-wordpress

成功部署后,您可以通过运行以下命令来验证您的服务是否在mysql-mariadb mysql-wordpress 窗格中工作:

mysql-wordpress

此外,您可以安装nslooukp,telnet等其他工具:

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

与数据库的服务和连接性可以通过运行f.e.这些命令:

apt-get update && apt-get install dnsutils telnet

示例输出:

nslookup mysql-mariadb
telnet mysql-mariadb 3306
mysql -uroot -hmysql-mariadb -p<your_db_password>

您应该能够使用服务名称或IP地址进行连接。 在此掌舵图中,您还可以找到statefulset的模板,以创建mysql pod。

更新

从第二个广告连播开始ubuntu运行此示例-Node.js Mysql,安装nodes.js并创建与数据库 demo_db_connection.js

的连接

示例:

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

运行它:

 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!");
    });