本页面介绍如何使用 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 虚拟机运行时,请执行以下操作:
更新
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
如果您的节点不支持硬件虚拟化,或者您不确定,请将
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
您可以通过设置
vmImageFormat
字段来更改您创建的虚拟机使用的映像格式。vmImageFormat
字段支持两种磁盘映像格式值:raw
和qcow2
。如果未设置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
保存配置并验证
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
以
kubectl
插件的形式安装virtctl
CLI 工具export GOOGLE_APPLICATION_CREDENTIALS="bm-gcr.json" sudo -E ./bmctl install virtctl
验证是否已安装
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
可接受的值包括ubuntu
、centos
、debian
和fedora
。 - 将 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
的可接受值为ubuntu
、centos
、debian
、fedora
。 - 将 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
的可接受值为ubuntu
、centos
、debian
、fedora
。 - 将 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 网络地址。如需从外部访问集群虚拟机,请执行以下操作:
将虚拟机公开为负载均衡器服务:
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 替换为您要为此负载均衡器服务指定的名称。
获取负载均衡器服务的外部 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 集群虚拟机状态信息中心提供了集群虚拟机的实时遥测数据。
如需查看集群虚拟机的遥测信息,请执行以下操作:
在 Google Cloud 控制台中,选择 Monitoring,或点击以下按钮:
选择信息中心。
点击所有信息中心列表中的 Anthos 集群虚拟机状态。
虚拟机控制台日志
虚拟机串行控制台日志会流式传输到 Cloud Logging,您可以在日志浏览器中查看。
删除虚拟机及其资源
仅删除虚拟机
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
自定义资源:
检查集群中任何现有的虚拟机:
kubectl get vm
如果该命令显示集群中仍有虚拟机,则您必须先删除这些虚拟机,然后才能继续操作。
修改
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 在命名空间中运行时,Anthos VM Runtime 会停用。
后续步骤
- 了解 Anthos 虚拟机运行时的已知问题。
- 参阅 KubeVirt 用户指南。