You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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内部,无需依赖本地环境,更适合长期运行场景:

  1. 创建存储SSH密钥的Kubernetes Secret:
    kubectl create secret generic ssh-tunnel-key --from-file=id_rsa=/path/to/your/private-key
    
  2. 修改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
    
  3. 配置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端口转发反向映射(适合临时测试)

仅用于临时调试场景:

  1. 本地建立SSH隧道:ssh -N -L 3306:<内网MySQL主机>:3306 <SSH用户名>@<SSH服务器IP>
  2. 执行kubectl端口转发,将本地3306映射到Trino Pod内部的3306:
    kubectl port-forward <trino-pod-name> 3306:3306 --address 0.0.0.0
    
  3. Trino连接器配置中使用localhost:3306即可。

注意事项

  • 生产环境禁止使用StrictHostKeyChecking=no,建议预先将SSH服务器的主机密钥添加到Sidecar容器的known_hosts文件中(通过Secret挂载)。
  • SSH密钥需设置600权限,否则SSH会拒绝使用。
  • 确认SSH服务器的sshd_config中开启了AllowTcpForwarding配置。

内容的提问来源于stack exchange,提问作者nariver1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 09:05:12