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

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

准备工作

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

启用 Anthos 虚拟机运行时

  1. 通过运行以下命令打开集群配置:

    kubectl --kubeconfig bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig edit cluster CLUSTER_NAME -n cluster-CLUSTER_NAME
    

    CLUSTER_NAME 替换为您的集群名称。

  2. kubevirt 添加到集群配置的 spec 部分。如果该节点支持硬件虚拟化,请将 useEmulation 设置为 false 以获得更好的性能。如果硬件虚拟化不受支持或不确定,请将其设置为 true

    spec:
      anthosBareMetalVersion: 1.8.9
      kubevirt:
        useEmulation: true
      bypassPreflightCheck: false
    
  3. 保存配置并验证是否已启用 KubeVirt:

    kubectl --kubeconfig bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig get pods -n kubevirt
    

    CLUSTER_NAME 替换为您的集群名称。

    该命令返回如下内容:

    NAME                              READY   STATUS    RESTARTS   AGE
    virt-api-767bc4ccd5-56fk2         1/1     Running   0          11d
    virt-api-767bc4ccd5-ms8tn         1/1     Running   0          11d
    virt-controller-c8468c84c-l4dzr   1/1     Running   0          11d
    virt-controller-c8468c84c-tljnj   1/1     Running   1          11d
    virt-handler-6wk5v                1/1     Running   0          11d
    virt-handler-ngth6                1/1     Running   0          11d
    virt-operator-7447547957-c6g5d    1/1     Running   1          11d
    virt-operator-7447547957-nl826    1/1     Running   0          11d
    

安装 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 虚拟机运行时之前,您必须确保该集群中的所有虚拟机均已删除。如果停用 Anthos 虚拟机运行时,则系统会移除所有与 KubeVirt 相关的部署,例如 KubeVirt 和 CDI 命名空间中的 pod 和服务。

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

    kubectl get vm
    

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

  2. 通过运行以下命令打开集群配置:

    kubectl --kubeconfig bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig edit cluster CLUSTER_NAME -n cluster-CLUSTER_NAME
    

    CLUSTER_NAME 替换为您的集群名称。

  3. 从集群配置的 spec 部分中移除 kubevirt

    spec:
      anthosBareMetalVersion: 1.8.9
      kubevirt:
        useEmulation: true
      bypassPreflightCheck: false
    
  4. 保存配置。

后续步骤