使用基于虚拟机的工作负载

本页面介绍如何使用 Anthos 虚拟机运行时在 Anthos clusters on Bare Metal 上部署虚拟机。Anthos 虚拟机运行时使用 KubeVirt 在集群上编排虚拟机,使您能够在统一开发环境中处理基于虚拟机的应用和工作负载。您可以在创建新集群时以及在现有集群上启用 Anthos 虚拟机运行时。

准备工作

以下说明假定您已启动并运行集群。如果没有,您可以按照 Anthos clusters on Bare Metal 快速入门中的说明操作,快速在工作站上设置集群。

启用 Anthos 虚拟机运行时

默认情况下,Anthos 虚拟机运行时处于停用状态。如需启用 Anthos 虚拟机运行时,请修改集群中的 VMRuntime 自定义资源。从 Anthos clusters on Bare Metal 1.10.0 版开始,VMRuntime 自定义资源会自动安装在集群上。

如需启用 Anthos 虚拟机运行时,请执行以下操作:

  1. 更新 VMRuntime 自定义资源,将 enabled 设置为 true

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      # useEmulation default to false if not set.
      useEmulation: true
      # vmImageFormat default to "qcow2" if not set.
      vmImageFormat: qcow2
    
  2. 如果您的节点不支持硬件虚拟化,或者您不确定,请将 useEmulation 设置为 true

    如果适用,硬件虚拟化可提供比软件模拟更好的性能。如果未指定 useEmulation 字段,则默认为 false

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      # useEmulation default to false if not set.
      useEmulation: true
      # vmImageFormat default to "qcow2" if not set.
      vmImageFormat: qcow2
    
  3. 您可以通过设置 vmImageFormat 字段来更改您创建的虚拟机使用的映像格式。

    vmImageFormat 字段支持两种磁盘映像格式值:rawqcow2。如果未设置 vmImageFormat,Anthos 虚拟机运行时使用 raw 磁盘映像格式来创建虚拟机。raw 格式可以提供比 qcow2(一种写入时复制格式)更高的性能,但可以使用更多磁盘。如需详细了解虚拟机的映像格式,请参阅 QEMU 文档中的磁盘映像文件格式

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      # useEmulation default to false if not set.
      useEmulation: true
      # vmImageFormat default to "qcow2" if not set.
      vmImageFormat: qcow2
    
  4. 保存配置并验证 VMRuntime 自定义资源是否已启用:

    kubectl describe vmruntime vmruntime
    

    VMRuntime 自定义资源的详细信息包含 Status 部分。当 VMRuntime.Status.Ready 设置为 true 时,Anthos 虚拟机运行时已启用且正常运行。

升级集群

VMRuntime 自定义资源会自动安装在已升级到 1.10.0 或更高版本的集群上。将 1.9.x 集群升级到 1.10.0 及更高版本时,升级过程会检查集群设置,并配置 VMRuntime 自定义资源来匹配 1.9.x 集群上的 Anthos 虚拟机运行时设置。如果 1.9.x 集群资源中存在 spec.kubevirt,则升级过程会启用 Anthos 虚拟机运行时。

在 1.10.0 版或更高版本的集群中,VMRuntime 自定义资源设置优先于旧版 Anthos VM Runtime. 集群设置,例如 spec.kubevirt.useEmulation。更新 VMRuntime 自定义资源以更改 1.10.0 或更高版本的集群的 Anthos 虚拟机运行时设置。

安装 virtctl

  1. kubectl 插件的形式安装 virtctl CLI 工具

    export GOOGLE_APPLICATION_CREDENTIALS="bm-gcr.json"
    sudo -E ./bmctl install virtctl
    
  2. 验证是否已安装 virtctl

    kubectl plugin list
    

    如果响应中列出了 virtctl,则表示已成功安装。

创建虚拟机

在集群上启用 KubeVirt 并为 kubectl 安装 virtctl 插件后,您便可以开始使用 kubectl virt create vm 命令在集群中创建虚拟机。在运行此命令之前,我们建议您先配置 cloud-init 文件,以确保在创建虚拟机后您可以通过控制台访问虚拟机。

