目的

以 VNC 的方法连接到 VMI
启用 noNVC 方法, 利用网页就可以对 VMI 进行访问

kubevirt vnc 原理

kubernetes 启动 POD ( virt-launcher ) 启动 VMI
virt-launcher 定义了 VMI 的硬件,信息, 如 CPU, 内存,中断, 接口等, 同时也定义了 VNC 的使用方式
virt-launcher 使用了参数 -vnc unix:xxxx.socket 方法启动 VMI
unix:xxxx.socket 导致了无法完成外部 VNC 直接访问到 VMI 中
kubectl virt vnc vmi-name (图形界面下) 命令行允许通过 vnc 方法连接到 VMI 中
kubernetes 获取了用户授权, 并且访问一个固定的 ENDPOINT 获取了 vnc 的 socket 数据连接方法
endpoint: wss://serviceip:port/apis/subresources.kubevirt.io/v1alpha3/namespaces/{namespace}/virtualmachineinstances/{VMIname}/vnc

kubevirt web-ui 项目

该项目提供了一种 WEB 的方法进行访问 VMI 的 VNC
该项目只提供了 openshift 的接口
那么普通的 kubernetes 用户(例如我) 就无法使用到该项目完成通过 WEB 方法访问到 VMI 的 VNC

其他问题

当前 VMI 打开了 wss 协议提供 vnc 访问连接
但由于无法获取到 kubernetes 授权
因此无法直接通过 ngingx http_proxy 方法通过访问 endpoint (wss://xxxxx) 完成 vnc 访问

noVNC 项目

一款开源的 vnc 代理项目
可以通过网页访问到主机 VNC

原理

[外链图片转存失败(img-gFneW4Kv-1568283878380)(./images/novnc.png)]

打开了 VMI vnc 功能
可以通过 VNC 软件直接访问到 VMI
也可以通过 noVNC 项目通过网页访问到不同的 VMI 主机

软件需求

组件建议版本说明
openssl1.1.1c编译 python 时带 ssl 功能
python33.7.0noVNC 调用需要使用 python3
websockifylastesthttps://github.com/novnc/websockify
noVNClastesthttps://github.com/novnc/noVNC.git

noVNC 安装编译过程

openssl 安装

wget --no-check-certificate  https://www.openssl.org/source/openssl-1.1.1c.tar.gz
tar xf openssl-1.1.1c.tar.gz ;  cd openssl-1.1.1c
./config --prefix=/usr/local/openssl
make ; make install
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf.d/ssl.conf
ldconfig

python3 安装

wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
tar xf Python-3.7.0.tar.xz;  cd Python-3.7.0
./configure --prefix=/usr/local/python3  --enable-optimizations
make ; make install

websockify 安装

git clone https://github.com/novnc/websockify
cd websockify
/usr/local/python3/bin/python3 setup.py install
make
修改  /usr/bin/websockify    (/usr/local/python3/bin/python3)  

noVNC 安装

git clone https://github.com/novnc/noVNC.git

下载即可

VMI 实现 noVNC 访问方法

暴露 VNC 端口

检测 POD, VMI

[root@ns-yun-020061 yaml]# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
centos-6754b4b79d-qc7wm          1/1     Running   0          26h
virt-launcher-pv-centos7-gxsvc   1/1     Running   0          51m          <- centos7
virt-launcher-win10-7dzpw        1/1     Running   0          97m          <- WIN10

[root@ns-yun-020061 yaml]# kubectl get vmi
NAME         AGE   PHASE     IP               NODENAME
pv-centos7   51m   Running   10.244.1.80/24   ns-yun-020062.vclound.com    <- centos7
win10        1h    Running   10.244.1.79      ns-yun-020062.vclound.com    <- WIN10

获取对应 UUID

[root@ns-yun-020061 yaml]# kubectl get vmi win10 -o=jsonpath='{.metadata.uid}'
666ed82f-d537-11e9-84a0-ec388f792746

[root@ns-yun-020061 yaml]# kubectl get vmi pv-centos7 -o=jsonpath='{.metadata.uid}'
c12ee4fc-d53d-11e9-84a0-ec388f792746

在 kubernetes master 上调用 pod (virt-launch ) 中 sock-connector 命令, 打开对应 VMI VNC 网络端口

socat TCP-LISTEN:8081,reuseaddr,fork 'EXEC:kubectl exec -i virt-launcher-pv-centos7-gxsvc  -c compute -- /usr/share/kubevirt/virt-launcher/sock-connector /var/run/kubevirt-private/c12ee4fc-d53d-11e9-84a0-ec388f792746/virt-vnc'

socat TCP-LISTEN:8082,reuseaddr,fork 'EXEC:kubectl exec -i virt-launcher-win10-7dzpw  -c compute -- /usr/share/kubevirt/virt-launcher/sock-connector /var/run/kubevirt-private/666ed82f-d537-11e9-84a0-ec388f792746/virt-vnc'

上述命令可以在 kubernetes master 上启用了8081, 8082 端口
现在可以用过 vnc 工具访问 kubernetes master:8081 端口连接到 centos7 VMI

noVNC 配置

为了使用同一个 noVNC 进程可以允许分别连接到不同的 VMI, 需要启用 noVNC token 功能

修改 noVNC 启动配置文件

[root@ns-yun-020061 noVNC]# vim utils/launch.sh
#${WEBSOCKIFY} ${SSLONLY} --web ${WEB} ${CERT:+--cert ${CERT}} ${KEY:+--key ${KEY}} ${PORT} ${VNC_DEST} ${RECORD_ARG} &
${WEBSOCKIFY} ${SSLONLY} --web ${WEB} ${CERT:+--cert ${CERT}} ${KEY:+--key ${KEY}} --token-plugin TokenFile --token-source /opt/token.d/  ${PORT} &

创建 /opt/token.d/ 目录
每个 vmi 都需要生成一个独立配置文件至 /opt/token.d/ 目录中

token 文件

文件增加后即可生效, 不需要重启 noNVC 进程
token 文件格式

echo "win10  kubernet_master_ip:8082" >   /opt/token.d/win10
echo "centos7  kubernet_master_ip:8081" >   /opt/token.d/centos7

启动 noVNC

[root@ns-yun-020061 utils]# ./launch.sh
Warning: could not find self.pem
Using installed websockify at /usr/bin/websockify
Starting webserver and WebSockets proxy on port 6080
WebSocket server settings:
  - Listen on :6080
  - Web server. Web root: /root/git/noVNC
  - No SSL/TLS support (no cert file)
  - proxying from :6080 to targets generated by TokenFile


Navigate to this URL:

    http://ns-yun-020061.xxxxx.com:6080/vnc.html?host=ns-yun-020061.xxxx.com&port=6080

Press Ctrl-C to exit

当前启动了 kubernetes master ip : 6080 port 允许通过访问访问 noVNC 服务
可以通过下面方法利用网页访问到 VMI VNC 功能

http://ns-yun-020061.xxxx.com:6080/vnc_lite.html?path=websockify/?token=centos7
http://ns-yun-020061.xxxx.com:6080/vnc_lite.html?path=websockify/?token=win10

token=win10 即访问对应的 /opt/token.d/win10 中定义的主机名 win10
token=centos7 即访问对应的 /opt/token.d/centos7 中定义的主机名 centos7

在这里插入图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