无法连接到运行 MySQL 的端口转发 Pod

Posted

技术标签:

【中文标题】无法连接到运行 MySQL 的端口转发 Pod【英文标题】:Can't connect to port-forwarded Pod running MySQL 【发布时间】:2018-01-21 10:17:06 【问题描述】:

我有以下部署 mysql 实例:

kind: Deployment
apiVersion: apps/v1beta1
metadata:
  name: mysql
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8
        ports:
        - containerPort: 3306
        env:
          - name: MYSQL_ROOT_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql-root-password
                key: password

密码就是root

kind: Secret
apiVersion: v1
metadata:
  name: mysql-root-password
type: Opaque
data:
  password: cm9vdA==

问题是我按照here的说明尝试在端口转发MySQL端口后连接到实例,但出现错误:

$ kubectl port-forward mysql-824284009-rpbpk 3306
Forwarding from 127.0.0.1:3306 -> 3306
Forwarding from [::1]:3306 -> 3306

# from another terminal
$ mysql -u root -p
Enter password:  
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

从 pod 本身连接到服务器有效:

$ kubectl exec -it mysql-824284009-rpbpk -- /bin/bash
root@mysql-824284009-rpbpk:/# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
...
mysql>

我的设置与here 基本相同,只是我在 minikube 而不是 GCP 中运行集群。 我的本地 MySQL 没有运行,所以我认为不会发生冲突。

【问题讨论】:

【参考方案1】:

端口转发可能存在,但您需要告诉 mysql 客户端使用主机/端口连接,而不是 unix 套接字(默认)

mysql --host=localhost --protocol tcp --port=3306 -u root -p

如果你不这样做,mysql 默认使用本地 linux 套接字连接到他的服务器:/var/run/mysqld/mysqld.sock .. 它甚至会告诉你;)

更新:正如 Gabriel 检查 - 添加 --protocol tcp 终于使它起作用了,所以我将它添加到我的答案中

【讨论】:

尝试运行mysql --host=localhost --port=3306 -u root -p,但仍然出现错误。 也许您的 mysql 客户端需要其他选项?您可以查看手册如何连接到主机/端口而不是套接字吗?如果您遇到无法连接到“/var/run/mysqld/mysqld.sock”的错误,这意味着您甚至没有尝试连接到主机/端口。这个 SO 答案 (***.com/questions/15872543/…) 建议它类似于:mysql -u username -ppassword -h remote server ip DB name 要检查的另一件事是,如果您的 mysql 服务器实际上侦听 3306 端口,只需执行到您的 pod 并检查 netstat -an | grep 3306,如果您看到没有服务器在侦听 3306 端口,那么您可能需要配置mysql 服务器也监听该端口。如上所述 - 默认情况下,mysql 客户端和服务器之间的连接是通过 unix 套接字完成的,而不是通过 TCP/IP 连接,因此不一定启用。 感谢您的建议。解决方案是包含 --protocol tcp 参数。我查找了有关与套接字以外的其他东西连接的文章/问题,并在此处找到了答案 (serverfault.com/questions/337818/…),该答案建议使用 --protocol 参数。所以运行以下命令有效:mysql --protocol tcp -uroot -p。您可以编辑您的答案以包含此命令,我会将其标记为正确。 已更正。很高兴它解决了你的问题加布里埃尔

以上是关于无法连接到运行 MySQL 的端口转发 Pod的主要内容,如果未能解决你的问题,请参考以下文章

端口已转发,但仍无法连接到 XAMPP

无法连接到 WebSocket 服务器。不知道为啥

即使mysqld在端口3306上运行,也无法连接到'localhost:3306'上的MySQL服务器

无法在 Kubernetes 中从工作连接到服务

3306端口没有监听?无法远程连接到 MySQL

无法连接到数据库服务器 mysql 工作台