OpenShift虚拟化: 从命令行界面创建与访问虚拟机
1 | 作者:李晓辉 |
现在用命令行工具就能轻松搞定虚拟机(VM)的创建。只要准备好声明性文件和Ansible Playbooks,动动手指敲敲命令就行啦。要是想修改VM的YAML配置,用文本编辑器搞定,或者直接上“oc edit”命令,也很方便哦。通常情况下,一个VM的YAML文件,能把默认模板或者实例类型里的所有设置,整整齐齐地放在一个文档里,一目了然。
对了,声明性文件还能用来备份虚拟机的配置呢。万一哪天需要把设置恢复到新的虚拟机实例(VMI)上,这个备份就派上大用场啦。
YAML 文件样例
说到用命令行工具创建虚拟机,方法超简单。只需要一个YAML文件,然后用“oc apply -f vm-manifest.yaml”命令,把包含虚拟机配置的清单文件一提交,搞定!比如下面这个例子,就是一个基于PostgreSQL RHEL 9镜像的虚拟机配置文件。
1 | apiVersion: kubevirt.io/v1 |
命令行创建虚拟机
首先,要是想从清单文件创建虚拟机,就用这个命令:
1 | [lixiaohui@host ~]$ oc apply -f vm-manifest.yaml |
要是操作成功,就会看到类似这样的提示:
1 | virtualmachine.kubevirt.io/postgresql-rhel9 created |
要是想修改虚拟机的YAML配置,可以用“oc edit”命令哦。这个命令会打开一个文本编辑器,你可以修改清单里那些不是只读的属性。修改完后,保存YAML配置就行啦。当编辑器缓冲区写入后,集群就会自动把修改应用到资源上呢。比如,要修改名为“postgresql-rhel9”的虚拟机设置,就用这个命令:
1 | [lixiaohui@host ~]$ oc edit vm postgresql-rhel9 |
修改完后,保存并退出文本编辑器。然后,为了用最新的配置创建虚拟机实例,可以用“virtctl restart”命令重启虚拟机,就像这样:
1 | [lixiaohui@host ~]$ virtctl restart postgresql-rhel9 |
要是操作成功,就会看到类似这样的提示:
1 | VM postgresql-rhel9 was scheduled to restart |
还有哦,“oc patch”命令也很有用呢。可以用它来更新资源的字段,支持战略合并补丁、JSON合并补丁或者JSON补丁,而且既接受JSON格式,也接受YAML格式。比如,要是想给虚拟机添加一个标签,就可以用这个命令:
1 | [lixiaohui@host ~]$ oc patch vm postgresql-rhel9 --type merge -p '{"spec":{"template":{"metadata":{"labels":{"servertype":"production"}}}}}' |
要是操作成功,就会看到类似这样的提示:
1 | virtualmachine.kubevirt.io/postgresql-rhel9 patched |
另外,还可以用“virtctl”命令行工具来创建一个包含通用设置(比如名称、内存和CPU设置以及命名空间)的虚拟机清单文件呢。这个命令会把虚拟机的配置以YAML格式输出到标准输出(STDOUT),你可以直接复制粘贴到一个YAML文件里去。
要是想快速创建一个虚拟机(VM)的清单文件,用“virtctl”命令就行啦。比如你想创建一个名为“postgresql-rhel9”的虚拟机,把它放在“production”命名空间里,还给它分配5GB的内存,那就可以用下面这个命令:
1 | apiVersion: kubevirt.io/v1 |
要是你想给虚拟机指定一个数据卷作为启动源,可以用--volume-datasource
选项哦。这个选项需要你定义数据卷的名称和它所在的命名空间呢。比如,你想创建一个名为postgresql-rhel9
的虚拟机,让它用postgresql-dv
数据卷作为启动源,就可以用下面这个命令:
1 | [lixiaohui@host ~]$ virtctl create vm --name postgresql-rhel9 --volume-datasource=src:dv-namespace/postgresql-dv |
这个命令会生成一个虚拟机的清单文件,里面包含了你指定的虚拟机名称、数据卷名称以及数据卷所在的命名空间等信息呢。这样一来,虚拟机在启动的时候就会使用你指定的数据卷作为启动源啦,很方便是不是呀,生产的yaml大概长这样:
1 | apiVersion: kubevirt.io/v1 |
命令行管理虚拟机
virtctl
工具能帮你控制虚拟机的各种状态,比如启动、停止、重启,还有删除虚拟机呢。
首先,你可以从Red Hat OpenShift控制台下载virtctl
的二进制文件呢。只需要进入“Virtualization → Overview”,然后点击“Download virtctl”链接就行啦。记得要选择和你的操作系统对应的二进制文件哦。
要是想查看所有可以用来管理虚拟机的选项,可以用virtctl --help
命令呢:
1 | [lixiaohui@host ~]$ virtctl --help |
要是想停止一个虚拟机,比如postgresql-rhel9
,就可以用virtctl stop
命令:
1 | [lixiaohui@host ~]$ virtctl stop postgresql-rhel9 |
要是成功了,就会看到类似这样的提示:
1 | VM postgresql-rhel9 was scheduled to stop |
然后,你可以用oc get vms
命令来确认虚拟机是不是已经停止了:
1 | [lixiaohui@host ~]$ oc get vms |
输出结果可能会像这样:
1 | NAME AGE STATUS READY |
要是想启动一个已经停止的虚拟机,就用virtctl start
命令:
1 | [lixiaohui@host ~]$ virtctl start postgresql-rhel9 |
要是成功了,就会看到类似这样的提示:
1 | VM postgresql-rhel9 was scheduled to start |
要是想重启一个虚拟机,就用virtctl restart
命令:
1 | [lixiaohui@host ~]$ virtctl restart postgresql-rhel9 |
要是成功了,就会看到类似这样的提示:
1 | VM postgresql-rhel9 was scheduled to restart |
你可以再次用oc get vms
命令来确认虚拟机的状态,状态会从“Stopping”变成“Stopped”,然后再变成“Starting”:
1 | [lixiaohui@host ~]$ oc get vms |
输出结果可能会像这样:
1 | NAME AGE STATUS READY |
要是想删除一个虚拟机,就用oc delete vm
命令:
1 | [lixiaohui@host ~]$ oc delete vm postgresql-rhel9 |
要是成功了,就会看到类似这样的提示:
1 | virtualmachine.kubevirt.io "postgresql-rhel9" deleted |
然后,你可以用oc get vms
和oc get vmis
命令来确认虚拟机和相关的虚拟机实例(VMI)是不是都被删除了呢。
嘿,你是不是想了解怎么通过命令行工具访问虚拟机(VM)的各种方法呀?这可是一个很实用的话题呢,让我来给你好好讲讲吧。
通过virtctl
访问虚拟机控制台
串行控制台
你可以用virtctl console
命令来访问虚拟机的串行控制台呢。在弹出的提示符下,你需要输入在创建虚拟机时设置的用户名和密码哦。
1 | [lixiaohui@host ~]$ virtctl console postgresql-rhel9 |
VNC控制台
要是想访问虚拟机的VNC控制台,就用virtctl vnc
命令吧。同样地,你需要输入创建虚拟机时设置的用户名和密码哦。
1 | [lixiaohui@host ~]$ virtctl vnc postgresql-rhel9 |
你可以关闭窗口来停止运行这个命令呢。
通过SSH访问虚拟机
你也可以通过SSH协议从命令行访问虚拟机哦。virtctl
工具提供了一个子命令,可以通过SSH协议连接到虚拟机呢。这个命令需要一个SSH密钥对的私钥,这个私钥可以在创建虚拟机时或者虚拟机可用后,通过一个密钥配置并注入到虚拟机里哦。
下面是一个用virtctl ssh
命令连接到虚拟机的例子,使用的是在创建虚拟机时设置的用户:
1 | [lixiaohui@host ~]$ virtctl ssh -i .ssh/lab_rsa --username developer postgresql-rhel9 |
当你用完虚拟机后,用exit
命令结束会话就行啦。
通过端口转发访问虚拟机
从命令行访问虚拟机的另一个方法是用virtctl
工具把虚拟机的端口转发到本地机器上呢。
1 | [lixiaohui@host ~]$ virtctl port-forward vm/postgresql-rhel9 22080:80 |
当虚拟机的连接在指定端口打开后,你就可以用命令行客户端或者图形界面客户端来访问虚拟机啦。
你也可以用oc
命令行客户端的oc port-forward
命令来进行端口转发呢。要连接到虚拟机,你需要用到和虚拟机关联的virt-launcher
Pod,本地端口来转发连接,以及虚拟机的端口:
1 | [lixiaohui@host ~]$ oc port-forward pod/virt-launcher-postgresql-rhel9-gbxws 22080:80 |
你可以用oc get pods
命令来识别和虚拟机关联的virt-launcher
Pod呢。
当virt-launcher
Pod的连接在指定端口打开后,你就可以用命令行或者图形界面客户端来访问虚拟机啦。记得要指定本地主机地址和本地端口哦。
按Ctrl+C
可以退出oc port-forward
命令呢。
通过命令行工具暴露虚拟机
你可以用virtctl
命令行工具创建一个服务,把虚拟机指定的端口转发出去,并在指定端口上暴露这个服务呢。
用virtctl expose vm
命令来暴露你的虚拟机。要是使用NodePort
服务类型时没有设置--node-port
,那么它的值就会被动态分配哦:
1 | [lixiaohui@host ~]$ virtctl expose vm postgresql-rhel9 --name postgresql-service --type ClusterIP --port 5432 |
你可以用oc get services
命令来确认服务是否创建成功:
1 | [lixiaohui@host ~]$ oc get services |
访问图形界面控制台
remote-viewer
应用程序是一个远程桌面客户端,它可以连接到支持SPICE和VNC协议的远程客户机,比如Windows、Linux和MacOS呢。当你启动一个SPICE会话时,remote-viewer
应用程序会自动被调用哦。对于Windows和MacOS系统,你需要安装virt-viewer
应用程序呢。
TigerVNC
是一个可用于Linux、Windows和MacOS的图形桌面共享工具呢。你需要在你的机器上安装VNC
桌面vncserver
应用程序,才能启用到远程机器的连接哦。要是你想让你的机器能够进行外部连接,那你还需要安装vncviewer
应用程序呢。
在Windows和MacOS系统中,你还可以使用TightVNC
工具作为VNC查看器呢。TightVNC
使用VNC协议在服务器主机和客户端桌面之间建立连接,和TigerVNC
类似哦。