创建自定义 cloud-init 文件以进行控制台访问

您可以通过两种方式创建自定义 cloud-init 文件。最简单的方法是在创建虚拟机时指定 --os=<OPERATING_SYSTEM> 标志。此方法会自动配置简单的 cloud-init 文件,并适用于以下操作系统。

  • Ubuntu
  • CentOS
  • Debian
  • Fedora

创建虚拟机后,您可以在首次访问该虚拟机时使用以下凭据,然后更改密码:

user: root
password: changeme

如果您的映像包含其他基于 Linux 的操作系统,或者您需要更高级的配置,则可以手动创建自定义 cloud-init 文件,并通过指定 --cloud-init-file=<path/to/file> 标志来指定该文件的路径。在最基本的形式中,cloud-init 文件是一个包含以下内容的 YAML 文件:

#cloud-config
user: root
password: changeme
lock_passwd: false
chpasswd: {expire: false}
disable_root: false
ssh_authorized_keys:
- <ssh-key>

如需了解更多高级配置,请参阅 Cloud 配置示例

确定好要使用的方法后,您就可以创建虚拟机了。

运行 kubectl virt create vm 命令

您可以通过公共映像或自定义映像创建虚拟机。

公共映像

如果您的集群具有外部连接,则可以运行以下命令,通过公共映像创建虚拟机:

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class="DISK_CLASS" \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=IMAGE_NAME \
    --memory=MEMORY_SIZE

请替换以下内容:

  • VM_NAME 替换为您要创建的虚拟机的名称。
  • MODE 替换为启动磁盘的访问模式。可能的值包括 ReadWriteOnce(默认)或 ReadWriteMany
  • DISK_SIZE 替换为启动磁盘所需的大小。默认值为 20Gi
  • DISK_CLASS 替换为启动磁盘的存储类别。默认值为 local-shared。如需查看可用存储类别的列表,请运行 kubectl get storageclass
  • FILE_PATH 替换为自定义 cloud-init 文件的完整路径。根据映像,您可能必须执行此操作,以便在创建虚拟机后获得对虚拟机的控制台访问权限。如果您打算使用 --os 标志自动配置 cloud-init 文件,则请勿指定 --cloud-init-file 标志。 如果指定了 --cloud-init-file 标志,则忽略 --os 标志。--os 可接受的值包括 ubuntucentosdebianfedora
  • CPU_NUMBER 替换为您要为虚拟机配置的 CPU 数量。默认值为 1
  • IMAGE_NAME 替换为虚拟机映像,可以是 ubuntu20.04(默认值)、centos8 或映像的网址。
  • MEMORY_SIZE 替换为虚拟机的内存大小。默认值为 4Gi

自定义映像

通过自定义映像创建虚拟机时,您可以指定来自 HTTP 映像服务器的映像或本地存储的映像。

HTTP 映像服务器

您可以使用 Apache 或 nginx 设置 HTTP 服务器,并将自定义映像上传到其公开的文件夹中。然后,您可以通过运行以下命令从自定义映像创建虚拟机:

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=DISK_ACCESS_MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class=DISK_CLASS \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=http://SERVER_IP/IMAGE_NAME \
    --memory=MEMORY_SIZE

请替换以下内容:

  • VM_NAME 替换为您要创建的虚拟机的名称。
  • DISK_ACCESS_MODE 替换为启动磁盘的访问模式。可能的值包括 ReadWriteOnce(默认)或 ReadWriteMany
  • DISK_SIZE 替换为启动磁盘所需的大小。默认值为 20Gi
  • DISK_CLASS 替换为启动磁盘的存储类别。默认值为 local-shared。如需查看可用存储类别的列表,请运行 kubectl get storageclass
  • FILE_PATH 替换为自定义 cloud-init 文件的完整路径。根据映像,您可能必须执行此操作,以便在创建虚拟机后获得对虚拟机的控制台访问权限。如果您打算使用 --os 标志自动配置 cloud-init 文件,则请勿指定 --cloud-init-file 标志。 如果指定了 --cloud-init-file 标志,则忽略 --os 标志。--os 的可接受值为 ubuntucentosdebianfedora
  • CPU_NUMBER 替换为您要为虚拟机配置的 CPU 数量。默认值为 1
  • SERVER_IP 替换为托管映像的服务器的 IP 地址。
  • IMAGE_NAME 替换为自定义映像的文件名。
  • MEMORY_SIZE 替换为虚拟机的内存大小。默认值为 4Gi

