Skip to content

openstack_nova_vnc

遇见王斌 edited this page Feb 5, 2018 · 7 revisions

目录

1 VNC

VNC (Virtual Network Computer) 是虚拟网络计算机的缩写

2 用 VNC 客户端查看 openstack 创建的虚拟机

2.1 连接步骤

在云计算的环境中,实际上更多的时候是使用 VNC 工具去查看云系统中的 VM。以下记录如何查看的方法:

计算节点查看虚拟机的 ID(libvird 的,非 instanc_id)

[root@meetbill ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 29    instance-000000bf              running
 30    instance-000000c0              running
 34    instance-000000c8              running
 49    instance-000000d8              running
 51    instance-000000d9              running
 54    instance-000000dc              running
 55    instance-000000da              running
 56    instance-000000db              running
 57    instance-000000dd              running
 59    instance-000000d5              running
 60    instance-000000c6              running
 61    instance-000000c5              running #############比如这台
 -     instance-000000a8              shut off
 -     instance-000000aa              shut off
 -     instance-000000ab              shut off
 -     instance-000000ba              shut off
 -     instance-000000bd              shut off
 -     instance-000000d6              shut off

找到需要连接的虚拟机的 ID 号,查看其中暴露的端口:

[root@meetbill ~]# virsh vncdisplay 61
:7

然后在 VNC 查看工具中输入相关连接:

在 VNC 客户端上输入 对应的计算节点 IP:7

点击 Connect 后就可以连接上 openstack 创建的虚拟机。

【备注】以上采用的方法,实际是直接连接的底层的 libvirt,本质上和上层的 openstack 无太大关系,因此也可以用于其它平台。

2.2 注意

放在公网的机器如果可以使用此方法可以连接到 openstack 里面的虚拟机,这样是极其不安全的,需要进行下防护

3 OpenStack 中 VNC 分析

nova_vnc

  • vnc_listen 实际是直接连接的底层的 libvirt,本质上和上层的 openstack 无太大关系,端口为 5900+数字
  • 通过浏览器访问的 VNC 服务是,通过 VNC Proxy 连接的,默认端口是 6800

3.1 VNC Proxy 的功能

将公网 (public network) 和私网 (private network) 隔离

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

3.2 VNC Proxy 的运行过程

  • (01) 一个用户试图从浏览器里面打开连接到虚拟机的 VNC Client
  • (02) 浏览器向 nova-api 发送请求,要求返回访问 vnc 的 url
  • (03) nova-api 调用 nova-compute 的 get vnc console 方法,要求返回连接 VNC 的信息
  • (04) nova-compute 调用 libvirt 的 get vnc console 函数
  • (05) libvirt 会通过解析虚拟机运行的 /etc/libvirt/qemu/instance-0000000c.xml 文件来获得 VNC Server 的信息
  • (06) libvirt 将 host, port 等信息以 json 格式返回给 nova-compute
  • (07) nova-compute 会随机生成一个 UUID 作为 Token
  • (08) nova-compute 将 libvirt 返回的信息以及配置文件中的信息综合成 connect_info 返回给 nova-api
  • (09) 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 的工作