本地环境使用 Kubernetes 中的 socat 代理访问远程 MySQL
本文介绍如何利用 socat 在 Kubernetes 中创建一个代理,使本地开发环境能够无缝连接到受网络限制的远程 MySQL,提高开发效率的同时保持安全性。
在现代云原生开发中,我们经常需要访问 Kubernetes 集群所访问的云数据库等资源。出于安全目的,这些资源通常设有非常严格的网络限制。本文以远程访问 MySQL 为例,介绍如何使用 socat 工具在 Kubernetes 中创建一个代理,通过代理实现在本地机器访问仅对 Kubernetes 开放的资源。
如果仅仅是想要查看数据库内容,可以直接创建一个临时的 mysql-client Pod,进入 Pod 使用 mysql 命令即可:
bash
kubectl run mysql-client --rm --attach --image=mysql:8.0.35 --restart=Never
kubectl run mysql-client --rm --attach --image=mysql:8.0.35 --restart=Never
但本文的目的是能够使用本地的数据库管理软件连接远程 MySQL,提供更舒适的开发体验。
前提条件
- 本地安装了 kubectl 工具
- 具有在 Kubernetes 集群中创建 Pod 的权限
- 目标 MySQL 数据库对 Kubernetes 集群可访问
基本原理

- 开发者使用本地 MySQL 客户端连接到本地端口 13306
- kubectl port-forward 命令将本地 13306 端口的流量转发到 K8s 集群中的 socat-tunnel Pod 的 3306 端口
- socat-tunnel Pod 通过 socat 工具将收到的流量再转发到目标 MySQL 数据库实例
- 整个过程形成了一个安全隧道,使开发者能够在不暴露数据库到公网的前提下,使用本地工具直接访问受保护的数据库资源
操作步骤
1. 创建 socat 代理 Pod
创建一个名为 socat-tunnel.yaml
的文件,内容如下:
yaml
apiVersion: v1
kind: Pod
metadata:
name: socat-tunnel
spec:
containers:
- name: socat-tunnel
image: alpine
command:
- sh
- -c
- |
apk add --no-cache socat
# 启动 MySQL 转发 (后台运行)
socat TCP-LISTEN:3306,fork TCP:YOUR_MYSQL_HOST:3306 &
# 可以继续添加更多服务转发。..
# 防止容器退出
tail -f /dev/null
apiVersion: v1
kind: Pod
metadata:
name: socat-tunnel
spec:
containers:
- name: socat-tunnel
image: alpine
command:
- sh
- -c
- |
apk add --no-cache socat
# 启动 MySQL 转发 (后台运行)
socat TCP-LISTEN:3306,fork TCP:YOUR_MYSQL_HOST:3306 &
# 可以继续添加更多服务转发。..
# 防止容器退出
tail -f /dev/null
应用配置到 Kubernetes 集群:
bash
kubectl apply -f ./socat-tunnel.yaml
kubectl apply -f ./socat-tunnel.yaml
2. 设置本地端口转发
一旦 socat-tunnel Pod 启动并运行,就可以使用 kubectl 设置本地端口转发:
bash
kubectl port-forward pod/socat-tunnel 13306:3306
kubectl port-forward pod/socat-tunnel 13306:3306
这将把本地机器上的 13306 端口转发到 socat-tunnel Pod 的 3306 端口,而 socat-tunnel 又会将流量转发到目标 MySQL 服务器。
如果使用 JetBrains IDE,可以利用其内置的 Kubernetes forward 功能,不需要每次手动执行这条命令。

3. 连接数据库
我们可以使用本地的数据库管理工具连接到远程 MySQL。
Host: localhost 或 127.0.0.1
Port: 13306
Username: <数据库用户名>
Password: <数据库密码>
4. 清理资源
完成工作后,记得删除创建的资源:
bash
kubectl delete -f ./socat-tunnel.yaml
kubectl delete -f ./socat-tunnel.yaml
总结
通过在 Kubernetes 集群中部署 socat 代理,我们可以安全地从本地环境访问位于远程的 MySQL 数据库,而无需更改数据库的网络设置或暴露数据库到公网。这种方法特别适合开发、测试和故障排除场景,能够显著提高开发效率。
请记住,安全始终是第一位的,确保在使用完毕后及时清理资源,避免不必要的安全风险。
评论
暂无评论,来发表第一条评论吧