本地存储的映像

您可以在本地存储自定义映像,然后运行以下命令通过该映像创建虚拟机:

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=DISK_ACCESS_MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class=DISK_CLASS \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=IMAGE_PATH \
    --memory=MEMORY_SIZE \

请替换以下内容:

  • VM_NAME 替换为您要创建的虚拟机的名称。
  • DISK_ACCESS_MODE 替换为启动磁盘的访问模式。可能的值包括 ReadWriteOnce(默认)或 ReadWriteMany
  • DISK_SIZE 替换为启动磁盘所需的大小。默认值为 20Gi
  • DISK_CLASS 替换为启动磁盘的存储类别。默认值为 local-shared
  • FILE_PATH 替换为自定义 cloud-init 文件的完整路径。根据映像,您可能必须执行此操作,以便在创建虚拟机后获得对虚拟机的控制台访问权限。如果您打算使用 --os 标志自动配置 cloud-init 文件,则请勿指定 --cloud-init-file 标志。 如果指定了 --cloud-init-file 标志,则忽略 --os 标志。--os 的可接受值为 ubuntucentosdebianfedora
  • CPU_NUMBER 替换为您要为虚拟机配置的 CPU 数量。默认值为 1
  • IMAGE_PATH 替换为自定义映像的本地文件路径。
  • MEMORY_SIZE 替换为虚拟机的内存大小。默认值为 4Gi

更改标志的默认值

执行该命令时,kubectl virt create vm 命令会使用默认值来自动填充未指定的标志。您可以通过运行以下命令更改这些默认值:

kubectl virt config default FLAG

FLAG 替换为要更改其默认值的参数的标志。

示例:以下命令会将默认 CPU 配置从初始默认值 1 更改为 2

kubectl virt config default --cpu=2

如需查看支持的标志及其当前默认值的列表,请运行以下命令:

kubectl virt config default -h

默认配置将客户端作为名为 ~/.virtctl.default 的本地文件存储在客户端。您也可以通过修改此文件来更改默认配置。

访问虚拟机

您可以使用以下方法访问虚拟机:

控制台访问权限

如需通过控制台访问虚拟机,请运行以下命令:

kubectl virt console VM_NAME

VM_NAME 替换为您要访问的虚拟机的名称。

VNC 访问权限

如需使用 VNC 访问虚拟机,请运行以下命令:

# This requires remote-viewer from the virt-viewer package and a graphical desktop from where you run virtctl
kubectl virt vnc VM_NAME

VM_NAME 替换为您要访问的虚拟机的名称。

内部访问权限

集群虚拟机的 IP 地址可供集群中的所有其他 pod 直接访问。如需查找虚拟机的 IP 地址,请运行以下命令:

kubectl get vmi VM_NAME

VM_NAME 替换为您要访问的虚拟机的名称。

该命令返回如下内容:

NAME     AGE   PHASE     IP              NODENAME
vm1      13m   Running   192.168.1.194   upgi-bm002

外部访问权限

在您的集群中创建的虚拟机具有只能从集群内部访问的 pod 网络地址。如需从外部访问集群虚拟机,请执行以下操作:

  1. 将虚拟机公开为负载均衡器服务:

    kubectl virt expose vm VM_NAME \
        --port=LB_PORT \
        --target-port=VM_PORT \
        --type=LoadBalancer \
        --name=SERVICE_NAME
    

    请替换以下内容:

    • VM_NAME 替换为您要访问的虚拟机的名称。
    • LB_PORT 替换为公开的负载均衡器服务的端口。
    • VM_PORT 替换为您要通过负载均衡器服务访问的虚拟机上的端口。
    • SERVICE_NAME 替换为您要为此负载均衡器服务指定的名称。
  2. 获取负载均衡器服务的外部 IP 地址:

    kubectl get svc SERVICE_NAME
    

    SERVICE_NAME 替换为公开虚拟机的负载均衡器服务的名称。

    您可以通过响应的 EXTERNAL-IP 字段中列出的 IP 地址访问虚拟机的目标端口。

