分享

openstack nova-novncproxy介绍

pig2 发表于 2015-3-16 14:42:57 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 50697

问题导读
1.如何实现vnc访问访问?
2.为了提供完整的vnc功能,需要哪些服务?
3.nova-consoleauth的作用是什么?





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功能,需要部署三个服务:
  • nova-consoleauth: 提供token验证,维护token与ip地址、端口号的映射。
  • nova-novncproxy: 支持基于浏览器的vnc 客户端,通常与nova-api部署在一起。
  • nova-xvpvncproxy: 支持基于java的vnc客户端,,通常与nova-api部署在一起。
此外还需要对计算节点进行设当的配置。具体如下:
  • vnc_enabled=True   启用虚拟机的vnc功能。
  • vncserver_listen=0.0.0.0   默认是127.0.0.1,即只可以从本机进行访问,通常情况下是配置为管理网的IP地址。设置为0.0.0.0主要是考虑到动态迁移时,目的宿主机没有相应的IP地址,动态迁移会失败。
  • vncserver_proxyclient_address  该地址指明vnc proxy应该通过那个IP地址来连接vncserver,通常是管理网IP地址。
  • novncproxy_base_url=http://$SERVICE_HOST:6080/vnc_auto.html  指定浏览器client应该连接的地址。$SERVICE_HOST通常是一个公网IP地址。
  • xvpvncproxy_base_url=http://$SERVICE_HOST:6081/console  指定java client应该连接的地址。$SERVICE_HOST通常是一个公网IP地址。
vnc proxy的配置则相对简单,只需要设置其监听的主机和端口即可。具体如下:
  • novncproxy_host=$SERVICE_HOST  通常为一个公网IP。
  • novncproxy_host=6080
  • xvpvncproxy_host=$SERVICE_HOST 通常为一个公网IP。
  • xvpvncproxy_port=6081
以novncproxy为例来看看是怎么实现的:
  1. class NovaWebSocketProxy(websockify.WebSocketProxy):
  2.     #继承自websockify中的WebSocketProxy,而WebSocketProxy则继承自WebSocketServer
  3.     def __init__(self, *args, **kwargs):
  4.         #继承父类init方法
  5.      
  6.     def new_client(self):
  7.         #将会在websocket连接建立完毕后执行
  8.         #1)从cookie中获取目标host,port
  9.         #2)handshake as necessary
  10.         #3)创建一个socket connect to vnc
  11.         #4)do_proxy
  12. def do_proxy(self, target):
  13.     ...
  14.     rlist = [self.client, target]#self.client是websocket连接后生成的
  15.                          #target就是上面创建后传入的socket,连接到vnc addr
  16.      
  17.     while True:
  18.         wlist = []
  19.         if tqueue: wlist.append(target)
  20.         if cqueue or c_pend: wlist.append(self.client)
  21.         ins, outs, excepts = select(rlist, wlist, [], 1)
  22.          
  23.         if self.client in outs:
  24.             #将数据发送给client
  25.         if self.client in ins
  26.             #从client接受数据
  27.         if target in outs:
  28.             #将client data 发送到目标vnc地址
  29.         if target in ins:
  30.             #从目标vnc地址接受数据
复制代码



已有(3)人评论

跳转到指定楼层
dailele 发表于 2015-12-13 15:26:37
出现如下错误是啥原因呢

配置如下:openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 192.168.202.7
openstack-config --set /etc/nova/nova.conf DEFAULT vncserver_listen 192.168.202.7
openstack-config --set /etc/nova/nova.conf DEFAULT vncserver_proxyclient_address 192.168.202.7


openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 192.168.202.8
openstack-config --set /etc/nova/nova.conf DEFAULT vnc_enabled True
openstack-config --set /etc/nova/nova.conf DEFAULT vncserver_listen 0.0.0.0
openstack-config --set /etc/nova/nova.conf DEFAULT vncserver_proxyclient_address 192.168.202.8
openstack-config --set /etc/nova/nova.conf \
       DEFAULT novncproxy_base_url http://controller:6080/vnc_auto.html




错误如下:
[root@controller ~ admin]#/usr/bin/nova-novncproxy --web /usr/share/novnc/
Traceback (most recent call last):
  File "/usr/bin/nova-novncproxy", line 10, in <module>
    sys.exit(main())
  File "/usr/lib/python2.6/site-packages/nova/cmd/novncproxy.py", line 87, in main
    wrap_cmd=None)
  File "/usr/lib/python2.6/site-packages/nova/console/websocketproxy.py", line 47, in __init__
    ssl_target=None, *args, **kwargs)
  File "/usr/lib/python2.6/site-packages/websockify/websocketproxy.py", line 231, in __init__
    websocket.WebSocketServer.__init__(self, RequestHandlerClass, *args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'no_parent'
回复

使用道具 举报

atsky123 发表于 2015-12-13 16:39:04
dailele 发表于 2015-12-13 15:26
出现如下错误是啥原因呢

配置如下:openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 192.168 ...

看详细日志,或则自己debug
openstack如何调试排除错误http://www.aboutyun.com/thread-7510-1-1.html
(出处: about云开发)



回复

使用道具 举报

dailele 发表于 2015-12-14 09:27:13
pip install websockify==0.5.1

websockify版本过高的问题

via:
http://www.unixhot.com/article/27
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条