
背景
在HTTP/HTTPS的世界里,TCP/IP数据包的源和目标是公开的。恶意的第三方可以干扰网络连接,将污染过的数据包发送给请求源,从而实现阻止或中断连接。

HPC应用总类繁多,各种软件可能运行在不同的系统平台之上,容器技术正是解决这类问题的绝佳手段。我在Singularity——HPC环境的绝佳容器解决方案一文中介绍了Singularity这个HPC下非常适合的容器技术。但是Singularity也有一些不尽人意的地方,例如缺少虚拟化网络、热度不如Docker高等。那如果想在一个高性能集群中使用Docker又会遇到什么问题呢?有没有什么好的解决方案?

Slurm是一套功能非常强大的集群调度系统,能够实现按需调度计算资源。Singularity是一套轻量的容器系统,它可以无缝的和现有的环境结合,为应用提供一个”运行时环境“,你可以把它想象成一个没有Daemon进程没有网络虚拟化技术的Docker。那二者相结合会产生什么有趣的结果呢?

我们知道Docker是如今炙手可热的应用级容器,而LXC可以看作是系统级的容器。那么问题来了,是否可以在一个系统级的容器里面运行一个应用级的容器呢?答案是可以的,不过过程并没有想象的那么容易,百般折腾后部署成功了,在这个过程中也发现了一些问题。
在集群中经常我们会需要在多个节点上执行相同的操作,有不少的软件能帮助我们实现这样的需求,例如大名鼎鼎的Salt,或者更加轻量级的dsh。但是一方面如果在我们自己编写的程序里面再调用这些软件获取并行命令的输出结果,这个命令的执行其实是阻塞的,需要一直等待salt/dsh命令执行完毕后获取输出。

熟悉Linux或MacOS的同学都应该对终端并不陌生,诸如XShell、PuTTY这样的工具大家也应该很熟悉。如今各种私有云、公有云、虚拟化技术正在蓬勃发展,工作在集群之上的Web应用程序如果能够提供可以执行命令的终端窗口,将大大改善用户的使用体验。这篇文章就跟大家介绍一下我是如何利用Golang实现支持多节点多用户的Web终端。