先上圖
VNC Proxy的功能:
- 將公網(public network)和私網(private network)隔離
- VNC client運行在公網上,VNCServer運行在私網上,VNC Proxy作為中間的橋梁將二者連接起來
- VNC Proxy通過token對VNC Client進行驗證
- VNC Proxy不僅僅使得私網的訪問更加安全,而且將具體的VNC Server的實現分離,可以支持不同Hypervisor的VNC Server但不影響用戶體驗
VNC Proxy的部署
- 在Controller節點上部署nova-consoleauth 進程,用於Token驗證
- 在Controller節點上部署nova-novncproxy 服務,用戶的VNC Client會直接連接這個服務
- Controller節點一般有兩張網卡,連接到兩個網絡,一張用於外部訪問,我們稱為public network,或者API network,這張網卡的IP地址是外網IP,如圖中172.24.1.1,另外一張網卡用於openstack各個模塊之間的通信,稱為management network,一般是內網IP,如圖中10.10.10.2
- 在Compute節點上部署nova-compute,在nova.conf文件中有下面的配置
- vnc_enabled=True
- vncserver_listen=0.0.0.0 //VNC Server的監聽地址
- vncserver_proxyclient_address=10.10.10.2 //nova vnc proxy是通過內網IP來訪問vnc server的,所以nova-compute會告知vnc proxy用這個IP來連接我。
- novncproxy_base_url=http://172.24.1.1:6080/vnc_auto.html //這個url是返回給客戶的url,因而里面的IP是外網IP
VNC Proxy的運行過程:
- 一個用戶試圖從瀏覽器里面打開連接到虛擬機的VNC Client
- 瀏覽器向nova-api發送請求,要求返回訪問vnc的url
- nova-api調用nova-compute的get vnc console方法,要求返回連接VNC的信息
- nova-compute調用libvirt的get vnc console函數
- libvirt會通過解析虛擬機運行的/etc/libvirt/qemu/instance-0000000c.xml文件來獲得VNC Server的信息
- libvirt將host, port等信息以json格式返回給nova-compute
- nova-compute會隨機生成一個UUID作為Token
- nova-compute將libvirt返回的信息以及配置文件中的信息綜合成connect_info返回給nova-api
- nova-api會調用nova-consoleauth的authorize_console函數
- nova-consoleauth會將instance –> token, token –> connect_info的信息cache起來
- 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
- 瀏覽器會試圖打開這個鏈接
- 這個鏈接會將請求發送給nova-novncproxy
- nova-novncproxy調用nova-consoleauth的check_token函數
- nova-consoleauth驗證了這個token,將這個instance對應的connect_info返回給nova-novncproxy
- nova-novncproxy通過connect_info中的host, port等信息,連接compute節點上的VNC Server,從而開始了proxy的工作