如何从Kubernetes Pod(含Kind集群)访问本地主机MySQL服务
如何从Kubernetes Pod连接到主机上的MySQL服务?
我来帮你拆解这两个问题——其实第二个是第一个的具体场景(WSL2+Kind集群),我先讲通用思路,再针对你的场景给出落地步骤:
通用核心步骤
不管是哪种K8s集群,Pod要访问主机的MySQL,核心是解决两个问题:让MySQL允许外部访问,以及找到Pod能通的主机IP。
第一步:调整MySQL的访问权限
- 打开MySQL的配置文件(Linux是
/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,Windows是my.ini),把bind-address改成0.0.0.0(原来可能是127.0.0.1,只允许本地访问),然后重启MySQL服务。 - 登录MySQL,创建一个允许从Pod所在网段访问的用户:
这里的CREATE USER 'pod_access'@'%' IDENTIFIED BY 'your_secure_password'; GRANT ALL PRIVILEGES ON your_target_db.* TO 'pod_access'@'%'; FLUSH PRIVILEGES;%表示允许从任何IP访问,如果你想更安全,可以换成Pod所在的具体网段(比如192.168.0.0/24)。 - 放行主机防火墙的3306端口:Linux用
ufw allow 3306,Windows在防火墙高级设置里添加一条入站规则,允许3306端口的TCP连接。
- 打开MySQL的配置文件(Linux是
第二步:找到Pod能访问的主机IP
不能直接用localhost——Pod里的localhost指的是Pod自身,不是你的物理主机。你需要找到主机在K8s集群网络中的可访问IP:- 如果是Docker Desktop的K8s集群,可以用
host.docker.internal这个特殊域名,Docker会自动解析到主机IP。 - 如果是其他集群,比如物理机搭建的K8s,直接用主机的局域网IP即可。
- 如果是Docker Desktop的K8s集群,可以用
针对WSL2+Kind集群的具体操作
WSL2的网络是NAT模式,Kind集群的Pod运行在WSL2的虚拟网络里,所以需要用Windows主机在WSL2中的专属IP:
获取Windows主机的WSL访问IP
在WSL2的终端里执行这条命令,拿到nameserver对应的IP:cat /etc/resolv.conf | grep nameserver | awk '{print $2}'这个IP就是Windows主机在WSL2虚拟网络中的地址(一般是
172.x.x.x段),Pod可以通过这个IP访问主机的MySQL。验证连通性
先在Kind集群里启动一个临时Pod测试连通性,比如用busybox:kubectl run -it --rm busybox --image=busybox -- nc -zv <你的Windows主机IP> 3306如果返回
succeeded,说明网络通了;如果失败,检查防火墙或者MySQL的bind配置。Python应用的连接代码
用pymysql的话,代码大概是这样(替换成你的实际参数):import pymysql try: conn = pymysql.connect( host='172.28.128.1', # 替换成你刚才拿到的Windows IP user='pod_access', password='your_secure_password', database='your_target_db', port=3306, charset='utf8mb4' ) print("MySQL连接成功!") # 这里写你的业务逻辑,比如查询数据 cursor = conn.cursor() cursor.execute("SELECT VERSION();") result = cursor.fetchone() print(f"MySQL版本:{result[0]}") except Exception as e: print(f"连接失败:{str(e)}") finally: if 'conn' in locals() and conn.open: conn.close()
常见坑点提醒
- WSL2的IP可能会变:每次重启WSL或者Windows,这个IP可能会改变。如果需要固定,可以在Windows上给WSL虚拟网卡设置静态IP,或者在应用里写个脚本动态获取。
- 不要用
localhost:再次强调,Pod里的localhost不是你的主机,一定要用实际的IP或者专属域名。 - MySQL用户权限:如果连接时报
Access denied,先检查用户的host字段是不是%或者对应的网段,别用localhost的用户(那个只能在主机本地登录)。
内容的提问来源于stack exchange,提问作者asuprem
相关产品推荐
相关产品推荐

