如何在Kubernetes(Kind)中通过SSH隧道连接后端MySQL服务器?
连接SSH后方MySQL到Kind/K8s中Trino的可行方案
方案一:本地SSH隧道+K8s访问本地主机
- 先在本地建立SSH隧道,将内网MySQL端口转发到本地3306:
(ssh -N -L 127.0.0.1:3306:<内网MySQL主机>:3306 <SSH用户名>@<SSH服务器IP>-N表示不执行远程命令,仅做端口转发) - 由于Kind基于Docker运行,Trino Pod可通过
host.docker.internal访问本地主机(Windows/macOS默认支持;Linux需在启动Kind时添加--extra-port-mappings或修改Docker配置开启该功能)。 - 配置Trino的MySQL连接器(通常在
etc/catalog/mysql.properties):connector.name=mysql connection-url=jdbc:mysql://host.docker.internal:3306/<目标数据库名>?useSSL=false connection-user=<MySQL用户名> connection-password=<MySQL密码> - 若Linux下
host.docker.internal不可用,可替换为本地网卡的实际IP(如192.168.1.100),并确保Kind集群能访问该IP。
方案二:K8s Pod内部署SSH隧道Sidecar容器
该方案将隧道逻辑集成到K8s Pod内部,无需依赖本地环境,更适合长期运行场景:
- 创建存储SSH密钥的Kubernetes Secret:
kubectl create secret generic ssh-tunnel-key --from-file=id_rsa=/path/to/your/private-key - 修改Trino的Deployment配置,添加Sidecar容器:
apiVersion: apps/v1 kind: Deployment metadata: name: trino spec: replicas: 1 template: spec: containers: - name: trino-coordinator image: trinodb/trino:latest volumeMounts: - name: catalogs mountPath: /etc/trino/catalog - name: ssh-tunnel image: alpine/ssh:latest command: ["ssh"] args: [ "-N", "-i", "/root/.ssh/id_rsa", "-L", "3306:<内网MySQL主机>:3306", "-o", "StrictHostKeyChecking=no", # 生产环境建议手动导入主机密钥,避免自动接受 "<SSH用户名>@<SSH服务器IP>" ] volumeMounts: - name: ssh-key mountPath: /root/.ssh readOnly: true volumes: - name: catalogs configMap: name: trino-catalogs - name: ssh-key secret: secretName: ssh-tunnel-key - 配置Trino的MySQL连接器,直接指向Sidecar暴露的本地端口:
connector.name=mysql connection-url=jdbc:mysql://localhost:3306/<目标数据库名>?useSSL=false connection-user=<MySQL用户名> connection-password=<MySQL密码>
- 可选优化:用
autossh替代普通ssh实现隧道自动重连,将Sidecar镜像换成linuxserver/autossh,修改命令为:autossh -M 0 -N -i /root/.ssh/id_rsa -L 3306:<内网MySQL主机>:3306 -o StrictHostKeyChecking=no <SSH用户名>@<SSH服务器IP>
方案三:Kubectl端口转发反向映射(适合临时测试)
仅用于临时调试场景:
- 本地建立SSH隧道:
ssh -N -L 3306:<内网MySQL主机>:3306 <SSH用户名>@<SSH服务器IP> - 执行kubectl端口转发,将本地3306映射到Trino Pod内部的3306:
kubectl port-forward <trino-pod-name> 3306:3306 --address 0.0.0.0 - Trino连接器配置中使用
localhost:3306即可。
注意事项
- 生产环境禁止使用
StrictHostKeyChecking=no,建议预先将SSH服务器的主机密钥添加到Sidecar容器的known_hosts文件中(通过Secret挂载)。 - SSH密钥需设置600权限,否则SSH会拒绝使用。
- 确认SSH服务器的
sshd_config中开启了AllowTcpForwarding配置。
内容的提问来源于stack exchange,提问作者nariver1
相关产品推荐
相关产品推荐

