本文档适用于运行 Anthos clusters on Bare Metal 的应用所有者。本文档介绍如何为使用 Anthos VM Runtime 的虚拟机 (VM) 创建和管理磁盘资源。
准备工作
要完成本文档,您需要拥有以下资源的访问权限:
- 访问 Anthos clusters on Bare Metal 1.12.0 版 (
anthosBareMetalVersion: 1.12.0
) 或更高版本集群。您可以使用任何能够运行工作负载的集群类型。如果需要,请在 Compute Engine 上试用 Anthos clusters on Bare Metal,或查看集群创建概览。 - 作为
kubectl
的插件安装的virtctl
客户端工具。如果需要,请安装 virtctl 客户端工具。
使用挂接磁盘创建虚拟机
创建虚拟机时,您可以挂接现有的启动磁盘或数据磁盘,通过映像(包括启动磁盘)创建磁盘,或者创建空白磁盘。
空白磁盘
在此情况下,您将创建一个空白磁盘并将其挂接到虚拟机。在此场景中,您可以创建数据磁盘来存储应用数据。
在您选择的编辑器中创建定义
VirtualMachineDisk
和VirtualMachine
的清单(例如my-vm.yaml
):nano my-vm.yaml
复制并粘贴以下 YAML 定义:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 10Gi --- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv - virtualMachineDiskName: DISK_NAME
请替换以下内容:
DISK_NAME
:您要创建并挂接到虚拟机的空白磁盘的名称。VM_NAME
:您要创建的虚拟机的名称。本示例会创建一个名为
DISK_NAME
的空白10Gi
(10 吉比字节)磁盘。在虚拟机的spec.disks
部分中,您还必须挂接启动磁盘,例如下一部分所示的映像。
在编辑器中保存并关闭清单文件。
使用
kubectl
创建虚拟机和磁盘:kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
将
KUBECONFIG
替换为集群 kubeconfig 文件的路径。
来源映像
在此场景中,您通过映像创建磁盘并将其挂接到虚拟机。在此场景中,您可以通过映像创建启动磁盘。您还可以通过映像创建和挂接数据磁盘。
支持的映像来源
Anthos 虚拟机运行时支持各种映像格式,并且支持可在 VirtualMachineDisk
规范中指定的三种类型的映像来源。以下每个示例都会从受支持的不同映像来源创建 20 吉比字节的磁盘。
超文本传输协议 (HTTP)
以下
VirtualMachineDisk
示例显示了 HTTP 映像来源的基本结构。url
字段需要 HTTP 或 HTTPS 网址。apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: my-disk spec: source: http: url: https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img size: 20GiB storageClassName: local-shared
Cloud Storage
以下示例展示了如何通过 Cloud Storage 存储桶中的映像创建磁盘。如果机器上的应用默认凭据不足以访问 Cloud Storage 网址,您必须提供凭据。在以下示例中,
my-gcs
是包含 base64 编码的服务帐号密钥的 Secret。apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: my-disk spec: source: gcs: url: gs://kubevirt-ci-vm-images/rhel8.2/rhel8_2_cloud.qcow2 secretRef: my-gcs size: 20GiB storageClassName: local-shared
如果您使用下载的服务帐号密钥创建集群,则可以使用 Container Registry 服务帐号密钥访问 Cloud Storage。如果创建单独的服务帐号以访问 Cloud Storage,请参阅配置可访问 Cloud Storage 存储桶的服务帐号。
使用以下命令从下载的服务帐号密钥文件创建 Kubernetes Secret:
kubectl create secret generic SECRET_NAME --from-file=KEY_FILE --namespace default \ --kubeconfig KUBECONFIG
请替换以下内容:
SECRET_NAME
:Secret 的名称。KEY_FILE
:下载的服务帐号密钥 JSON 文件的路径。例如bmctl-workspace/.sa-keys/my-project-anthos-baremetal-gcr.json
。KUBECONFIG
:集群 kubeconfig 文件的路径。
如需详细了解如何使用凭据访问 Cloud Storage,请参阅创建和使用凭据从 Cloud Storage 导入映像。
Container Registry 示例
支持符合 Open Container Initiative (OCI) distribution-spec 的 Container Registry。以下示例通过存储在 Docker 存储库中的映像创建磁盘。
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: my-disk spec: source: registry: url: docker://kubevirt/fedora-cloud-registry-disk-demo size: 20GiB storageClassName: local-shared
有效的映像格式
从映像创建磁盘时,可以使用以下任何映像格式:
- GNU zip (gzip) 归档 (
.gz
) - RAW(
.raw
、.img
) - QEMU Copy On Write 版本 2 (qcow2) 磁盘映像 (
.qcow2
) - XZ 压缩归档 (
.xz
) - 虚拟机磁盘 (VMDK) 文件 (
.vmdk
) - VirtualBox Virtual Disk Image (VDI) 文件 (
.vdi
) - Virtual Hard Disk (VHD) 映像文件 (
.vdh
) - Virtual Hard Disk 版本 2 (VDHX) 文件 (
.vdhx
) - ISO 磁盘映像文件 (
.iso
)
通过 HTTP 映像创建的磁盘示例
以下步骤通过 Ubuntu 映像创建启动磁盘:
在您选择的编辑器中创建定义
VirtualMachineDisk
和VirtualMachine
(例如 my-vm.yaml)的清单:nano my-vm.yaml
复制并粘贴以下 YAML 定义:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: VM_NAME-boot-dv spec: size: 20Gi source: http: url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img --- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv
本示例会使用公共 Ubuntu 映像创建一个名为
VM_NAME-boot-dv
的20Gi
(20 吉比字节)磁盘。在虚拟机的spec.disks
部分中,磁盘设置为boot: true
。在编辑器中保存并关闭清单。
使用
kubectl
创建虚拟机和磁盘:kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
将
KUBECONFIG
替换为集群 kubeconfig 文件的路径。
现有磁盘
在此情况下,您将创建一个空白磁盘并将其挂接到虚拟机。在此场景中,您可以创建数据磁盘来存储应用数据。
在您选择的编辑器中创建
VirtualMachine
清单,例如 my-vm.yaml:nano my-vm.yaml
复制并粘贴以下 YAML 定义:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv - virtualMachineDiskName: EXISTING_DISK_NAME
此示例挂接了名为
EXISTING_DISK_NAME
的现有磁盘。在虚拟机的
spec.disks
部分中,您还必须挂接启动磁盘,例如上一部分所示的映像。在编辑器中保存并关闭虚拟机清单。
使用
kubectl
创建虚拟机:kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
将
KUBECONFIG
替换为集群 kubeconfig 文件的路径。
查找磁盘
从 Anthos Clusters on Bare Metal 1.13.0 版开始,当您创建虚拟机时,Anthos 虚拟机运行时会使用您在虚拟机资源中指定的磁盘名称来设置磁盘序列号。具体而言,您在 VirtualMachine
自定义资源中使用 spec.disks.virtualMachineDiskName
指定的名称将在磁盘序列号中使用。此功能可让您在需要执行磁盘操作(例如格式化或装载)时更轻松地在虚拟机中找到磁盘。
例如,如果您创建了虚拟机并指定了名为 sample-boot-dv
的启动磁盘,则 VirtualMachine
自定义资源如下所示:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: sample-vm
spec:
osType: Linux
compute:
cpu:
vcpus: 2
memory:
capacity: 4Gi
interfaces:
- name: eth0
networkName: pod-network
default: true
disks:
- boot: true
virtualMachineDiskName: sample-vm-boot-dv
- virtualMachineDiskName: attached-disk
对于 Linux 虚拟机,当您登录虚拟机时,可以运行以下命令来按磁盘序列号列出磁盘:
ls -l /dev/disk/by-id/
您的响应应类似于以下示例输出,其中磁盘名称显示为序列号:
total 0
lrwxrwxrwx 1 root root 9 Oct 19 17:17 ata-QEMU_HARDDISK_agentInstallation -> ../../sdb
lrwxrwxrwx 1 root root 9 Oct 19 17:17 ata-QEMU_HARDDISK_agentSADisk -> ../../sda
lrwxrwxrwx 1 root root 9 Oct 19 17:17 virtio-sample-boot-dv -> ../../vda
lrwxrwxrwx 1 root root 10 Oct 19 17:17 virtio-sample-boot-dv-part1 -> ../../vda1
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part14 -> ../../vda14
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part15 -> ../../vda15
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-attached-disk -> ../../vdb
请注意以下环境特征行为:
- 如果
virtualMachineDiskName
值长度超过 20 个字符,Anthos VM Runtime 仅使用前 20 个字符作为序列号。 - 如果两个磁盘的前 20 个字符相同,则只有第一个磁盘具有序列号。
创建磁盘并将其挂接到现有虚拟机
如果您已有虚拟机,则可以创建并挂接磁盘以支持您的应用生命周期。虚拟机必须处于停止状态,才能挂接磁盘。
空白磁盘
在此情况下,您将创建一个空白磁盘并将其挂接到虚拟机。在此场景中,您可以创建数据磁盘来存储应用数据。
如果需要,请使用
kubectl
停止虚拟机:kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
请替换以下内容:
VM_NAME
:您要停止的虚拟机的名称。KUBECONFIG
:集群 kubeconfig 文件的路径。
修改现有虚拟机资源,例如
my-vm
:kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
更新
VirtualMachine
YAML 清单以在顶部添加VirtualMachineDisk
部分,然后在虚拟机的spec.disks
部分的末尾挂接磁盘:apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 10Gi --- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv - virtualMachineDiskName: DISK_NAME
本示例会创建一个名为
DISK_NAME
的空白10Gi
(10 吉比字节)磁盘。在编辑器中保存并关闭更新后的虚拟机清单。
使用
kubectl
启动虚拟机:kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
来源映像
在此场景中,您通过来源映像创建磁盘并将其挂接到虚拟机。
如果需要,请使用
kubectl
停止虚拟机:kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
请替换以下内容:
VM_NAME
:您要停止的虚拟机的名称。KUBECONFIG
:集群 kubeconfig 文件的路径。
修改现有虚拟机资源,例如
my-vm
:kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
更新
VirtualMachine
清单以在顶部添加VirtualMachineDisk
部分,然后将磁盘挂接到虚拟机的spec.disks
部分的末尾:apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 10Gi source: http: url: http://example.com/my-disk-img.qcow2 --- apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachine metadata: name: VM_NAME spec: interfaces: - name: eth0 networkName: pod-network default: true disks: - boot: true virtualMachineDiskName: VM_NAME-boot-dv - virtualMachineDiskName: DISK_NAME
本示例会从
http://example.com/my-disk-img.qcow2
HTTP 来源创建一个名为DISK_NAME
的10Gi
(10 吉比字节)磁盘。在编辑器中保存并关闭更新后的虚拟机清单。
使用
kubectl
启动虚拟机:kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
创建磁盘
在此场景中,您可以独立于虚拟机资源创建磁盘资源。通过这种场景,您可以提前创建磁盘,然后根据需要挂接到虚拟机。
空白磁盘
如需创建空白磁盘,请完成以下步骤。
在您选择的编辑器中创建
VirtualMachineDisk
清单,例如 my-disk.yaml:nano my-disk.yaml
复制并粘贴以下 YAML 定义:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 10Gi
本示例会创建一个名为
DISK_NAME
的空白10Gi
(10 吉比字节)磁盘。在编辑器中保存并关闭磁盘清单。
使用
kubectl
创建磁盘:kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
将
KUBECONFIG
替换为集群 kubeconfig 文件的路径。
来源映像
如需通过映像创建磁盘,请完成以下步骤。
在您选择的编辑器中创建
VirtualMachineDisk
清单,例如my-disk.yaml
:nano my-disk.yaml
复制并粘贴以下 YAML 定义:
apiVersion: vm.cluster.gke.io/v1 kind: VirtualMachineDisk metadata: name: DISK_NAME spec: size: 20Gi source: http: url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
本示例会使用公共 Ubuntu 映像创建一个名为
DISK_NAME
的20Gi
(20 吉比字节)磁盘。在编辑器中保存并关闭磁盘清单。
使用
kubectl
创建磁盘:kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
将
KUBECONFIG
替换为集群 kubeconfig 文件的路径。
后续步骤
- 创建并使用凭据以从 Cloud Storage 导入映像。
- 在 Anthos clusters on Bare Metal 中创建和使用存储类别。
- 如果不再需要虚拟机或其虚拟磁盘资源,请删除 Anthos clusters on Bare Metal 上的虚拟机。