改造 Upterm 以支持 VSCode 远程连接任意容器

39afc02f59819102bd3d0cbe080318bb.gif

本文转自我的小米粥分你一半,原文:https://corvo.myseu.cn/2022/04/23/2022-04-23-%E6%94%B9%E9%80%A0upterm%E4%BB%A5%E6%94%AF%E6%8C%81VSCode%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5%E4%BB%BB%E6%84%8F%E5%AE%B9%E5%99%A8/,版权归原作者所有。欢迎投稿,投稿请添加微信好友:cloud-native-yang

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

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

现在的代码放在这里了:

  • https://github.com/corvofeng/upterm

upterm 安装与使用

安装

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

使用

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

f2a525c4f320ba411fc40f4c08b23c48.png

或者新开一个命令行 :

d3c7459ec94f9cff1792901cf119b04f.png

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

c5b1cf0f10b41aaa76183a59778ed3db.png
打开项目

Open Folder 可以打开仓库

41f907220ba408560e7ac5a05769749b.png
全功能 Terminal

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

35e07e5b6cf7b49d315f6da9ecf5216f.png
自动的本地端口转发

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

de5e50a26c9fb9406b3a98f7041b250a.png

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

原理及扩展

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

upterm 做了什么

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

a9176ae37dc307a207aa604ae973fb04.png

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

  1. 在本地建立 ssh server;

  2. 连接 uptermd,获取一个 session id,并打印;

  3. 当用户连接了对应的 session,就有了与本地 ssh server 交互的权力。

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

Remote SSH 功能

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

55d8e8e3163d0384a25a36f62fda22a3.png

结合一下

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

e43a2504a74b9e6177838efaa78b6fa6.png

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

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 系列 (六)-正向代理与端口映射](https://corvo.myseu.cn/2019/01/19/2019-01-19-OpenSSH 系列 (六 "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[2],手机端也要安装好完整的容器才可以使用;

  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 支持的一种方案[3]

  2. Kubernetes Dashboard 定制化简介[4]

Gitpod 使用与简单原理分析[5]

tmate 的服务的使用[6]

41719a0605b517ec6b271b5502ea06ac.png

VSCode remote 在 Android 上运行记录[7]

总结

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

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

引用链接

[1]

upterm 项目主页上面的流程图: https://github.com/owenthereal/upterm

[2]

Alpine Linux: https://code.visualstudio.com/docs/remote/linux#_remote-host-container-wsl-linux-prerequisites

[3]

基于 Kubernetes 的 PaaS 平台提供 dashboard 支持的一种方案: https://corvo.myseu.cn/2020/12/05/2020-12-05-%E5%9F%BA%E4%BA%8EKubernetes%E7%9A%84PaaS%E5%B9%B3%E5%8F%B0%E6%8F%90%E4%BE%9Bdashboard%E6%94%AF%E6%8C%81%E7%9A%84%E4%B8%80%E7%A7%8D%E6%96%B9%E6%A1%88/

[4]

Kubernetes Dashboard 定制化简介: https://corvo.myseu.cn/2021/09/09/2021-09-09-Kubernetes%20Dashboard%E5%AE%9A%E5%88%B6%E5%8C%96%E7%AE%80%E4%BB%8B/

[5]

Gitpod 使用与简单原理分析: https://corvo.myseu.cn/2021/12/11/2021-12-11-Gitpod%E4%BD%BF%E7%94%A8%E4%B8%8E%E7%AE%80%E5%8D%95%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90/

[6]

tmate 的服务的使用: https://corvo.myseu.cn/2020/12/29/2020-12-29-%E8%87%AA%E5%BB%BAtmate%E7%9A%84%E5%88%86%E4%BA%AB/

[7]

VSCode remote 在 Android 上运行记录: https://corvo.myseu.cn/2019/09/24/2019-09-24-vscode%E5%9C%A8Android%E4%B8%8A%E8%BF%90%E8%A1%8C%E8%AE%B0%E5%BD%95/

c29e04a7d0d34391385a8019011ae6ac.gif

d1818ce681b7e4676b99f7be1293ca0d.png

你可能还喜欢

点击下方图片即可阅读

Bash 编程易犯的错误大全

2022-05-09

2b3c20a81007567cf14adbcbe16c2552.png

如何正确计算 Kubernetes 容器 CPU 使用率

2022-05-07

13b74b0adebb3b5ee708c1f1b84a8acf.png

记一次 VictoriaMetrics 代理性能优化问题

2022-05-05

5531b9677f87165e09f277b2ed38a36c.png

4ec975b1d2407f0e2cae924e3b5763f8.gif

云原生是一种信仰 🤘

关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!

8cebef909b267d58c00d3de2a9f41745.gif

f3378546216637554efaf6cc4139ca87.gif

点击 "阅读原文" 获取更好的阅读体验!

发现朋友圈变“安静”了吗?

63e6a0dcc458e33a0bd38acc963279d2.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值