1
2
3
4
5
作者:李晓辉

微信联系:lxh_chat

联系邮箱: 939958092@qq.com

现在用命令行工具就能轻松搞定虚拟机(VM)的创建。只要准备好声明性文件和Ansible Playbooks,动动手指敲敲命令就行啦。要是想修改VM的YAML配置,用文本编辑器搞定,或者直接上“oc edit”命令,也很方便哦。通常情况下,一个VM的YAML文件,能把默认模板或者实例类型里的所有设置,整整齐齐地放在一个文档里,一目了然。

对了,声明性文件还能用来备份虚拟机的配置呢。万一哪天需要把设置恢复到新的虚拟机实例(VMI)上,这个备份就派上大用场啦。

YAML 文件样例

说到用命令行工具创建虚拟机,方法超简单。只需要一个YAML文件,然后用“oc apply -f vm-manifest.yaml”命令,把包含虚拟机配置的清单文件一提交,搞定!比如下面这个例子,就是一个基于PostgreSQL RHEL 9镜像的虚拟机配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: postgresql-rhel9
spec:
runStrategy: Always
template:
metadata:
creationTimestamp: null
spec:
dataVolumeTemplates:
- metadata:
creationTimestamp: null
name: postgresql-rhel9
spec:
source:
registry:
url: "registry.redhat.io/rhel9/postgresql-15:latest" # 这里是你虚拟机的镜像
secretRef: data-source-secret # 这里是你镜像拉取的secret
certConfigMap: tls-certs
domain:
devices: {}
memory:
guest: 512Mi
resources: {}
terminationGracePeriodSeconds: 180
volumes: # 这里是你虚拟机根磁盘的持久卷
- dataVolume:
name: rhel-9-minimal-volume
name: rootdisk
status: {}

命令行创建虚拟机

首先,要是想从清单文件创建虚拟机,就用这个命令:

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
creationTimestamp: null
name: postgresql-rhel9 # 虚拟机的名字
namespace: production # 虚拟机所在的命名空间
spec:
runStrategy: Always # 虚拟机的运行策略,设置为始终运行
template:
metadata:
creationTimestamp: null
spec:
domain:
devices: {} # 设备相关配置,目前为空
memory:
guest: 5Gi # 分配给虚拟机的内存大小
resources: {} # 资源相关配置,目前为空
terminationGracePeriodSeconds: 180 # 终止时的宽限期
status: {}

要是你想给虚拟机指定一个数据卷作为启动源,可以用--volume-datasource选项哦。这个选项需要你定义数据卷的名称和它所在的命名空间呢。比如,你想创建一个名为postgresql-rhel9的虚拟机,让它用postgresql-dv数据卷作为启动源,就可以用下面这个命令:

1
[lixiaohui@host ~]$ virtctl create vm --name postgresql-rhel9 --volume-datasource=src:dv-namespace/postgresql-dv

这个命令会生成一个虚拟机的清单文件,里面包含了你指定的虚拟机名称、数据卷名称以及数据卷所在的命名空间等信息呢。这样一来,虚拟机在启动的时候就会使用你指定的数据卷作为启动源啦,很方便是不是呀,生产的yaml大概长这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
creationTimestamp: null
name: postgresql-rhel9
namespace: production
spec:
dataVolumeTemplates:
- metadata:
creationTimestamp: null
name: postgresql-rhel9
spec:
sourceRef:
kind: DataSource
name: postgresql-dv # 数据源的名称
namespace: postgresql-project # 数据源所在的命名空间
...

命令行管理虚拟机

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
2
NAME		   AGE   STATUS    READY
postgresql-rhel9 40m Stopped False

要是想启动一个已经停止的虚拟机,就用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
2
NAME		   AGE   STATUS    READY
postgresql-rhel9 40m Starting False

要是想删除一个虚拟机,就用oc delete vm命令:

1
[lixiaohui@host ~]$ oc delete vm postgresql-rhel9

要是成功了,就会看到类似这样的提示:

1
virtualmachine.kubevirt.io "postgresql-rhel9" deleted

然后,你可以用oc get vmsoc get vmis命令来确认虚拟机和相关的虚拟机实例(VMI)是不是都被删除了呢。

