9.3. 使用 CLI 创建虚拟机


9.3.1. 通过 CLI 创建虚拟机

您可以通过编辑或创建 VirtualMachine 清单来从命令行创建虚拟机 (VM)。您可以使用虚拟机清单中的实例类型来简化虚拟机配置。

注意

9.3.1.1. 从 VirtualMachine 清单创建虚拟机

您可以从 VirtualMachine 清单创建虚拟机(VM)。要简化这些清单的创建,您可以使用 virtctl 命令行工具。

先决条件

  • 已安装 virtctl CLI。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 为虚拟机创建 VirtualMachine 清单,并将它保存为 YAML 文件。例如,要创建最小 Red Hat Enterprise Linux (RHEL)虚拟机,请运行以下命令:

    $ virtctl create vm --name rhel-9-minimal --volume-import type:ds,src:openshift-virtualization-os-images/rhel9
    Copy to Clipboard Toggle word wrap
  2. 查看虚拟机的 VirtualMachine 清单:

    注意

    这个示例清单没有配置虚拟机身份验证。

    RHEL 虚拟机的清单示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: rhel-9-minimal 
    1
    
    spec:
      dataVolumeTemplates:
      - metadata:
          name: imported-volume-mk4lj
        spec:
          sourceRef:
            kind: DataSource
            name: rhel9 
    2
    
            namespace: openshift-virtualization-os-images 
    3
    
          storage:
            resources: {}
      instancetype:
        inferFromVolume: imported-volume-mk4lj 
    4
    
        inferFromVolumeFailurePolicy: Ignore
      preference:
        inferFromVolume: imported-volume-mk4lj 
    5
    
        inferFromVolumeFailurePolicy: Ignore
      runStrategy: Always
      template:
        spec:
          domain:
            devices: {}
            memory:
              guest: 512Mi
            resources: {}
          terminationGracePeriodSeconds: 180
          volumes:
          - dataVolume:
              name: imported-volume-mk4lj
            name: imported-volume-mk4lj
    Copy to Clipboard Toggle word wrap

    1
    虚拟机名称。
    2
    客户机操作系统的引导源。
    3
    引导源的命名空间。金级镜像存储在 openshift-virtualization-os-images 命名空间中。
    4
    实例类型从所选的 DataSource 对象推断出来。
    5
    首选项从所选的 DataSource 对象推断出来。
  3. 使用清单文件创建虚拟机:

    $ oc create -f <vm_manifest_file>.yaml
    Copy to Clipboard Toggle word wrap
  4. 可选:启动虚拟机:

    $ virtctl start <vm_name>
    Copy to Clipboard Toggle word wrap

9.3.2. 使用容器磁盘创建虚拟机

您可以使用从操作系统镜像构建的容器磁盘创建虚拟机 (VM)。

您可以为容器磁盘启用自动更新。详情请参阅管理自动引导源更新

重要

如果容器磁盘较大,I/O 流量可能会增加,并导致 worker 节点不可用。您可以执行以下任务来解决这个问题:

您可以通过执行以下步骤从容器磁盘创建虚拟机:

  1. 将操作系统镜像构建到容器磁盘中,并将其上传到容器注册表
  2. 如果您的容器 registry 没有 TLS,请将您的环境配置为为您的 registry 禁用 TLS
  3. 使用 Web 控制台命令行使用容器磁盘创建虚拟机作为磁盘源。
重要

您必须在从红帽提供的操作系统镜像创建的虚拟机上安装 QEMU 客户机代理

9.3.2.1. 构建和上传容器磁盘

您可以将虚拟机(VM)镜像构建到容器磁盘中,并将其上传到 registry。

容器磁盘的大小受托管容器磁盘的 registry 的最大层大小的限制。

注意

对于 Red Hat Quay,您可以通过编辑首次部署 Red Hat Quay 时创建的 YAML 配置文件来更改最大层大小。

先决条件

  • 必须安装 podman
  • 您必须具有 QCOW2 或 RAW 镜像文件。

流程

  1. 创建 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
    Copy to Clipboard Toggle word wrap
    1
    其中 <vm_image> 是 QCOW2 或 RAW 格式的镜像。如果使用远程镜像,请将 <vm_image>.qcow2 替换为完整的 URL。
  2. 构建和标记容器:

    $ podman build -t <registry>/<container_disk_name>:latest .
    Copy to Clipboard Toggle word wrap
  3. 将容器镜像推送到 registry:

    $ podman push <registry>/<container_disk_name>:latest
    Copy to Clipboard Toggle word wrap

9.3.2.2. 为容器 registry 禁用 TLS

您可以通过编辑 HyperConverged 自定义资源的 insecureRegistries 字段来禁用一个或多个容器 registry 的 TLS(传输层安全)。

先决条件

  • 已安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令,在默认编辑器中打开 HyperConverged CR:

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
    Copy to Clipboard Toggle word wrap
  2. 将不安全的 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"
    Copy to Clipboard Toggle word wrap

    1
    将此列表中的示例替换为有效的 registry 主机名。

