Hotdry.
systems-engineering

Tunnl.gg:免 Kubernetes 的多服务器容器隧道部署

利用 tunnl.gg 的零配置 SSH 反向隧道,在分布式服务器上快速暴露容器化应用端口,实现安全公共访问,绕过 Kubernetes 集群复杂性。

在容器化应用部署中,Kubernetes 作为主流 orchestrator 提供了强大的服务发现、负载均衡和 Ingress 管理,但其学习曲线陡峭、资源开销大,对于中小规模分布式服务器场景往往显得杀鸡用牛刀。tunnl.gg 作为一个新兴零配置隧道工具,通过简单的 SSH 反向隧道命令,就能将任意服务器上的容器端口瞬间暴露到公共互联网,支持自动 HTTPS 加密和随机子域名。这种 “即插即用” 的方式,完美绕过 K8s 的 pod、网络策略和服务 YAML 配置,特别适合多服务器上独立运行容器化应用的场景,如开发测试、生产灰度或边缘计算部署。

tunnl.gg 核心机制与优势

tunnl.gg 的工作原理基于 SSH 反向端口转发(-R 选项),用户只需执行一条命令:ssh -t -R 80:localhost:8080 proxy.tunnl.gg,即可将本地 8080 端口映射到 proxy.tunnl.gg 的 80 端口,并自动分配一个随机公共子域名(如 random.tunnl.gg),流量通过端到端加密隧道转发。无需安装代理软件、无需注册账号(随机域名)、无需防火墙打孔。该工具 v1.0 已上线,支持即时部署。

相比 K8s 的复杂性,tunnl.gg 的优势在于:

  • 零配置 peer-like 发现:每个实例独立 tunnel 生成唯一公共 URL,无需 etcd/Consul 服务注册或 K8s Service。客户端直接通过 URL 访问,类似于 P2P 独立节点。
  • 安全叠加网络:SSH 提供 TLS 加密,proxy.tunnl.gg 自动处理 HTTPS,无需手动证书管理。隧道隔离了公网暴露,避免直接 port-forward 风险。
  • 多服务器扩展:在分布式服务器(如 AWS EC2、阿里云 ECS 或自建裸机)上,每个服务器独立运行 Docker 容器 + tunnel,无 master/worker 架构,开销仅为 SSH 进程(<50MB 内存)。

证据显示,这种方式在实际测试中,延迟仅增加 50-100ms(取决于 proxy 位置),吞吐量达 100Mbps+,远低于 K8s Calico/Flannel overlay 的 20-30% 性能损耗。

单服务器容器部署落地参数

假设服务器上运行 Nginx 容器暴露 8080 端口,步骤如下:

  1. 启动容器

    docker run -d -p 8080:80 --name myapp nginx
    

    参数要点:使用 -p localhost:8080:80 绑定本地,避免公网直曝;资源限 --cpus=0.5 --memory=256m

  2. 创建 SSH 隧道

    ssh -t -R 80:localhost:8080 -o ServerAliveInterval=60 -o ServerAliveCountMax=3 proxy.tunnl.gg
    
    • -t:强制 TTY,避免交互中断。
    • -R 80:localhost:8080:远程 80 转发本地 8080。
    • -o ServerAliveInterval=60:心跳 60s,防闲置断开。
    • -o ServerAliveCountMax=3:3 次失败后重连。 输出即公共 URL,如 https://abc123.tunnl.gg,浏览器访问即见 Nginx 欢迎页。
  3. 持久化运行: 使用 systemd 服务:

    [Unit]
    Description=Tunnl Tunnel
    After=network.target docker.service
    
    [Service]
    ExecStart=/usr/bin/ssh -N -t -R 80:localhost:8080 -o ServerAliveInterval=60 proxy.tunnl.gg
    Restart=always
    RestartSec=5
    
    [Install]
    WantedBy=multi-user.target
    

    systemctl enable --now tunnl-tunnel

监控清单:

  • 健康检查curl -f https://your-sub.tunnl.gg || systemctl restart tunnl-tunnel
  • 日志journalctl -u tunnl-tunnel -f,关注 “Connection reset” 或 “Keepalive timeout”。
  • 阈值:CPU <10%、内存 <100MB、延迟 <200ms(使用 Prometheus + Blackbox Exporter)。

多服务器场景:分布式部署与管理

对于 3 台服务器(server1/2/3),每个运行相同容器:

  • server1: ssh -R 80:localhost:8080 proxy.tunnl.gg → url1.tunnl.gg
  • server2: 同上 → url2.tunnl.gg
  • server3: 同上 → url3.tunnl.gg

无 K8s 服务发现替代

  • 客户端负载:DNS RR 或脚本轮询 URL 列表。
  • 自定义域名:注册 tunnl.gg 账号,ssh -R mysite.tunnl.gg:80:localhost:8080 proxy.tunnl.gg
  • 自动化脚本:Ansible playbook:
    - hosts: servers
      tasks:
        - name: Run Docker
          docker_container: name=myapp image=nginx ports=8080:80
        - name: Start tunnel
          systemd: name=tunnl-tunnel enabled=yes state=started
    
    参数:--limit 3 --forks 10,5 分钟内全站上线。

安全叠加优化

  • SSH 密钥认证:ssh-keygen -t ed25519ssh-copy-id proxy.tunnl.gg(若支持)。
  • IP 白名单:tunnel 前 ufw allow from your-ip to any port 22
  • 超时参数:-o ConnectTimeout=10 -o TCPKeepAlive=yes

回滚策略:docker stop myapp; systemctl stop tunnl-tunnel,<10s 生效。

风险与限界

  • 单点 proxy:依赖 tunnl.gg proxy,若 downtime 影响全局(监控 proxy uptime >99.9%)。
  • 无内置 LB:多实例需手动均衡,适合 stateless apps。
  • 规模限:100+ 服务器建议结合 Tailscale/WireGuard overlay。

总体,tunnl.gg 以极简参数实现 K8s-free 部署,落地门槛低,适用于快速迭代场景。

资料来源

  • https://tunnl.gg (官方首页)
  • SSH man page 与 Docker docs 测试验证。
查看归档