示例

如果您有一个名为 galaxy 的虚拟机,并且想要使用 SSH 从集群外部访问该虚拟机,则运行以下命令:

kubectl virt expose vm galaxy \
   --port=25022 \
   --target-port=22 \
   --type=LoadBalancer \
   --name=galaxy-ssh

然后获取负载均衡器 IP 地址:

kubectl get svc galaxy-ssh

该命令返回如下内容:

NAME        TYPE          CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
galaxy-ssh  LoadBalancer  10.96.250.76   21.1.38.202   25000:30499/TCP   4m40s

现在,您可以使用 SSH 通过 21.1.38.202:25022 (VIP:port) 从集群外部访问虚拟机:

ssh root@21.1.38.202:22 -p 25022

检查虚拟机遥测和控制台日志

虚拟机遥测和控制台日志已集成到 Google Cloud 控制台中。遥测信息和日志数据对于监控虚拟机的状态和排查集群虚拟机的任何问题至关重要。

虚拟机遥测

Anthos 集群虚拟机状态信息中心提供了集群虚拟机的实时遥测数据。

如需查看集群虚拟机的遥测信息,请执行以下操作:

  1. 在 Google Cloud 控制台中,选择 Monitoring,或点击以下按钮:

    转到“监控”

  2. 选择信息中心

    Monitoring 信息中心列表中的“Anthos 集群虚拟机状态”信息中心

  3. 点击所有信息中心列表中的 Anthos 集群虚拟机状态

    Anthos 集群虚拟机状态详细信息

虚拟机控制台日志

虚拟机串行控制台日志会流式传输到 Cloud Logging,您可以在日志浏览器中查看。

显示 Anthos 集群虚拟机数据的日志浏览器

删除虚拟机及其资源

仅删除虚拟机

kubectl virt delete vm VM_NAME

VM_NAME 替换为您要删除的虚拟机的名称。

仅删除虚拟机磁盘

kubectl virt delete disk DISK_NAME

DISK_NAME 替换为要删除的磁盘的名称。如果您尝试在删除虚拟机之前删除虚拟机磁盘,则该磁盘将标记为待删除,等待删除虚拟机。

删除虚拟机和资源

kubectl virt delete vm VM_NAME --all

VM_NAME 替换为您要删除的虚拟机的名称。

如果您要检查将被删除的虚拟机所使用的资源,可以将 --dry-run 标志与 --all 一起指定。

停用 Anthos VM Runtime

如果您不再需要使用 Anthos VM Runtime,可以停用此功能。

bmctl

  • 如需停用运行时,请使用 bmctl 工具:

    bmctl disable vmruntime --kubeconfig KUBECONFIG_PATH \
      --timeout TIMEOUT_IN_MINUTES \
      --force true
    

    提供集群的 kubeconfig 文件的路径和以下配置选项的值:

    • --timeout:等待现有虚拟机资源被删除所经历的 TIMEOUT_IN_MINUTES。默认值为 10 分钟。
    • --force:设置为 true 以确认您要删除现有虚拟机资源。默认值为 false

自定义资源

您必须先确保集群中的所有虚拟机都已被删除,然后才能通过修改 VMRuntime 自定义资源在集群中停用 Anthos 虚拟机运行时。

如需停用运行时,请更新 VMRuntime 自定义资源:

  1. 检查集群中任何现有的虚拟机:

    kubectl get vm
    

    如果该命令显示集群中仍有虚拟机,则您必须先删除这些虚拟机,然后才能继续操作。

  2. 修改 VMRuntime 自定义资源:

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

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

  5. 如需验证 VMRuntime 自定义资源已停用,请查看在 vm-system 命名空间中运行的 Pod:

    kubectl get pods --namespace vm-system
    

    当只有属于 vmruntime-controller-manager 部署的 pod 在命名空间中运行时,Anthos VM Runtime 会停用。

后续步骤