9.3.2.3. 使用 Web 控制台从容器磁盘创建虚拟机

您可以使用 OpenShift Container Platform web 控制台从容器 registry 中导入容器磁盘来创建虚拟机 (VM)。

流程

  1. 在 web 控制台中进入到 Virtualization Catalog
  2. 点没有可用引导源的模板标题。
  3. Customize VirtualMachine
  4. Customize template parameters 页面中,展开 Storage,然后从 Disk source 列表中选择 Registry (creates PVC)
  5. 输入容器镜像 URL。示例:https://mirror.arizona.edu/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2
  6. 设置磁盘大小。
  7. 点击 Next
  8. Create VirtualMachine

9.3.2.4. 使用 CLI 从容器磁盘创建虚拟机

您可以使用命令行从容器磁盘创建虚拟机 (VM)。

先决条件

  • 您必须具有包含容器磁盘的容器 registry 的访问凭证。
  • 已安装 virtctl CLI。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 为虚拟机创建 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
    Copy to Clipboard Toggle word wrap
  2. 查看虚拟机的 VirtualMachine 清单:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: vm-rhel-9 
    1
    
    spec:
      instancetype:
        name: u1.small 
    2
    
      preference:
        name: rhel.9 
    3
    
      runStrategy: Always
      template:
        metadata:
          creationTimestamp: null
        spec:
          domain:
            devices: {}
            resources: {}
          terminationGracePeriodSeconds: 180
          volumes:
          - containerDisk:
              image: registry.redhat.io/rhel9/rhel-guest-image:9.5 
    4
    
            name: vm-rhel-9-containerdisk-0
    Copy to Clipboard Toggle word wrap
    1
    虚拟机名称。
    2
    用于控制虚拟机资源大小的实例类型。
    3
    首选使用。
    4
    容器磁盘的 URL。
  3. 运行以下命令来创建虚拟机:

    $ oc create -f <vm_manifest_file>.yaml
    Copy to Clipboard Toggle word wrap

验证

  1. 监控虚拟机的状态:

    $ oc get vm <vm_name>
    Copy to Clipboard Toggle word wrap

    如果置备成功,虚拟机状态为 Running

    输出示例

    NAME        AGE   STATUS    READY
    vm-rhel-9   18s   Running   True
    Copy to Clipboard Toggle word wrap

  2. 通过访问其串行控制台来验证置备是否已完成,以及虚拟机是否已启动:

    $ virtctl console <vm_name>
    Copy to Clipboard Toggle word wrap

    如果虚拟机正在运行且串行控制台可以访问,输出如下所示:

    输出示例

    Successfully connected to vm-rhel-9 console. The escape sequence is ^]
    Copy to Clipboard Toggle word wrap

9.3.3. 通过克隆 PVC 创建虚拟机

您可以通过使用自定义镜像克隆现有持久性卷声明 (PVC) 来创建虚拟机 (VM)。

您必须在从红帽提供的操作系统镜像创建的虚拟机上安装 QEMU 客户机代理

您可以通过创建一个引用源 PVC 的数据卷来克隆 PVC。

9.3.3.1. 关于克隆

在克隆数据卷时,Containerized Data Importer (CDI)选择以下 Container Storage Interface (CSI)克隆方法之一:

  • CSI 卷克隆
  • 智能克隆

CSI 卷克隆和智能克隆方法都非常高效,但使用它们会有一定的要求。如果没有满足要求,CDI 将使用主机辅助克隆。主机辅助克隆是最慢且效率最低的克隆方法,但使用它的要求比其它两种克隆方法要少。

9.3.3.1.1. CSI 卷克隆

Container Storage Interface (CSI) 克隆使用 CSI 驱动程序功能更有效地克隆源数据卷。

CSI 卷克隆有以下要求:

  • 支持持久性卷声明(PVC)的存储类的 CSI 驱动程序必须支持卷克隆。
  • 对于 CDI 无法识别的置备程序,对应的存储配置集必须将 cloneStrategy 设置为 CSI Volume Cloning。
  • 源和目标 PVC 必须具有相同的存储类和卷模式。
  • 如果创建数据卷,则必须有在源命名空间中创建 datavolumes/source 资源的权限。
  • 源卷不能在使用中。
9.3.3.1.2. 智能克隆

当有快照功能的 Container Storage Interface (CSI) 插件时,Containerized Data Importer (CDI) 会从快照创建一个持久性卷声明 (PVC),然后允许有效地克隆额外的 PVC。

智能克隆有以下要求:

  • 与存储类关联的快照类必须存在。
  • 源和目标 PVC 必须具有相同的存储类和卷模式。
  • 如果创建数据卷,则必须有在源命名空间中创建 datavolumes/source 资源的权限。
  • 源卷不能在使用中。
