ContainerSSh:基于WebSocket的Linux容器远程访问解决方案
2015-09-28赵培龙
赵培龙
(同济大学电子与信息工程学院,上海201804)
ContainerSSh:基于WebSocket的Linux容器远程访问解决方案
赵培龙
(同济大学电子与信息工程学院,上海201804)
0 引言
云计算[1]是一种新的商业模式,它可以通过动态的,可扩展的方式来使用资源,使得资源充分利用,满足不同类型的应用。其中平台即服务(PaaS)[2]处于基础设施即服务(IaaS)与软件即服务(SaaS)之间,PaaS实际上是由一系列通用的功能抽离出来的开放API和SDK,使得底层对用户保持透明,可以让用户专注于业务开发,降低用户开发成本。
目前国内外已经有多个PaaS产品,国内有新浪SAE、百度BAE,国外有Google的GAE、微软Azure Service、亚马逊Web Services。虽然PaaS众多,但是对比于IaaS,PaaS并没有很流行,原因在于这些大大小小的PaaS平台为了对其自身系统进行保护,一般都会对用户的应用进行一些额外的限制,例如不能使用本地磁盘写、应用服务无状态等,这些要求就形成了其PaaS自身独有的开发标准,用户必须遵守其标准进行开发应用,一般各个PaaS平台的标准是不一样的。再者,一个PaaS平台并不一定能完全满足用户所有的需求,用户想要增加自己的新服务要么等PaaS提供商开发,要么只有用自己的服务器,从这点来说PaaS并没有完全解决所有用户的痛点。而IaaS提供弹性虚拟机的方式最大限度的为用户提供了基础设施,用户的应用没有平台的约束,其应用可以很方便的迁移到云端。同时,PaaS一般为了实现高可用以及运行效率,一般都是采用的多租户模式,这种方式一般都会导致比IaaS更加麻烦的安全隔离问题[3]。
近年来以Docker为代表的容器引擎大大的改造了传统的PaaS服务,Docker使用操作系统虚拟化,层叠式文件系统以及统一的配置标准的一系列技术都为PaaS提供了较好的资源隔离以及规范了用户应用的打包部署流程,不仅仅在一定程度上解决了多租户隔离以及平台迁移的问题,也解决了用户在PaaS中增加用户自定义服务的问题。使用容器的PaaS平台的代表有Google的GCE、阿里的ACE。
Docker一般可以通过DockerFile的方式来配置用户自定义的服务,但是这种方式学习曲线太高,对用户不友好,第二种方式则是在容器启动之后再启动一个sshd服务,用户通过ssh直接访问容器进行控制,这种方式的优势就是不需要用户进行新的学习,直接上手,但是其缺点则是需要在容器中开额外的进程服务,会浪费一定的系统资源,再者PaaS中一般不会给一个容器分配固定IP,所以通过这种方式访问则需要进行ssh的代理,这种四层代理会增加网络的复杂性,也不利于容器的访问控制。
综上,本文设计的ContainerSSh系统,这是一款专门针对PaaS中的容器访问而提出来的,基于浏览器访问控制容器的Web终端模拟器系统,用户只需要在浏览器上输入相关uri就可以方便的访问和控制用户在PaaS中的容器,其优势在于无需特别的客户端,只需要浏览器,而且基于七层代理[4],能对流量和访问进行更加进行精准的控制,保证容器安全。
1 系统体系结构
ContainerSSh的整体设计如图1所示,整个系统包含有5个独立的子系统:用户终端程序、统一代理服务器、验证服务器、Docker守护进程、Docker容器。
图1 ContainerSSh系统部署图
五个子系统之间都通过RESTful API[5]进行通信,用户终端是运行在用户的浏览器上,其给用户呈现一个Linux终端仿真器,与Linux自身终端体验效果一致。用户访问容器的所有流量首先都会通过桥接服务器,它会把不同的用户的流量指配到若干台机器中,用户流量被制定到某台机器后,Browser Agent会将用户的流量直接输入到Docker守护进程中从而达到与Docker容器交互的目的,其中Browser Agent和Docker守护进程需要部署在同一台机器上。
ContainerSSh整体架构如图2,大致可分为3层,视图层、管道层、服务层外加一个监控服务 。
视图层主要是运行在用户浏览器上的Web模拟终端。
管道层是用户浏览器与后端服务交互的管道类型,其主要目的是维护前后端的通信任务,根据通信的目标不一样所以划分了有三种不同的管道,WebSocket,RESTful API,Static file server。WebSocket Channel是负责将用户在模拟终端中的输入数据以及容器中的输出数据打通,这是操纵容器的数据流通道,RESTful API channel是对外开放的API,主要目的是提供ContainerSSh系统的运行状态信息,以便系统管理员能熟知系统整体运行状况,Static file Server是一个内置的Web服务器,其作用主要是提供前端的静态文件。
服务层主要通过WebSocket Channel以及RESTful API的方式与前端通信,Proxy Services是作为整个服务系统的接口,所有的流量都将从这里进出,它负责容器的分配以及channel的控制。Monitor监控整个服务层的健康状况,例如机器过载,恶意调用API等,它会向Proxy Service发出相关命令执行相关任务,例如断开链接,拒绝某个用户请求等。Container Service主要是容器相关的操作,这部分的工作大部分是依赖于Docker这个开源的工具,Proxy Service会直调用其API来控制容器。
2 关键技术
图2 ContainerSSh系统架构图
在浏览器上的服务基本上都是基于HTTP协议进行通信,但是HTTP协议是基于请求-相应的模式设计的,且是单向无状态协议[6],直接使用其并不能满足基于浏览器的终端的实时性的要求。
业界对于Web实时通信一般使用AJAX轮询方式,通过客户端频繁与服务器建立连接查询的方式实现实时通信,但由于TCP连接一次建立也需要消耗相当的资源,所以一般这种方式效率太低,并不能有效地实现实时通信[7]。为了解决这个问题,IETF(互联网工程任务组)以及W3C一起制定了WebSocket协议[8],W3C制定了WebSocket API,IETF基于HTTP实现了Web-Socket。WebSocket协议改变了HTTP的请求-相应模式,能够真正建立起服务端与客户端的全双工通道。基于WebSocket就能够实现ContainerSSh的实时通信,能够显著地减少双向数据的时延以及系统的负载。
ContainerSSh通过uri辨别的方式来把不同用户的请求定位到不同的容器里中,所以ContainerSSh需要实现代理服务,将不同的用户流量导入到对应的容器中。
(1)连续中继代理
在实现代理服务的时候考虑到系统的健壮性,在Browser Agent的前端增加了一个桥接服务器,其目的是对Docker服务器集群进行负载均衡以及安全检查,防止恶意用户攻击系统以及单点故障。
所以ContainerSSh从用户到最终容器的数据流要经过以下几个步骤:
①客户端调用桥接服务器的API,要求与指定容器进行通信。
②桥接服务器收到调用请求之后会对其进行用户校验,若校验成功则返回客户端静态文件,若是失败则返回相关的错误信息。
③若桥接服务器允许调用,那么浏览器会得到正确的客户端代码,接受完客户端代码之后客户端的代码会自动执行,主动向桥接服务器发起websocket连接。
④为了防止用户恶意频繁调用系统,导致系统资源紧张,所以制定了一个用户同一时间内只能使用一个容器镜像实例的规则,所以桥接服务器接受到该websocket连接之后,会首先根据用户以及请求的容器镜像信息进行异常检测,防止出现恶意调用的情况。若是出现异常则直接返回错误代码给客户端。
⑤通过异常检查之后,桥接服务器将会从Docker服务器集群选出一台服务器来处理该次请求。
⑥桥接服务器会先对选出的Docker服务器的Browser Agent发起websocket连接,Browser Agent收到连接之后,直接调用Docker daemon的API创建及运行容器,其也是使用websocket与Docker daemon进行通信。最终用户在客户端上的输入数据,就用桥接服务器转发到Browser Agent然后转发到Docker daemon,最后进入到容器当中;容器中的输出数据首先流入到Docker daemon,然后转发到Browser Agent,然后又到桥接服务器,最后到达用户终端。
(2)中断处理
由于整个系统中数据被代理转发的次数较多,所以如果有一处连接断开,那么整个数据链路就会出现断裂,如果系统不能够及时的检测到断裂并且清理掉数据链路,那么用户终端会出现假死的情况,所以当出现某处连接断开时,系统应该能够自动自动检测出并关闭整个数据链路,提示用户出错信息。基于此需求,ContainerSSh实现了一种保险融断机制:当输入输出流中有一方突然关闭,那么会自动关闭另外一方。系统中所有代理处都是使用了这样的机制,所以当出现某处I/O断开的时候,系统能够沿着数据链路依次关闭,最终通知到最终端。
伪代码如下:
Source代表输入流,dest代表输出流,只要任意一方流关闭,则会关闭另外一方流,且执行错误处理函数。
3 ContainerSSh功能测试
本节主要测试ContainerSSh的主要功能,包括访问控制容器测试,API频繁调用检查测试,连接中断测试。
使用ContainerSSh与传统SSh同时登录容器,在ContainerSSh或SSh中输入指令,观察另外一方是否同步。
效果如图3,无论从ContainerSSh还是传统的SSh发送指令,另一方都可以即时收到数据。
图3 ContainerSSh连通测试
首先在一个浏览器中访问如下uri来登陆一个容器:
容器登录成功之后,再次调用该uri,效果如图4,系统成功阻止了API相同时间多次调用的问题。
图4 API调用检查测试
同样使用ContainerSSh与传统SSh同时登录容器。
先关闭ContainerSSh的容器中断,观察传统SSh是否被关闭,效果如图5(a)。
再同时使用ContainerSSh与SSh登陆容器,使用Docker kill命令直接关闭容器,浏览器上的终端也同时关闭了,效果如图5(b)。
4 结语
随着容器技术在云计算当中越来越广泛的应用,各类基于容器技术的云平台也是越来越多,由于大多数云平台的限制,其一般不会为容器分配固定IP,所以当用户有直接访问容器的需求时,如何让用户能够方便的访问平台中的容器以及如何在多租户的情况下保障平台安全的问题成为了基于容器的云平台所需要解决的问题。
ContainerSSh利用 websocket技术以及容器引擎Docker构建了基于Docker云平台的容器访问解决方案,能够有效地解决用户直接访问容器的问题并且也能够对系统提供一定的安全保障。
图5
[1]吴吉义,平玲娣,潘雪增,等.云计算:从概念到平台[J].电信科学,2010(01):1-11.
[2]Kibe S,Watanabe S,Kunishima K,et al.PaaS on IaaS[C].2013 IEEE 27th International Conference on Advanced Information Networking and Applications(AINA).IEEE Computer Society,2013:362-367.
[3]林兆骥,付雄,王汝传,等.云计算安全关键问题研究[J].信息化研究,2011(02):1-4.
[4]黎哲,郭成城,陈亮.一个基于TCP迁移机制的第七层负载均衡系统[J].计算机应用研究,2005(04):116-118.
[5]Taylor R N,California U O,Irvine.Principled Design of the Modern Web Architecture[C].Software Engineering,2000.Proceedings of the 2000 International Conference on.IEEE,2000:407-416.
[6]吴晓东,王鹏.Html5的通信机制及效率的研究[J].长春理工大学学报:自然科学版,2011(04):159-163.
[7]Pimentel V,Nickerson B G.Communicating and Displaying Real-Time Data with WebSocket[J].IEEE Internet Computing,2012,16 (4):45-53.
[8]W3C.The WebSocket API[EB/OL].http://www.w3.org/TR/2012/CR-websockets-20120920/2015.10.28.
Docker;Container;PaaS;Cloud Computing;WebSocket
ContainerSSh:Linux Container Remote Access Solution Based on WebSocket Protocol
ZHAO Pei-long
(School of Electronics and Information Engineering,Tongji University,Shanghai 201803)
1007-1423(2015)36-0071-05
10.3969/j.issn.1007-1423.2015.36.016
赵培龙(1990-),男,四川绵阳人,硕士研究生,研究方向为容器与云计算
2015-11-10
2015-11-30
随着容器技术在云计算中的大量应用,以Docker为代表的容器引擎在PaaS中大放光彩,出现一大批基于Docker的云计算初创公司。然而由于基于容器的云平台的特殊性,一般不会为容器分配固定IP,导致用户无法直接对云平台中的容器进行访问控制,对用户添加自定义服务等操作增加不便,ContainerSSh则是专门针对该问题而设计的解决方案。
Docker;Container;PaaS;云计算;WebSocket
With the development of container technology in cloud computing,it has been a large number of applications are created in cloud computing,Docker is a popular container engine and a lot of startups provide services based on Docker.So container technology has a very important for PaaS.However,due to the special nature of cloud platform based container,most of cloud platform will not assign fixed IP to container,user can not directly access and control the container in the cloud platform,so users are difficult to add personalized service. ContainerSSh is a solution that is designed to solve that problems.