本文档介绍如何通过更新 VMRuntime
自定义资源或运行 bmctl
命令来启用或停用 VM Runtime on Google Distributed Cloud。
准备工作
如需在 GDC 上启用或停用虚拟机运行时,您需要访问以下资源和工具:
- GKE on Bare Metal 1.12.0 版 (
anthosBareMetalVersion: 1.12.0
) 或更高版本集群的访问权限。您可以使用任何能够运行工作负载的集群类型。如果需要,请在 Compute Engine 上试用 GKE on Bare Metal,或查看集群创建概览。 bmctl
命令行工具。如需了解详情,请参阅下载并安装bmctl
工具。
在 GDC 上启用虚拟机运行时
GDC 上的虚拟机运行时会自动安装在 GKE on Bare Metal 1.10 版或更高版本中,但默认处于停用状态。您必须先在 GDC 上启用虚拟机运行时,然后才能在 GKE on Bare Metal 中运行虚拟机资源。
bmctl
如需启用运行时,请使用
bmctl
工具:bmctl enable vmruntime --kubeconfig KUBECONFIG_PATH
提供集群的 kubeconfig 文件的路径。创建集群时,GKE on Bare Metal 会在管理员工作站上生成 kubeconfig 文件。默认情况下,路径为
bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
。如果 GDC 上的虚拟机运行时已启用,该命令会返回错误。
您可以通过修改 VMRuntime
自定义资源来配置其他设置(例如模拟或图片格式)。
自定义资源
如需启用运行时,请更新 VMRuntime
自定义资源。此自定义资源是默认安装的。
修改
VMRuntime
自定义资源:kubectl edit vmruntime
在规范中设置
enabled:true
:apiVersion: vm.cluster.gke.io/v1 kind: VMRuntime metadata: name: vmruntime spec: enabled: true # useEmulation defaults to "false" if not set. useEmulation: true # vmImageFormat defaults to "qcow2" if not set. vmImageFormat: qcow2
在前面的
spec
部分中,可以设置以下值:enabled
:设置为 true 以在 GDC 上启用虚拟机运行时useEmulation
:如果您的节点不支持硬件虚拟化,或您不确定,请将值设置为 true。如果适用,硬件虚拟化可提供比软件模拟更好的性能。如果未指定useEmulation
字段,则默认为false
。vmImageFormat
:支持两个磁盘映像格式值:raw
和qcow2
。如果您未设置vmImageFormat
,GDC 上的虚拟机运行时将使用raw
磁盘映像格式来创建虚拟机。raw
格式可以提供比qcow2
(一种写入时复制格式)更高的性能,但可以使用更多磁盘。如需详细了解虚拟机的映像格式,请参阅 QEMU 文档中的磁盘映像文件格式。
在编辑器中保存自定义资源。
验证
VMRuntime
自定义资源是否已启用:kubectl describe vmruntime vmruntime
VMRuntime
自定义资源的详细信息包含Status
部分。GDC 上的虚拟机运行时已启用,当VMRuntime.Status.Ready
显示为true
时,该虚拟机运行时可正常运行。
在 GDC 上停用虚拟机运行时
如果您不再需要在 GDC 上使用虚拟机运行时,可以停用此功能。
bmctl
如需停用运行时,请使用
bmctl
工具:bmctl disable vmruntime --kubeconfig KUBECONFIG_PATH \ --force=true
提供集群的 kubeconfig 文件的路径和以下配置选项的值:
--force
:设置为true
以确认您要删除现有虚拟机资源。默认值为false
。
自定义资源
如需停用运行时,请更新 VMRuntime
自定义资源:
修改
VMRuntime
自定义资源:kubectl edit vmruntime
在规范中设置
enabled:false
:apiVersion: vm.cluster.gke.io/v1` kind: VMRuntime metadata: name: vmruntime spec: enabled: false useEmulation: true vmImageFormat: qcow2
在编辑器中保存更新后的自定义资源规范。
如需验证
VMRuntime
自定义资源是否已停用,请查看在vm-system
命名空间中运行的 Pod:kubectl get pods --namespace vm-system
仅当属于
vmruntime-controller-manager
部署的 Pod 在命名空间中运行时,GDC 上的虚拟机运行时会被停用。
了解运行虚拟机的行为
您可以在 GDC 资源上的 VM Runtime 上使用 baremetal.cluster.gke.io/vmrumtime-force-disable
注解,以定义在集群中运行时停用运行时的行为。
以下示例展示了此注解的值已默认设置为 false
:
// VM runtime yaml file
apiVersion: vm.cluster.gke.io/v1
kind: VMRuntime
metadata:
annotations:
baremetal.cluster.gke.io/vmrumtime-force-disable: "false"
name: vmruntime
[...]
如果此注解设置为 false
,GDC 上的虚拟机运行时会尝试保护正在运行的虚拟机。在停用 GDC 上的虚拟机运行时之前删除所有正在运行的虚拟机,或者使用 bmctl disable vmruntime
命令指定 --force=true
参数,如上一部分中所示。
下表说明了当此注解设置为 true
或 false
时正在运行的虚拟机会发生什么情况以及您是否指定了 --force=true
参数:
集群状态 | --force 参数 | vmrumtime-force-disable 注解 | 行为 |
---|---|---|---|
没有虚拟机 | 不适用 | 不适用 | 在 GDC 上停用虚拟机运行时。 |
现有虚拟机 | True | True | 删除所有正在运行的虚拟机和相关资源。在 GDC 上停用虚拟机运行时。 |
True | False | 删除所有正在运行的虚拟机和相关资源。在 GDC 上停用虚拟机运行时。 | |
False | True | 提示删除正在运行的虚拟机和相关资源。删除所有正在运行的虚拟机后,在 GDC 上停用虚拟机运行时。 | |
False | False | 请勿删除任何正在运行的现有虚拟机。请勿在 GDC 上停用虚拟机运行时。bmctl 命令会返回错误。 |
GDC 预检检查
在 GDC 和虚拟机上使用虚拟机运行时之前,虚拟机运行时 GDC 预检检查会先验证机器环境中的一系列前提条件。如果 GDC 虚拟机运行时预检检查失败,系统将阻止虚拟机创建。当 spec.enabled
设置为 true 时,GDC 预检检查会自动运行。
kubectl label nodes NODE_NAME "kubevm.io/VM-SkipSchedule"= --kubeconfig KUBECONFIG_PATH
当您执行以下任一操作时,GDC 预检检查会运行:
在 GDC 上启用虚拟机运行时
启用 VM Runtime on GDC 功能,例如 useEmulation
升级集群
移除节点的
kubevm.io/VM-SkipSchedule
标签通过运行
bmctl check vmruntimepfc --kubeconfig KUBECONFIG_PATH
命令或应用VMRuntimePreflightCheck
YAML 清单,在 GDC 预检检查对象上独立创建虚拟机运行时。
您可以在通过 GDC 预检检查成功时启动虚拟机。如果预检检查失败,则系统会阻止创建虚拟机,并且您会收到预检检查错误。
验证预检检查成功
要验证预检检查是否成功,请运行以下命令:
查找上次执行的预检检查:
kubectl get vmruntimepfc -n vm-system --kubeconfig KUBECONFIG_PATH
输出应如下所示:
NAME PASS AGE vmruntime-preflight-check-6ee61513-ea5d-4340-9374-90396cac129e false 42s vmruntime-preflight-check-f8d71751-a01c-471e-bab5-3370fc2addd5 true 21s
要查找预检检查的状态,请运行以下命令:
kubectl get vmruntime vmruntime -o yaml --kubeconfig KUBECONFIG_PATH
... preflightCheckSummary: preflightCheckSummary: featureStatuses: CPU: passed: true KVM: passed: true preflightCheckName: vmruntime-preflight-check-f8d71751-a01c-471e-bab5-3370fc2addd5 preflightCheckPassed: true ...
调试预检检查失败
如果预检检查失败,请执行以下步骤进行调试:
查找上次执行的预检检查。
kubectl get vmruntimepfc -n vm-system
如需了解详情,请查看该预检检查的状态。
kubectl get vmruntimepfc -n vm-system \ vmruntime-preflight-check-6ee61513-ea5d-4340-9374-90396cac129e -o yaml \ --kubeconfig KUBECONFIG_PATH
... status: checks: worker-0--52229ee15841099-22c41577139a7b8c.lab.anthos: passed: false results: - checkName: CPU passed: true - checkName: KVM message: | command terminated with exit code 1 ls: /mnt/dev/kvm: No such file or directory passed: false ...
请修复此问题,然后再次运行 GDC 预检检查中的虚拟机运行时。下面显示了一个 VMRuntimePreflightCheck YAML 清单示例:
apiVersion: vm.cluster.gke.io/v1 kind: VMRuntimePreflightCheck metadata: name: vmruntime-preflight-check-manual namespace: vm-system