无法连接到运行 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的主要内容,如果未能解决你的问题,请参考以下文章