嘿,你是不是想了解怎么通过命令行工具访问虚拟机(VM)的各种方法呀?这可是一个很实用的话题呢,让我来给你好好讲讲吧。

通过virtctl访问虚拟机控制台

串行控制台

你可以用virtctl console命令来访问虚拟机的串行控制台呢。在弹出的提示符下,你需要输入在创建虚拟机时设置的用户名和密码哦。

1
2
3
4
5
6
7
8
[lixiaohui@host ~]$ virtctl console postgresql-rhel9
Successfully connected to postgresql-rhel9 console.
The escape sequence is ^]

postgresql-rhel9 login: developer
Password:

[developer@postgresql-rhel9 ~]$

VNC控制台

要是想访问虚拟机的VNC控制台,就用virtctl vnc命令吧。同样地,你需要输入创建虚拟机时设置的用户名和密码哦。

1
2
3
[lixiaohui@host ~]$ virtctl vnc postgresql-rhel9
{"component":"","level":"info","msg":"--proxy-only is set to false, listening on 127.0.0.1\n","pos":"vnc.go:117","timestamp":"2024-10-24T02:33:00.889615Z"}
...output omitted...

你可以关闭窗口来停止运行这个命令呢。

通过SSH访问虚拟机

你也可以通过SSH协议从命令行访问虚拟机哦。virtctl工具提供了一个子命令,可以通过SSH协议连接到虚拟机呢。这个命令需要一个SSH密钥对的私钥,这个私钥可以在创建虚拟机时或者虚拟机可用后,通过一个密钥配置并注入到虚拟机里哦。

下面是一个用virtctl ssh命令连接到虚拟机的例子,使用的是在创建虚拟机时设置的用户:

1
2
[lixiaohui@host ~]$ virtctl ssh -i .ssh/lab_rsa --username developer postgresql-rhel9
...output omitted...

当你用完虚拟机后,用exit命令结束会话就行啦。

通过端口转发访问虚拟机

从命令行访问虚拟机的另一个方法是用virtctl工具把虚拟机的端口转发到本地机器上呢。

1
2
[lixiaohui@host ~]$ virtctl port-forward vm/postgresql-rhel9 22080:80
{"component":"","level":"info","msg":"forwarding tcp 127.0.0.1:22080 to 80","pos":"portforwarder.go:23","timestamp":"2024-10-24T23:16:29.316910Z"}

当虚拟机的连接在指定端口打开后,你就可以用命令行客户端或者图形界面客户端来访问虚拟机啦。

你也可以用oc命令行客户端的oc port-forward命令来进行端口转发呢。要连接到虚拟机,你需要用到和虚拟机关联的virt-launcher Pod,本地端口来转发连接,以及虚拟机的端口:

1
2
3
[lixiaohui@host ~]$ oc port-forward pod/virt-launcher-postgresql-rhel9-gbxws 22080:80
Forwarding from 127.0.0.1:22080 -> 80
Forwarding from [::1]:22080 -> 80

你可以用oc get pods命令来识别和虚拟机关联的virt-launcher Pod呢。

virt-launcher Pod的连接在指定端口打开后,你就可以用命令行或者图形界面客户端来访问虚拟机啦。记得要指定本地主机地址和本地端口哦。

Ctrl+C可以退出oc port-forward命令呢。

通过命令行工具暴露虚拟机

你可以用virtctl命令行工具创建一个服务,把虚拟机指定的端口转发出去,并在指定端口上暴露这个服务呢。

virtctl expose vm命令来暴露你的虚拟机。要是使用NodePort服务类型时没有设置--node-port,那么它的值就会被动态分配哦:

1
2
[lixiaohui@host ~]$ virtctl expose vm postgresql-rhel9 --name postgresql-service --type ClusterIP --port 5432
Service postgresql-service successfully exposed for vm postgresql-rhel9

你可以用oc get services命令来确认服务是否创建成功:

1
2
3
[lixiaohui@host ~]$ oc get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
postgresql-service ClusterIP 172.30.50.130 <none> 5432/TCP 12s

访问图形界面控制台

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类似哦。