nova 远程访问

原文地址:http://www.tuicool.com/articles/7fqMN3Z
http://blog.csdn.net/ztejiagn/article/details/8813772
http://www.cnblogs.com/popsuper1982/p/3800227.html
https://docs.openstack.org/admin-guide/compute-remote-console-access.html#about-nova-consoleauth

前言-目的

通过openStack dashboard 或是命令行使用VNC或是Spice html5来提供远程控制台或是远程桌面控制功能,用以远程访问操作客户VM。

1. 关于nova-consoleauth

nova-consoleauth:不管是使用VNC还是Spice Html5,它们客户端代理都需要一个token认证服务,这就是nova-consoleAuth. 对于不同类型的代理,配置单一的nova-consoleAuth认证服务就可。

2.VNC Proxy的功能:

VNC console proxy:一个openStack组件,允许VM客户通过VNC客户端访问VM。

作用:
将公网(public network)和私网(private network)隔离
VNC client运行在公网上,VNCServer运行在私网上,VNC Proxy作为中间的桥梁将二者连接起来
VNC Proxy通过token对VNC Client进行验证
VNC Proxy不仅仅使得私网的访问更加安全,而且将具体的VNC Server的实现分离,可以支持不同Hypervisor的VNC Server但不影响用户体验

PS:补充SPICE console内容
VNC协议功能有限,不支持多个控制(感觉意思是多个用户同时访问)、双向音频、可靠的cut-pasete、视频流服务等。Spice是一个新的协议,用来解决VNC协议的这些限制,为用户提供更好的服务。
使用Spice 服务需要nova-spicehtml5proxy代理。nova-spicehtml5proxy直接和hypervisor进程通信。

3. vnc proxy的实现原理

vnc 是nova提供的用来访问虚拟机的一项重要功能,用户可以通过websocket来访问,也可以通过Java客户端来访问。通过websket访问虚拟机的功能已经集成到horizon中,而通过java客户端则需要先安装相应的软件。为了方便用户访问虚拟机,nova通过有一个proxy来实现,proxy通常放在一个所有人都可以访问的IP地址。

vnc访问的实现方法如下,首先是启动一个虚拟机时启用vnc,这可以通过给kvm加上vnc参数即可。这样,kvm就会启动一个vncserver监听虚拟机。

PS:nova中VNC代理组件:nova-novncproxy和nova-xvpvncproxy的区别:
nova-xvpvncproxy:支持简单的JAVA客户端。
nova-novncproxy:使用noVNC提供VNC 支持(用户通过浏览器访问)

4. 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:// SERVICEHOST:6080/vncauto.htmlclient SERVICE_HOST通常是一个公网IP地址。
xvpvncproxy_base_url=http:// SERVICEHOST:6081/consolejavaclient SERVICE_HOST通常是一个公网IP地址。

vnc proxy的配置则相对简单,只需要设置其监听的主机和端口即可。具体如下:
novncproxy_host= SERVICEHOSTIPnovncproxyhost=6080xvpvncproxyhost= SERVICE_HOST 通常为一个公网IP。
xvpvncproxy_port=6081

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地址接受数据

5. VNC Proxy整体运行过程

VNC console 连接建立步骤:
1. 通过nova-api获取访问url,url的格式是:http://ip:port/?token=xxx,该地址实际上就是vnc proxy的地址。
2. 浏览器连接到vnc proxy

  1. vnc proxy连接到nova-consoleauth来验证token,并将token映射到虚拟机所在的宿主机的ip地址和某个端口,该端口就是虚拟机启动时所监听的端口。
    在 nova.conf中,计算节点可以指定vncserver的监听地址及vnc proxy应该通过那个地址连接到vncserver,该选项就是vncserver_proxyclient_address。vnc proxy充当了公网和计算节点之间的桥梁,此外还需要对vnc协议进行封装。

  2. vnc proxy与虚拟机所在的宿主机的vncserver建立连接,并开始代理,直到浏览器session结束。
    该过程的图解:
    这里写图片描述

VNC Proxy可以使用隧道技术,在WebSockets中传输VNC协议。 因此,可以使用noVNC client来和VNC服务器通信。

PS-关于noVNC:noVNC 是一个 HTML5 VNC 客户端,采用 HTML 5 WebSockets, Canvas 和 JavaScript 实现

完整的步骤(从获取token到建立连接):
一个用户试图从浏览器里面打开连接到虚拟机的VNC Client
VNC Proxy的运行过程:
1. 一个用户试图从浏览器里面打开连接到虚拟机的VNC Client
2. 浏览器向nova-api发送请求,要求返回访问vnc的url
3. nova-api调用nova-compute的get vnc console方法,要求返回连接VNC的信息
4. nova-compute调用libvirt的get vnc console函数
5. libvirt会通过解析虚拟机运行的/etc/libvirt/qemu/instance-0000000c.xml文件来获得VNC Server的信息
6. libvirt将host, port等信息以json格式返回给nova-compute
7. nova-compute会随机生成一个UUID作为Token
8. nova-compute将libvirt返回的信息以及配置文件中的信息综合成connect_info返回给nova-api
9. nova-api会调用nova-consoleauth的authorize_console函数
10. nova-consoleauth会将instance –> token, token –> connect_info的信息cache起来
11. nova-api将connect_info中的access url信息返回给浏览器:http://172.24.1.1:6080/vnc_auto.html?token=7efaee3f-eada-4731-a87c-e173cbd25e98&title=helloworld%289169fdb2-5b74-46b1-9803-60d2926bd97c%29
12. 浏览器会试图打开这个链接
13. 这个链接会将请求发送给nova-novncproxy
14. nova-novncproxy调用nova-consoleauth的check_token函数
15. nova-consoleauth验证了这个token,将这个instance对应的connect_info返回给nova-novncproxy
16. nova-novncproxy通过connect_info中的host, port等信息,连接compute节点上的VNC Server,从而开始了proxy的工作
这里写图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值