标签:style blog http color java os io 数据
nova提供了novncproxy代理支持用户通过vnc来访问虚拟机,用户可以通过websocket、java客户端或者spicehtml5来访问。通过websket访问虚拟机的功能已经集成到horizon中,而通过java客户端则需要先安装相应的软件。为了方便用户访问虚拟机,nova通过有一个proxy来实现,proxy通常同nova-api一起部署。
vnc访问的实现方法如下,首先是启动一个虚拟机时启用vnc,这可以通过给kvm加上vnc参数即可。这样,kvm就会启动一个vncserver监听虚拟机。通过websocket来访问虚拟时,其步骤如下:
1. 通过nova-api获取访问url,url的格式是:http://ip:port/?token=xxx,该地址实际上就是vnc proxy的地址。
2. 浏览器连接到vnc proxy
3. vnc proxy连接到nova-consoleauth来验证token,并将token映射到虚拟机所在的宿主机的ip地址和某个端口,该端口就是虚拟机启动时所监听的端口。
4. vnc proxy与虚拟机所在的宿主机的vncserver建立连接,并开始代理,直到浏览器session结束。
在nova.conf中,计算节点可以指定vncserver的监听地址及vnc proxy应该通过那个地址连接到vncserver,该选项就是vncserver_proxyclient_address。vnc proxy充当了公网和计算节点之间的桥梁,此外还需要对vnc协议进行封装。
vnc proxy配置方法
通常情况下,为了提供完整的vnc功能,需要部署三个服务:
此外还需要对计算节点进行设当的配置。具体如下:
vnc proxy的配置则相对简单,只需要设置其监听的主机和端口即可。具体如下:
以novncproxy为例来看看是怎么实现的:
class NovaWebSocketProxy(websockify.WebSocketProxy): #继承自websockify中的WebSocketProxy,而WebSocketProxy则继承自WebSocketServer def __init__(self, *args, **kwargs): #继承父类init方法 def new_client(self): #将会在websocket连接建立完毕后执行 #1)从cookie中获取目标host,port #2)handshake as necessary #3)创建一个socket connect to vnc #4)do_proxy def do_proxy(self, target): ... rlist = [self.client, target]#self.client是websocket连接后生成的 #target就是上面创建后传入的socket,连接到vnc addr while True: wlist = [] if tqueue: wlist.append(target) if cqueue or c_pend: wlist.append(self.client) ins, outs, excepts = select(rlist, wlist, [], 1) if self.client in outs: #将数据发送给client if self.client in ins #从client接受数据 if target in outs: #将client data 发送到目标vnc地址 if target in ins: #从目标vnc地址接受数据
参考文档
http://zhengtianbao.com/?p=144
nova分析(9)—— nova-novncproxy,布布扣,bubuko.com
标签:style blog http color java os io 数据
原文地址:http://www.cnblogs.com/feisky/p/3876151.html