本地环境使用 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 集群可访问

基本原理

k8s-socat-forward

  1. 开发者使用本地 MySQL 客户端连接到本地端口 13306
  2. kubectl port-forward 命令将本地 13306 端口的流量转发到 K8s 集群中的 socat-tunnel Pod 的 3306 端口
  3. socat-tunnel Pod 通过 socat 工具将收到的流量再转发到目标 MySQL 数据库实例
  4. 整个过程形成了一个安全隧道,使开发者能够在不暴露数据库到公网的前提下,使用本地工具直接访问受保护的数据库资源

操作步骤

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 功能,不需要每次手动执行这条命令。

intellij-idea

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 数据库,而无需更改数据库的网络设置或暴露数据库到公网。这种方法特别适合开发、测试和故障排除场景,能够显著提高开发效率。

请记住,安全始终是第一位的,确保在使用完毕后及时清理资源,避免不必要的安全风险。

评论

后继续评论需要管理员审核后可见

暂无评论,来发表第一条评论吧