通过 noVNC 访问 kubevirt中的 vmi
目的
以 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 主机
软件需求
| 组件 | 建议版本 | 说明 |
| openssl | 1.1.1c | 编译 python 时带 ssl 功能 |
| python3 | 3.7.0 | noVNC 调用需要使用 python3 |
| websockify | lastest | https://github.com/novnc/websockify |
| noVNC | lastest | https://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

更多推荐
所有评论(0)