我们的平台自从增加了dashboard功能, 从使用者们那边得到的反馈很多, 基本都是不稳定经常断线, 没法传文件这种问题. 说明大家用的很多, 并且希望它能成为稳定的服务. 所以不管从功能性, 还是稳定性的角度, 我都应该考虑下对它进行扩展和改进.

博客分为两部分, 前半部分介绍如何使用, 后半部分针对工作原理进行简单说明. 公网自建的uptermd是个自用的小水管, 经不起大风大浪, 请大家合理使用. 我不是很想用爱发电, 有心用的同学可以捐点服务器费用.

现在的代码放在这里了:

https://github.com/corvofeng/upterm

upterm安装与使用

安装

1
bash <(curl -sL http://corvo.myseu.cn/scripts/upterm.sh)

使用

你可以直接将上面的uri贴到浏览器中启动:

或者新开一个命令行:

当VSCode左下角有了这个图标, 就表示远程连接已经成功了

打开项目

Open Folder可以打开仓库

全功能Terminal

它是一个全功能的SSH服务器, 放大之后当个Terminal来用也可以, 也支持分屏

自动的本地端口转发

当你在远程的Linux中启动了端口之后, VSCode能帮你自动转发到本地, 可以获得接近原生的开发体验

还有很多功能, 用户可以自己探索下. 例如, 拷贝文件, 安装插件, 只要是VSCode remote支持的功能, 它都可以用

原理及扩展

你可以粗浅的认为这个工具拥有openssh-server+frp的功能

upterm做了什么

左右是两台机器, 其中一台机器使用upterm开启了服务, 另一台可以直接连接其session.

upterm是与tmate类似的工具(tmate可能相对多知名一点), upterm做了几个工作:

  1. 在本地建立ssh server
  2. 连接uptermd, 获取一个session id, 并打印
  3. 当用户连接了对应的session, 就有了与本地ssh server交互的权力

有兴趣的读者可以参考upterm项目主页上面的流程图

Remote SSH功能

这是VSCode官方的图, 可以认为是前端的代码编辑器与后端的Sever分离

结合一下

upterm已经提供给我们ssh连接的功能, 为什么不能直接使用VSCode的remote ssh功能呢. 这个要从remote ssh的实现说起,

当我们使用VSCode远程开发时, 它是这样连接的远程服务器:

1
ssh -T -D 1234 192.168.101.135 -p 2224 bash

这个命令需要拆开来看:

  1. ssh -T 192.168.101.135 -p 2224 bash 这个命令的含义是远程连接服务器后, 不启动tty, 直接启动bash.
  2. ssh -D 1234 xxxxx 表示本地建立一个socks5的转发服务, 具体使用可见OpenSSH系列(六)-正向代理与端口映射

所以只要我们的ssh服务器能够提供给VSCode这样的连接方式, 就可以了. 感谢Golang的库开发者, 让我有机会比较容易的建立一个ssh服务, 具体的代码我放在gist中了, 有兴趣的读者可以去看:

https://gist.github.com/corvofeng/45c01edd33fa750e31653a90b1c4cdec

建立ssh连接之后的通信的过程: remote机器会下载一个code-server执行文件, 然后启动, VSCode之后仅与服务器中的code-server通信.

瓶颈以及扩展

从目前使用的情况来看, 现有的工具确实有一些瓶颈, 比如:

  1. 每次到一个新的容器中, 都需要重新下载一个code-server并启动, 会占用带宽
  2. 每次到一个新的容器中, 用户的插件配置也需要重新下载, 使用体验上没那么好
  3. session id每次都会变, 可能会导致vscode保存的历史纪录太多了
  4. 目前vscode还不支持Alpine Linux, 手机端也要安装好完整的容器才可以使用
  5. 每个容器中的用户可能之后root, 所以多人合作使用一个容器的场景其实是有问题的

与Gitpod相比, 这个项目仅仅是能用, 还称不上好用:

  1. 用户的配置文件和插件的保存与下载, 至少要获得每个容器相对来讲一致的体验
  2. 企业级的功能和鉴权, 在企业内部使用的话, 还是希望能有一套基于OpenID或是Oauth的鉴权系统, 有了这个系统之后, session id就可以用它来进行替换
  3. 如果想要支持手机设备, 可能需要类似Gitpod一样有个网页版, 用户用起来会更加方便的

看到Gitpod两轮融了1600万美元, 真的还是有点心动. 现代安卓机器性能过剩很多, 如果我们能支持Android, 就是相当不错的一个产品.

其他相关内容

从我一开始将Dashboard引入到系统中, 我就有个目标是允许我们的用户通过本地的ssh或是VSCode连接远程. 因为我们的开发语言都是Python. 线上环境的Pod其实有一整套Python代码, 所以能够支持用户开发或者调试是很有必要的. 下面是我做过的一些尝试和调研.

如何定制与裁剪Dashboard

  1. 基于Kubernetes的PaaS平台提供dashboard支持的一种方案
  2. Kubernetes Dashboard定制化简介

Gitpod使用与简单原理分析

tmate的服务的使用

VSCode remote在Android上运行记录

总结

有人可能会说有的用就不错了, 用户可能完全可以用ssh+frp实现VSCode remote ssh功能, 但是这样的学习成本有点太高了, 需要每次安装好多依赖, 很可能有需求也不会去这么用. 我主要想简化这个启动过程, 做到一条命令映射给VSCode可用的ssh server. 功能做出来之后其实通用性很强的,

我已经将原理简单介绍过了, 安全性的话就见仁见智了, 建议经常性的重连来强制刷新token.