9.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
Copy to Clipboard Toggle word wrap

事件示例

NAMESPACE   LAST SEEN   TYPE      REASON                    OBJECT                              MESSAGE
test-ns     0s          Warning   IncompatibleVolumeModes   persistentvolumeclaim/test-target   The volume modes of source and target are incompatible
Copy to Clipboard Toggle word wrap

9.3.3.2. 使用 Web 控制台从 PVC 创建虚拟机

您可以使用 OpenShift Container Platform web 控制台克隆持久性卷声明 (PVC) 来创建虚拟机 (VM)。

先决条件

  • 您必须有权访问包含源 PVC 的命名空间。

流程

  1. 在 web 控制台中进入到 Virtualization Catalog
  2. 点没有可用引导源的模板标题。
  3. Customize VirtualMachine
  4. Customize template parameters 页面中,展开 Storage,然后从 Disk source 列表中选择 PVC (clone PVC)
  5. 选择 PVC 项目和 PVC 名称。
  6. 设置磁盘大小。
  7. 点击 Next
  8. Create VirtualMachine

9.3.3.3. 使用 CLI 从 PVC 创建虚拟机

您可以使用命令行克隆现有虚拟机的持久性卷声明 (PVC) 来创建虚拟机 (VM)。

您可以使用以下选项之一克隆 PVC:

  • 将 PVC 克隆到新数据卷中。

    这个方法会创建一个独立于原始虚拟机的数据卷。删除原始虚拟机不会影响新数据卷或者关联的 PVC。

  • 通过使用 dataVolumeTemplates 小节创建 VirtualMachine 清单来克隆 PVC。

    这个方法会创建一个数据卷,其生命周期取决于原始虚拟机。删除原始虚拟机会删除克隆的数据卷及其关联的 PVC。

使用 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
Copy to Clipboard Toggle word wrap
  1. 添加 spec.source.snapshot 小节,将 VolumeSnapshot 引用为 DataVolume 克隆 的源:
spec:
  source:
    snapshot:
      namespace: golden-ns
      name: golden-volumesnapshot
Copy to Clipboard Toggle word wrap
9.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
      # ...
      Copy to Clipboard Toggle word wrap

      StorageClass 对象示例

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      # ...
      provisioner: openshift-storage.rbd.csi.ceph.com
      Copy to Clipboard Toggle word wrap

流程

  1. 如以下示例所示创建 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: {}
    Copy to Clipboard Toggle word wrap
    1
    指定新数据卷的名称。
    2
    指定源 PVC 的命名空间。
    3
    指定源 PVC 的名称。
  2. 运行以下命令来创建数据卷:

    $ oc create -f <datavolume>.yaml
    Copy to Clipboard Toggle word wrap
    注意

    数据卷可防止虚拟机在 PVC 准备好前启动。您可以创建一个在克隆 PVC 时引用新数据卷的虚拟机。

您可以创建一个虚拟机 (VM) 来使用数据卷模板克隆现有虚拟机的持久性卷声明 (PVC)。此方法会创建一个数据卷,其生命周期独立于原始虚拟机。

先决条件

  • 带有源 PVC 的虚拟机必须被关闭。
  • 已安装 virtctl CLI。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 为虚拟机创建 VirtualMachine 清单,并将其保存为 YAML 文件,例如:

    $ virtctl create vm --name rhel-9-clone --volume-import type:pvc,src:my-project/imported-volume-q5pr9
    Copy to Clipboard Toggle word wrap
  2. 查看虚拟机的 VirtualMachine 清单:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: rhel-9-clone 
    1
    
    spec:
      dataVolumeTemplates:
      - metadata:
          name: imported-volume-h4qn8
        spec:
          source:
            pvc:
              name: imported-volume-q5pr9 
    2
    
              namespace: my-project 
    3
    
          storage:
            resources: {}
      instancetype:
        inferFromVolume: imported-volume-h4qn8 
    4
    
        inferFromVolumeFailurePolicy: Ignore
      preference:
        inferFromVolume: imported-volume-h4qn8 
    5
    
        inferFromVolumeFailurePolicy: Ignore
      runStrategy: Always
      template:
        spec:
          domain:
            devices: {}
            memory:
              guest: 512Mi
            resources: {}
          terminationGracePeriodSeconds: 180
          volumes:
          - dataVolume:
              name: imported-volume-h4qn8
            name: imported-volume-h4qn8
    Copy to Clipboard Toggle word wrap
    1
    虚拟机名称。
    2
    源 PVC 的名称。
    3
    源 PVC 的命名空间。
    4
    如果 PVC 源有适当的标签,则实例类型会从所选的 DataSource 对象推断出来。
    5
    如果 PVC 源有适当的标签,则首选会从所选 DataSource 对象中推断出来。
  3. 使用 PVC 克隆的数据卷创建虚拟机:

    $ oc create -f <vm_manifest_file>.yaml
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat