8.3. 使用 CLI 创建虚拟机
8.3.1. 通过 CLI 创建虚拟机 复制链接链接已复制到粘贴板!
您可以通过编辑或创建 VirtualMachine 清单来从命令行创建虚拟机 (VM)。您可以使用虚拟机清单中的实例类型来简化虚拟机配置。
您还可以使用 Web 控制台从实例类型创建虚拟机。
8.3.1.1. 从 VirtualMachine 清单创建虚拟机 复制链接链接已复制到粘贴板!
您可以从 VirtualMachine 清单创建虚拟机(VM)。要简化这些清单的创建,您可以使用 virtctl 命令行工具。
先决条件
-
已安装
virtctlCLI。 -
已安装 OpenShift CLI(
oc)。
流程
为虚拟机创建
VirtualMachine清单,并将它保存为 YAML 文件。例如,要创建最小 Red Hat Enterprise Linux (RHEL) 虚拟机,请运行以下命令:$ virtctl create vm --name rhel-9-minimal --volume-import type:ds,src:openshift-virtualization-os-images/rhel9查看虚拟机的
VirtualMachine清单:注意这个示例清单没有配置虚拟机身份验证。
RHEL 虚拟机的清单示例
apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: rhel-9-minimal1 spec: dataVolumeTemplates: - metadata: name: imported-volume-mk4lj spec: sourceRef: kind: DataSource name: rhel92 namespace: openshift-virtualization-os-images3 storage: resources: {} instancetype: inferFromVolume: imported-volume-mk4lj4 inferFromVolumeFailurePolicy: Ignore preference: inferFromVolume: imported-volume-mk4lj5 inferFromVolumeFailurePolicy: Ignore runStrategy: Always template: spec: domain: devices: {} memory: guest: 512Mi resources: {} terminationGracePeriodSeconds: 180 volumes: - dataVolume: name: imported-volume-mk4lj name: imported-volume-mk4lj使用清单文件创建虚拟机:
$ oc create -f <vm_manifest_file>.yaml可选:启动虚拟机:
$ virtctl start <vm_name>
后续步骤
8.3.2. 使用容器磁盘创建虚拟机 复制链接链接已复制到粘贴板!
您可以使用从操作系统镜像构建的容器磁盘创建虚拟机 (VM)。
您可以为容器磁盘启用自动更新。详情请参阅管理自动引导源更新。
如果容器磁盘较大,I/O 流量可能会增加,并导致 worker 节点不可用。您可以执行以下任务来解决这个问题:
您可以通过执行以下步骤从容器磁盘创建虚拟机:
- 将操作系统镜像构建到容器磁盘中,并将其上传到容器注册表。
- 如果您的容器 registry 没有 TLS,请将您的环境配置为为您的 registry 禁用 TLS。
- 使用 Web 控制台或命令行使用容器磁盘创建虚拟机作为磁盘源。
您必须在从红帽提供的操作系统镜像创建的虚拟机上安装 QEMU 客户机代理。
8.3.2.1. 构建和上传容器磁盘 复制链接链接已复制到粘贴板!
您可以将虚拟机(VM)镜像构建到容器磁盘中,并将其上传到 registry。
容器磁盘的大小受托管容器磁盘的 registry 的最大层大小的限制。
对于 Red Hat Quay,您可以通过编辑首次部署 Red Hat Quay 时创建的 YAML 配置文件来更改最大层大小。
先决条件
-
必须安装
podman。 - 您必须具有 QCOW2 或 RAW 镜像文件。
流程
创建 Dockerfile 以将虚拟机镜像构建到容器镜像中。虚拟机镜像必须由 QEMU 所有,其 UID 为
107,并放置在容器内的/disk/目录中。/disk/目录的权限必须设为0440。以下示例在第一阶段使用 Red Hat Universal Base Image(UBI)来处理这些配置更改,并使用第二阶段中的最小
scratch镜像存储结果:$ cat > Dockerfile << EOF FROM registry.access.redhat.com/ubi8/ubi:latest AS builder ADD --chown=107:107 <vm_image>.qcow2 /disk/1 RUN chmod 0440 /disk/* FROM scratch COPY --from=builder /disk/* /disk/ EOF- 1
- 其中
<vm_image>是 QCOW2 或 RAW 格式的镜像。如果使用远程镜像,请将<vm_image>.qcow2替换为完整的 URL。
构建和标记容器:
$ podman build -t <registry>/<container_disk_name>:latest .将容器镜像推送到 registry:
$ podman push <registry>/<container_disk_name>:latest
8.3.2.2. 为容器 registry 禁用 TLS 复制链接链接已复制到粘贴板!
您可以通过编辑 HyperConverged 自定义资源的 insecureRegistries 字段来禁用一个或多个容器 registry 的 TLS(传输层安全)。
先决条件
-
已安装 OpenShift CLI(
oc)。
流程
运行以下命令,在默认编辑器中打开
HyperConvergedCR:$ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv将不安全的 registry 列表添加到
spec.storageImport.insecureRegistries字段中。HyperConverged自定义资源示例:apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged namespace: openshift-cnv spec: storageImport: insecureRegistries:1 - "private-registry-example-1:5000" - "private-registry-example-2:5000"- 1
- 将此列表中的示例替换为有效的 registry 主机名。
8.3.2.3. 使用 Web 控制台从容器磁盘创建虚拟机 复制链接链接已复制到粘贴板!
您可以使用 OpenShift Container Platform web 控制台从容器 registry 中导入容器磁盘来创建虚拟机 (VM)。
流程
-
在 web 控制台中进入到 Virtualization
Catalog。 - 点没有可用引导源的模板标题。
- 点 Customize VirtualMachine。
- 在 Customize template parameters 页面中,展开 Storage,然后从 Disk source 列表中选择 Registry (creates PVC)。
-
输入容器镜像 URL。示例:
https://mirror.arizona.edu/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2 - 设置磁盘大小。
- 点击 Next。
- 点 Create VirtualMachine。
8.3.2.4. 使用 CLI 从容器磁盘创建虚拟机 复制链接链接已复制到粘贴板!
您可以使用命令行从容器磁盘创建虚拟机 (VM)。
先决条件
- 您必须具有包含容器磁盘的容器 registry 的访问凭证。
-
已安装
virtctlCLI。 -
已安装 OpenShift CLI(
oc)。
流程
为虚拟机创建
VirtualMachine清单,并将它保存为 YAML 文件。例如,要从容器磁盘创建最小 Red Hat Enterprise Linux (RHEL) 虚拟机,请运行以下命令:$ virtctl create vm --name vm-rhel-9 --instancetype u1.small --preference rhel.9 --volume-containerdisk src:registry.redhat.io/rhel9/rhel-guest-image:9.5查看虚拟机的
VirtualMachine清单:apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: vm-rhel-91 spec: instancetype: name: u1.small2 preference: name: rhel.93 runStrategy: Always template: metadata: creationTimestamp: null spec: domain: devices: {} resources: {} terminationGracePeriodSeconds: 180 volumes: - containerDisk: image: registry.redhat.io/rhel9/rhel-guest-image:9.54 name: vm-rhel-9-containerdisk-0运行以下命令来创建虚拟机:
$ oc create -f <vm_manifest_file>.yaml
验证
监控虚拟机的状态:
$ oc get vm <vm_name>如果置备成功,虚拟机状态为
Running。输出示例:NAME AGE STATUS READY vm-rhel-9 18s Running True通过访问其串行控制台来验证置备是否已完成,以及虚拟机是否已启动:
$ virtctl console <vm_name>如果虚拟机正在运行且串行控制台可以访问,输出如下所示:
Successfully connected to vm-rhel-9 console. The escape sequence is ^]
8.3.3. 通过克隆 PVC 创建虚拟机 复制链接链接已复制到粘贴板!
您可以通过使用自定义镜像克隆现有持久性卷声明 (PVC) 来创建虚拟机 (VM)。
您必须在从红帽提供的操作系统镜像创建的虚拟机上安装 QEMU 客户机代理。
您可以通过创建一个引用源 PVC 的数据卷来克隆 PVC。
8.3.3.1. 关于克隆 复制链接链接已复制到粘贴板!
在克隆数据卷时,Containerized Data Importer (CDI) 选择以下 Container Storage Interface (CSI)克隆方法之一:CSI 卷克隆或智能克隆。两种方法效率都比较高,但有某些特定的要求。如果没有满足要求,CDI 将使用主机辅助克隆。
主机辅助克隆是最慢且效率最低的克隆方法,但使用它的要求比其它两种克隆方法要少。
8.3.3.1.1. CSI 卷克隆 复制链接链接已复制到粘贴板!
Container Storage Interface (CSI) 克隆使用 CSI 驱动程序功能更有效地克隆源数据卷。
CSI 卷克隆有以下要求:
- 支持持久性卷声明(PVC)的存储类的 CSI 驱动程序必须支持卷克隆。
-
对于 CDI 无法识别的置备程序,对应的存储配置集必须将
cloneStrategy设置为 CSI Volume Cloning。 - 源和目标 PVC 必须具有相同的存储类和卷模式。
-
如果创建数据卷,则必须有在源命名空间中创建
datavolumes/source资源的权限。 - 源卷不能在使用中。
8.3.3.1.2. 智能克隆 复制链接链接已复制到粘贴板!
当有快照功能的 Container Storage Interface (CSI) 插件时,Containerized Data Importer (CDI) 会从快照创建一个持久性卷声明 (PVC),然后允许有效地克隆额外的 PVC。
智能克隆有以下要求:
- 与存储类关联的快照类必须存在。
- 源和目标 PVC 必须具有相同的存储类和卷模式。
-
如果创建数据卷,则必须有在源命名空间中创建
datavolumes/source资源的权限。 - 源卷不能在使用中。
8.3.3.1.3. 主机辅助克隆 复制链接链接已复制到粘贴板!
当没有满足 Container Storage Interface (CSI) 卷克隆或智能克隆的要求时,主机辅助克隆将用作回退方法。主机辅助克隆比其他两个克隆方法之一更高效。
主机辅助克隆使用源 pod 和目标 pod 将数据从源卷复制到目标卷。目标持久性卷声明 (PVC) 使用回退原因标注,该原因解释了使用主机辅助克隆的原因,并创建事件。
PVC 目标注解示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
cdi.kubevirt.io/cloneFallbackReason: The volume modes of source and target are incompatible
cdi.kubevirt.io/clonePhase: Succeeded
cdi.kubevirt.io/cloneType: copy
事件示例:
NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE
test-ns 0s Warning IncompatibleVolumeModes persistentvolumeclaim/test-target The volume modes of source and target are incompatible
8.3.3.2. 使用 Web 控制台从 PVC 创建虚拟机 复制链接链接已复制到粘贴板!
您可以使用 OpenShift Container Platform web 控制台克隆持久性卷声明 (PVC) 来创建虚拟机 (VM)。
先决条件
- 您必须有权访问包含源 PVC 的命名空间。
流程
-
在 web 控制台中进入到 Virtualization
Catalog。 - 点没有可用引导源的模板标题。
- 点 Customize VirtualMachine。
- 在 Customize template parameters 页面中,展开 Storage,然后从 Disk source 列表中选择 PVC (clone PVC)。
- 选择 PVC 项目和 PVC 名称。
- 设置磁盘大小。
- 点击 Next。
- 点 Create VirtualMachine。
8.3.3.3. 使用 CLI 从 PVC 创建虚拟机 复制链接链接已复制到粘贴板!
您可以使用命令行克隆现有虚拟机的持久性卷声明 (PVC) 来创建虚拟机 (VM)。
您可以使用以下选项之一克隆 PVC:
将 PVC 克隆到新数据卷中。
这个方法会创建一个独立于原始虚拟机的数据卷。删除原始虚拟机不会影响新数据卷或者关联的 PVC。
通过使用
dataVolumeTemplates小节创建VirtualMachine清单来克隆 PVC。这个方法会创建一个数据卷,其生命周期取决于原始虚拟机。删除原始虚拟机会删除克隆的数据卷及其关联的 PVC。
8.3.3.3.1. 在 OpenShift Data Foundation 中大规模优化克隆性能 复制链接链接已复制到粘贴板!
使用 OpenShift Data Foundation 时,存储配置集将默认克隆策略配置为 csi-clone。但是,这种方法存在限制,如以下链接所示。
从持久性卷声明(PVC)创建一定数量的克隆后,后台扁平化过程开始,这可显著减少大规模克隆创建性能。
要在从单一源 PVC 创建数百个克隆时提高性能,请使用 VolumeSnapshot 克隆方法而不是默认的 csi-clone 策略。
流程
使用以下内容创建源镜像的
VolumeSnapshot自定义资源 (CR):apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: golden-volumesnapshot namespace: golden-ns spec: volumeSnapshotClassName: ocs-storagecluster-rbdplugin-snapclass source: persistentVolumeClaimName: golden-snap-source添加
spec.source.snapshot小节,将VolumeSnapshot引用为DataVolume clone的源:spec: source: snapshot: namespace: golden-ns name: golden-volumesnapshot
8.3.3.3.2. 将 PVC 克隆到数据卷中 复制链接链接已复制到粘贴板!
您可以使用命令行将现有虚拟机 (VM) 磁盘的持久性卷声明 (PVC) 克隆到数据卷中。
您可以创建一个引用原始源 PVC 的数据卷。新数据卷的生命周期独立于原始虚拟机。删除原始虚拟机不会影响新数据卷或者关联的 PVC。
主机辅助克隆支持在不同卷模式间进行克隆,如从块持久性卷 (PV) 克隆到文件系统 PV,只要源和目标 PV 属于 kubevirt 内容类型。
智能克隆比主机辅助克隆更快、效率更高,因为它使用快照克隆 PVC。支持快照的存储供应商支持智能克隆,如 Red Hat OpenShift Data Foundation。
对于智能克隆,不支持在不同卷模式间进行克隆。
先决条件
-
已安装 OpenShift CLI(
oc)。 - 带有源 PVC 的虚拟机必须被关闭。
- 如果将 PVC 克隆到不同的命名空间中,则必须具有在目标命名空间中创建资源的权限。
smart-cloning 的额外先决条件:
- 您的存储供应商必须支持快照。
- 源和目标 PVC 必须具有相同的存储供应商和卷模式。
VolumeSnapshotClass对象的driver键的值必须与StorageClass对象的provisioner键的值匹配,如下例所示:VolumeSnapshotClass对象示例:kind: VolumeSnapshotClass apiVersion: snapshot.storage.k8s.io/v1 driver: openshift-storage.rbd.csi.ceph.com # ...StorageClass对象示例:kind: StorageClass apiVersion: storage.k8s.io/v1 # ... provisioner: openshift-storage.rbd.csi.ceph.com
流程
如以下示例所示创建
DataVolume清单:apiVersion: cdi.kubevirt.io/v1beta1 kind: DataVolume metadata: name: <datavolume>1 spec: source: pvc: namespace: "<source_namespace>"2 name: "<my_vm_disk>"3 storage: {}运行以下命令来创建数据卷:
$ oc create -f <datavolume>.yaml注意数据卷可防止虚拟机在 PVC 准备好前启动。您可以创建一个在克隆 PVC 时引用新数据卷的虚拟机。
8.3.3.3.3. 使用数据卷模板从克隆的 PVC 创建虚拟机 复制链接链接已复制到粘贴板!
您可以创建一个虚拟机 (VM) 来使用数据卷模板克隆现有虚拟机的持久性卷声明 (PVC)。此方法会创建一个数据卷,其生命周期独立于原始虚拟机。
先决条件
- 带有源 PVC 的虚拟机必须被关闭。
-
已安装
virtctlCLI。 -
已安装 OpenShift CLI(
oc)。
流程
为虚拟机创建
VirtualMachine清单,并将其保存为 YAML 文件,例如:$ virtctl create vm --name rhel-9-clone --volume-import type:pvc,src:my-project/imported-volume-q5pr9查看虚拟机的
VirtualMachine清单:apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: rhel-9-clone1 spec: dataVolumeTemplates: - metadata: name: imported-volume-h4qn8 spec: source: pvc: name: imported-volume-q5pr92 namespace: my-project3 storage: resources: {} instancetype: inferFromVolume: imported-volume-h4qn84 inferFromVolumeFailurePolicy: Ignore preference: inferFromVolume: imported-volume-h4qn85 inferFromVolumeFailurePolicy: Ignore runStrategy: Always template: spec: domain: devices: {} memory: guest: 512Mi resources: {} terminationGracePeriodSeconds: 180 volumes: - dataVolume: name: imported-volume-h4qn8 name: imported-volume-h4qn8使用 PVC 克隆的数据卷创建虚拟机:
$ oc create -f <vm_manifest_file>.yaml