在 GDC 上启用或停用虚拟机运行时

本文档介绍如何通过更新 VMRuntime 自定义资源或运行 bmctl 命令来启用或停用 VM Runtime on Google Distributed Cloud。

准备工作

如需在 GDC 上启用或停用虚拟机运行时,您需要访问以下资源和工具:

在 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 自定义资源。此自定义资源是默认安装的。

  1. 修改 VMRuntime 自定义资源:

    kubectl edit vmruntime
    
  2. 在规范中设置 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:支持两个磁盘映像格式值:rawqcow2。如果您未设置 vmImageFormat,GDC 上的虚拟机运行时将使用 raw 磁盘映像格式来创建虚拟机。raw 格式可以提供比 qcow2(一种写入时复制格式)更高的性能,但可以使用更多磁盘。如需详细了解虚拟机的映像格式,请参阅 QEMU 文档中的磁盘映像文件格式
  3. 在编辑器中保存自定义资源。

  4. 验证 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 自定义资源:

  1. 修改 VMRuntime 自定义资源:

    kubectl edit vmruntime
    
  2. 在规范中设置 enabled:false

    apiVersion: vm.cluster.gke.io/v1`
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: false
      useEmulation: true
      vmImageFormat: qcow2
    
  3. 在编辑器中保存更新后的自定义资源规范。

  4. 如需验证 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 参数,如上一部分中所示。

下表说明了当此注解设置为 truefalse 时正在运行的虚拟机会发生什么情况以及您是否指定了 --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 预检检查会运行:

  1. 在 GDC 上启用虚拟机运行时

  2. 启用 VM Runtime on GDC 功能,例如 useEmulation

  3. 升级集群

  4. 移除节点的 kubevm.io/VM-SkipSchedule 标签

  5. 通过运行 bmctl check vmruntimepfc --kubeconfig KUBECONFIG_PATH 命令或应用 VMRuntimePreflightCheck YAML 清单,在 GDC 预检检查对象上独立创建虚拟机运行时。

您可以在通过 GDC 预检检查成功时启动虚拟机。如果预检检查失败,则系统会阻止创建虚拟机,并且您会收到预检检查错误。

验证预检检查成功

要验证预检检查是否成功,请运行以下命令:

  1. 查找上次执行的预检检查:

    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
    
  2. 要查找预检检查的状态,请运行以下命令:

    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
    ...
    

调试预检检查失败

如果预检检查失败,请执行以下步骤进行调试:

  1. 查找上次执行的预检检查。

    kubectl get vmruntimepfc -n vm-system
    
  2. 如需了解详情,请查看该预检检查的状态。

    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
    ...
    
  3. 请修复此问题,然后再次运行 GDC 预检检查中的虚拟机运行时。下面显示了一个 VMRuntimePreflightCheck YAML 清单示例:

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntimePreflightCheck
    metadata:
      name: vmruntime-preflight-check-manual
      namespace: vm-system
    

后续步骤