10.22. 虚拟机磁盘

10.22.1. 存储特性

使用下表来决定 OpenShift Virtualization 中的本地和共享持久性存储的功能可用性。

10.22.1.1. OpenShift Virtualization 存储功能列表

表 10.5. OpenShift Virtualization 存储功能列表

 虚拟机实时迁移主机辅助虚拟机磁盘克隆存储辅助虚拟机磁盘克隆虚拟机快照

OpenShift Data Foundation:RBD 块模式卷

OpenShift Virtualization hostpath 置备程序

不是

其他多节点可写入存储

[1]

[2]

[2]

其他单节点可写入存储

[2]

[2]

  1. PVC 必须请求 ReadWriteMany 访问模式。
  2. 存储供应商必须支持 Kubernetes 和 CSI 快照 API
注意

您无法实时迁移使用以下配置的虚拟机:

  • 具有 ReadWriteOnce(RWO)访问模式的存储类
  • 透传功能,比如 GPU

对于这些虚拟机,不要将 evictionStrategy 字段设置为 LiveMigrate

10.22.2. 为虚拟机配置本地存储

您可以使用 hostpath 置备程序(HPP)为虚拟机配置本地存储。

安装 OpenShift Virtualization Operator 时,会自动安装 Hostpath Provisioner(HPP)Operator。HPP 是一个本地存储置备程序,用于由 Hostpath Provisioner Operator 创建的 OpenShift Virtualization。要使用 HPP,您必须创建一个 HPP 自定义资源(CR)。

10.22.2.1. 使用基本存储池创建 hostpath 置备程序

您可以使用 storagePools 小节创建 HPP 自定义资源(CR),以使用基本存储池配置 hostpath 置备程序(HPP)。存储池指定 CSI 驱动程序使用的名称和路径。

先决条件

  • spec.storagePools.path 中指定的目录必须具有读/写访问权限。
  • 存储池不能与操作系统位于同一个分区。否则,操作系统分区可能会被填充到容量中,这会影响性能或导致节点不稳定或不可用。

步骤

  1. 使用 storagePools 小节创建一个 hpp_cr.yaml 文件,如下例所示:

    apiVersion: hostpathprovisioner.kubevirt.io/v1beta1
    kind: HostPathProvisioner
    metadata:
      name: hostpath-provisioner
    spec:
      imagePullPolicy: IfNotPresent
      storagePools: 1
      - name: any_name
        path: "/var/myvolumes" 2
    workload:
      nodeSelector:
        kubernetes.io/os: linux
    1
    storagePools 小节是一个数组,您可以添加多个条目。
    2
    指定此节点路径下的存储池目录。
  2. 保存文件并退出。
  3. 运行以下命令来创建 HPP:

    $ oc create -f hpp_cr.yaml
10.22.2.1.1. 关于创建存储类

当您创建存储类时,您将设置参数,它们会影响属于该存储类的持久性卷(PV)的动态置备。您不能在创建 StorageClass 对象后更新其参数。

要使用 hostpath 置备程序(HPP),您必须使用 storagePools 小节为 CSI 驱动程序创建关联的存储类。

注意

虚拟机使用基于本地 PV 的数据卷。本地 PV 与特定节点绑定。虽然磁盘镜像准备供虚拟机消耗,但可能不会将虚拟机调度到之前固定本地存储 PV 的节点。

要解决这个问题,使用 Kubernetes pod 调度程序将持久性卷声明(PVC)绑定到正确的节点上的 PV。通过使用 volumeBindingMode 参数设置为 WaitForFirstConsumerStorageClass 值,PV 的绑定和置备会延迟到 pod 使用 PVC。

10.22.2.1.2. 使用 storagePools 小节为 CSI 驱动程序创建存储类

您可以为 hostpath 置备程序(HPP)CSI 驱动程序创建存储类自定义资源(CR)。

步骤

  1. 创建 storageclass_csi.yaml 文件来定义存储类:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: hostpath-csi
    provisioner: kubevirt.io.hostpath-provisioner
    reclaimPolicy: Delete 1
    volumeBindingMode: WaitForFirstConsumer 2
    parameters:
      storagePool: my-storage-pool 3
1
两个可能的 reclaimPolicy 值为 DeleteRetain。如果没有指定值,则默认值为 Delete
2
volumeBindingMode 参数决定何时发生动态置备和卷绑定。指定 WaitForFirstConsumer,将持久性卷(PV)的绑定和置备延迟到创建使用持久性卷声明(PVC)的 pod 后。这样可确保 PV 满足 pod 的调度要求。
3
指定 HPP CR 中定义的存储池名称。
  1. 保存文件并退出。
  2. 运行以下命令来创建 StorageClass 对象:

    $ oc create -f storageclass_csi.yaml

10.22.2.2. 关于使用 PVC 模板创建的存储池

如果您有单个大持久性卷(PV),可以通过在 hostpath 置备程序(HPP)自定义资源(CR)中定义 PVC 模板来创建存储池。

使用 PVC 模板创建的存储池可以包含多个 HPP 卷。将 PV 拆分为较小的卷,可为数据分配提供更大的灵活性。

PVC 模板基于 PersistentVolumeClaim 对象的 spec 小节:

PersistentVolumeClaim 对象示例

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: iso-pvc
spec:
  volumeMode: Block 1
  storageClassName: my-storage-class
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

1
这个值只适用于块卷模式 PV。

您可以使用 HPP CR 中的 pvcTemplate 规格来定义存储池。Operator 从包含 HPP CSI 驱动程序的每个节点中创建一个 PVC。从 PVC 模板创建的 PVC 使用单个大 PV,允许 HPP 创建较小的动态卷。

您可以将基本存储池与从 PVC 模板中创建的存储池合并。

10.22.2.2.1. 使用 PVC 模板创建存储池

您可以通过在 HPP 自定义资源(CR)中指定 PVC 模板,为多个 hostpath 置备程序(HPP)卷创建存储池。

先决条件

  • spec.storagePools.path 中指定的目录必须具有读/写访问权限。
  • 存储池不能与操作系统位于同一个分区。否则,操作系统分区可能会被填充到容量中,这会影响性能或导致节点不稳定或不可用。

步骤

  1. 为 HPP CR 创建 hpp_pvc_template_pool.yaml 文件,该文件指定 storagePools 小节中的持久性卷(PVC)模板,如下例所示:

    apiVersion: hostpathprovisioner.kubevirt.io/v1beta1
    kind: HostPathProvisioner
    metadata:
      name: hostpath-provisioner
    spec:
      imagePullPolicy: IfNotPresent
      storagePools: 1
      - name: my-storage-pool
        path: "/var/myvolumes" 2
        pvcTemplate:
          volumeMode: Block 3
          storageClassName: my-storage-class 4
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 5Gi 5
      workload:
        nodeSelector:
          kubernetes.io/os: linux
    1
    storagePools 小节是一个可包含基本和 PVC 模板存储池的数组。
    2
    指定此节点路径下的存储池目录。
    3
    可选:volumeMode 参数可以是 BlockFilesystem,只要它与置备的卷格式匹配。如果没有指定值,则默认为 Filesystem。如果 volumeModeBlock,挂载 pod 会在挂载前在块卷中创建一个 XFS 文件系统。
    4
    如果省略 storageClassName 参数,则使用默认存储类来创建 PVC。如果省略 storageClassName,请确保 HPP 存储类不是默认存储类。
    5
    您可以指定静态或动态置备的存储。在这两种情况下,确保请求的存储大小适合您要虚拟分割的卷,或者 PVC 无法绑定到大型 PV。如果您使用的存储类使用动态置备的存储,请选择与典型请求大小匹配的分配大小。
  2. 保存文件并退出。
  3. 运行以下命令,使用存储池创建 HPP:

    $ oc create -f hpp_pvc_template_pool.yaml

10.22.3. 创建数据卷

您可以使用 PVC 或存储 API 创建数据卷。

重要

在 OpenShift Container Platform Container Storage 中使用 OpenShift Virtualization 时,指定创建虚拟机磁盘时 RBD 块模式持久性卷声明(PVC)。使用虚拟机磁盘时,RBD 块模式卷更高效,并且比 Ceph FS 或 RBD 文件系统模式 PVC 提供更好的性能。

要指定 RBD 块模式 PVC,请使用 'ocs-storagecluster-ceph-rbd' 存储类和 VolumeMode: Block

提示

在可能的情况下,使用存储 API 来优化空间分配并最大限度地提高性能。

存储配置集是 CDI 管理的自定义资源。它根据关联的存储类提供推荐的存储设置。为每个存储类分配一个存储配置文件。

存储配置集可让您快速创建数据卷,同时减少编码并最大程度减少潜在的错误。

对于可识别的存储类型,CDI 提供优化 PVC 创建的值。但是,如果您自定义存储配置集,您可以为存储类配置自动设置。

10.22.3.1. 关于数据卷

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。您可以将数据卷创建为独立资源,也可以使用虚拟机 (VM) 规格中的 dataVolumeTemplate 字段。

注意
  • 使用独立数据卷准备的虚拟机磁盘 PVC,维护虚拟机的独立生命周期。如果您使用虚拟机规格中的 dataVolumeTemplate 字段准备 PVC,PVC 会共享与虚拟机相同的生命周期。

10.22.3.2. 使用存储 API 创建数据卷

当您使用存储 API 创建数据卷时,Containerized Data Interface(CDI)会根据所选存储类支持的存储类型优化持久性卷声明(PVC)分配。您只需要指定数据卷名称、命名空间和要分配的存储量。

例如:

  • 使用 Ceph RBD 时,accessModes 会自动设置为 ReadWriteMany,这将启用实时迁移。volumeMode 设置为 Block 以最大化性能。
  • 当使用 volumeMode: Filesystem 时,如果需要满足文件系统开销,CDI 将自动请求更多空间。

在以下 YAML 中,使用存储 API 请求具有 2G 可用空间的数据卷。用户不需要知道 volumeMode 就可正确估算所需的持久性卷声明(PVC)大小。CDI 自动选择 accessModesvolumeMode 属性的最佳组合。这些最佳值基于存储类型或您在存储配置文件中定义的默认值。如果要提供自定义值,它们会覆盖系统计算的值。

DataVolume 定义示例

apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: <datavolume> 1
spec:
  source:
    pvc: 2
      namespace: "<source_namespace>" 3
      name: "<my_vm_disk>" 4
  storage: 5
    resources:
      requests:
        storage: 2Gi 6
    storageClassName: <storage_class> 7

1
新数据卷的名称。
2
指明导入的来源是一个现有的持久性卷声明(PVC)。
3
源 PVC 所在的命名空间。
4
源 PVC 的名称。
5
表示使用存储 API 的分配。
6
指定您为 PVC 请求的可用空间量。
7
可选:存储类的名称。如果没有指定存储类,则会使用系统默认存储类。

10.22.3.3. 使用 PVC API 创建数据卷

当使用 PVC API 创建数据卷时,Containerized Data Interface(CDI)会根据您为以下字段指定的内容创建数据卷:

  • accessModesReadWriteOnceReadWriteManyReadOnlyMany
  • volumeModeFilesystemBlock
  • capacity of storage(例如,5Gi

在以下 YAML 中,使用 PVC API 分配存储容量为 2GB 的数据卷。您可以指定 ReadWriteMany 访问模式来启用实时迁移。因为您知道系统可以支持的值,所以可以指定 Block 存储而不是默认的 Filesystem

DataVolume 定义示例

apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: <datavolume> 1
spec:
  source:
    pvc: 2
      namespace: "<source_namespace>" 3
      name: "<my_vm_disk>" 4
  pvc: 5
    accessModes: 6
      - ReadWriteMany
    resources:
      requests:
        storage: 2Gi 7
    volumeMode: Block 8
    storageClassName: <storage_class> 9

1
新数据卷的名称。
2
source 部分中,pvc 表示导入的来源是一个现有的持久性卷声明(PVC)。
3
源 PVC 所在的命名空间。
4
源 PVC 的名称。
5
表示使用 PVC API 的分配。
6
使用 PVC API 时需要 accessModes
7
指定为数据卷请求的空间量。
8
指定目标为一个块 PVC。
9
另外,还可指定存储类。如果没有指定存储类,则会使用系统默认存储类。
重要

当您使用 PVC API 明确分配数据卷且没有使用 volumeMode: Block 时,请考虑文件系统开销。

文件系统开销是文件系统维护其元数据所需的空间量。文件系统元数据所需的空间量取决于文件系统。无法考虑存储容量请求中的文件系统开销会导致底层持久性卷声明(PVC)不足以容纳您的虚拟机磁盘。

如果您使用存储 API,CDI 将包含在文件系统开销中,并请求更大的持久性卷声明(PVC)以确保您的分配请求成功。

10.22.3.4. 自定义存储配置集

您可以通过编辑置备程序存储类的 StorageProfile 对象来指定默认参数。这些默认参数只有在 DataVolume 对象中没有配置持久性卷声明 (PVC) 时才适用。

先决条件

  • 确保存储类及其供应商支持您计划的配置。在存储配置集中指定不兼容的配置会导致卷置备失败。
注意

存储配置文件中的空 status 部分表示存储置备程序不被 Containerized Data Interface(CDI)识别。如果您有一个存储置备程序无法被 CDI 识别,则需要自定义存储配置集。在这种情况下,管理员在存储配置集中设置适当的值以确保分配成功。

警告

如果您创建数据卷并省略 YAML 属性,且存储配置集中没有定义这些属性,则不会分配请求的存储,也不会创建底层持久性卷声明(PVC)。

步骤

  1. 编辑存储配置文件。在本例中,CDI 不支持置备程序:

    $ oc edit -n openshift-cnv storageprofile <storage_class>

    存储配置集示例

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: StorageProfile
    metadata:
      name: <unknown_provisioner_class>
    #   ...
    spec: {}
    status:
      provisioner: <unknown_provisioner>
      storageClass: <unknown_provisioner_class>

  2. 在存储配置集中提供所需的属性值:

    存储配置集示例

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: StorageProfile
    metadata:
      name: <unknown_provisioner_class>
    #   ...
    spec:
      claimPropertySets:
      - accessModes:
        - ReadWriteOnce 1
        volumeMode:
          Filesystem 2
    status:
      provisioner: <unknown_provisioner>
      storageClass: <unknown_provisioner_class>

    1
    您选择的 accessModes
    2
    您选择的 volumeMode

    保存更改后,所选值将显示在存储配置集的 status 项中。

10.22.3.4.1. 使用存储配置集设置默认克隆策略

您可以使用存储配置集为存储类设置默认克隆方法,从而创建 克隆策略。例如,如果您的存储供应商只支持某些克隆方法,设置克隆策略会很有用。它还允许您选择一个限制资源使用或最大化性能的方法。

可以通过将存储配置集中的 cloneStrategy 属性设置为以下值之一来指定克隆策略:

  • snapshot - 在配置快照时默认使用此方法。此克隆策略使用临时卷快照来克隆卷。存储置备程序必须支持 CSI 快照。
  • copy - 此方法使用源 pod 和目标 pod 将数据从源卷复制到目标卷。主机辅助克隆是最有效的克隆方法。
  • csi-clone - 此方法使用 CSI 克隆 API 高效地克隆现有卷,而无需使用临时卷快照。与 snapshotcopy 不同(它们在没有定义存储配置集时被默认使用),只有在 StorageProfile 对象中为置备程序存储类指定它时,才会使用 CSI 卷克隆。
注意

您还可以在不修改 YAML spec 部分中的默认 claimPropertySets 的情况下使用 CLI 设置克隆策略。

存储配置集示例

apiVersion: cdi.kubevirt.io/v1beta1
kind: StorageProfile
metadata:
  name: <provisioner_class>
#   ...
spec:
  claimPropertySets:
  - accessModes:
    - ReadWriteOnce 1
    volumeMode:
      Filesystem 2
  cloneStrategy:
  csi-clone 3
status:
  provisioner: <provisioner>
  storageClass: <provisioner_class>

1
您选择的 accessModes
2
您选择的 volumeMode
3
选择的默认克隆方法。在本例中,指定了 CSI 卷克隆。

10.22.3.5. 其他资源

10.22.4. 为文件系统开销保留 PVC 空间

默认情况下,OpenShift Virtualization 在使用 Filesystem 卷模式的持久性卷声明 (PVC) 中为文件系统开销数据保留空间。您可以设置在全局范围内保留空间的百分比,以及为特定存储类保留空间。

10.22.4.1. 文件系统的开销对虚拟机磁盘空间的影响

当您向使用 Filesystem 卷模式的持久性卷声明(PVC)添加虚拟机磁盘时,必须确保 PVC 中有足够的空间用于:

  • 虚拟机磁盘。
  • 为文件系统开销保留的空间,如元数据

默认情况下,OpenShift Virtualization 为开销保留 5.5% 的 PVC 空间,从而减少了虚拟机磁盘的可用空间。

您可以通过编辑 HCO 对象来配置不同的开销值。您可以在全局范围内更改值,也可以为特定存储类指定值。

10.22.4.2. 覆盖默认文件系统开销值

通过编辑 HCO 对象的 spec.filesystemOverhead 属性来更改 OpenShift Virtualization 为文件系统开销保留的持久性卷声明 (PVC) 空间量。

先决条件

  • 安装 OpenShift CLI (oc) 。

流程

  1. 运行以下命令,打开 HCO 对象进行编辑:

    $ oc edit hco -n openshift-cnv kubevirt-hyperconverged
  2. 编辑 spec.filesystemOverhead 字段,使用您选择的值填充它们:

    ...
    spec:
      filesystemOverhead:
        global: "<new_global_value>" 1
        storageClass:
          <storage_class_name>: "<new_value_for_this_storage_class>" 2
    1
    任何还没有设置值的存储类使用的默认文件系统开销百分比。例如,global: "0.07" 为文件系统开销保留 PVC 的 7%。
    2
    指定存储类的文件系统开销百分比。例如,mystorageclass: "0.04"mystorageclass 存储类中 PVC 的默认开销值改为 4%。
  3. 保存并退出编辑器以更新 HCO 对象。

验证

  • 运行以下命令之一查看 CDIConfig 状态并验证您的更改:

    通常验证 CDIConfig 的更改:

    $ oc get cdiconfig -o yaml

    查看您对 CDIConfig 的具体更改:

    $ oc get cdiconfig -o jsonpath='{.items..status.filesystemOverhead}'

10.22.5. 配置 CDI 以使用具有计算资源配额的命名空间

您可以使用 Containerized Data Importer(CDI)将虚拟机磁盘导入、上传并克隆到命名空间中,这可能受 CPU 和内存资源限制。

10.22.5.1. 关于命名空间中的 CPU 和内存配额

资源配额ResourceQuota 对象定义,对一个命名空间实施限制,该命名空间限制可被该命名空间中资源消耗的计算资源总量。

HyperConverged 自定义资源(CR)定义了 Containerized Data Importer(CDI)的用户配置。CPU 和内存请求和限制值设置为默认值 0。这样可确保由 CDI 创建的无需计算资源要求的 Pod 具有默认值,并允许在使用配额限制的命名空间中运行。

10.22.5.2. 覆盖 CPU 和内存默认值

通过将 spec.resourceRequirements.storageWorkloads 小节添加到 HyperConverged 自定义资源(CR),为您的用例修改 CPU 和内存请求和限值的默认设置。

先决条件

  • 安装 OpenShift CLI (oc) 。

流程

  1. 运行以下命令来编辑 HyperConverged CR:

    $ oc edit hco -n openshift-cnv kubevirt-hyperconverged
  2. spec.resourceRequirements.storageWorkloads 小节添加到 CR,根据您的用例设置值。例如:

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
    spec:
      resourceRequirements:
        storageWorkloads:
          limits:
            cpu: "500m"
            memory: "2Gi"
          requests:
            cpu: "250m"
            memory: "1Gi"
  3. 保存并退出编辑器以更新 HyperConverged CR。

10.22.5.3. 其他资源

10.22.6. 管理数据卷注解

数据卷(DV)注解允许您管理 pod 行为。您可以将一个或多个注解添加到数据卷,然后将其传播到创建的导入程序 pod。

10.22.6.1. 示例:数据卷注解

本例演示了如何配置数据卷(DV)注解来控制 importer pod 使用的网络。v1.multus-cni.io/default-network: bridge-network 注解会导致 pod 使用名为 bridge-network 的 multus 网络作为其默认网络。如果您希望 importer pod 使用集群中的默认网络和从属 multus 网络,请使用 k8s.v1.cni.cncf.io/networks: <network_name> 注解。

Multus 网络注解示例

apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: dv-ann
  annotations:
      v1.multus-cni.io/default-network: bridge-network 1
spec:
  source:
      http:
         url: "example.exampleurl.com"
  pvc:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 1Gi

1
Multus 网络注解

10.22.7. 对数据卷使用预分配

Containerized Data Importer 可以预先分配磁盘空间,以便在创建数据卷时提高写入性能。

您可以为特定数据卷启用预分配。

10.22.7.1. 关于预分配

Containerized Data Importer(CDI)可以使用 QEMU 预先分配数据卷模式来提高写入性能。您可以使用预分配模式导入和上传操作,并在创建空白数据卷时使用。

如果启用了预分配,CDI 根据底层文件系统和设备类型使用更好的预分配方法:

fallocate
如果文件系统支持它,CDI 通过使用 posix_fallocate 功能(它分配块并将其标记为未初始化),来使用操作系统本身的(fallocate 调用来预分配空间。
full
如果无法使用 fallocate 模式,则会使用 full 模式通过将数据写入底层存储来为镜像分配空间。根据存储位置,所有空分配的空间都可能会为零。

10.22.7.2. 为数据卷启用预分配

您可以通过在数据卷清单中包含 spec.preallocation 字段来为特定数据卷启用预分配。您可以在 web 控制台中或使用 OpenShift CLI (oc) 启用预分配模式。

所有 CDI 源类型都支持 Preallocation 模式。

流程

  • 指定数据卷清单中的 spec.preallocation 字段:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: DataVolume
    metadata:
      name: preallocated-datavolume
    spec:
      source: 1
        ...
      pvc:
        ...
      preallocation: true 2
    1
    所有 CDI 源类型支持预分配,但在克隆操作中会忽略预分配。
    2
    preallocation 字段是一个布尔值,默认值为 false。

10.22.8. 使用 Web 控制台上传本地磁盘镜像

您可以使用 web 控制台上传本地存储的磁盘镜像文件。

10.22.8.1. 先决条件

10.22.8.2. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt (QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

10.22.8.3. 使用 Web 控制台上传镜像文件

使用 Web 控制台将镜像文件上传到新持久性卷声明(PVC)。之后,您可以使用此 PVC 将镜像附加到新虚拟机。

先决条件

  • 您必须有以下之一:

    • 原始虚拟机镜像文件,可以是 ISO 或 IMG 格式。
    • 虚拟机镜像文件(QCOW2 格式)。
  • 要获得最佳结果,先根据以下方法压缩您的镜像文件:

    • 使用 xzgzip 压缩原始映像文件。

      注意

      使用压缩的原始镜像文件的上传效果最佳。

    • 使用为您的客户端推荐的方法压缩 QCOW2 镜像文件:

      • 如果使用 Linux 客户端,使用 virt-sparsify 工具对 QCOW2 文件进行 sparsify
      • 如果您使用 Windows 客户端。使用 xz 或者 gzip 压缩 QCOW2 文件。

流程

  1. 在 web 控制台的侧边菜单中点击 StoragePersistent Volume Claims
  2. Create Persistent Volume Claim 下拉列表展开它。
  3. With Data Upload Form 打开 Upload Data to Persistent Volume Claim 页面。
  4. Browse 打开文件管理器并选择要上传的镜像,或者将文件拖到 Drag a file here or browse to upload 项中。
  5. 可选:将此镜像设置为特定操作系统的默认镜像。

    1. 选择 Attach this data to a virtual machine operating system 复选框。
    2. 从列表中选择一个操作系统。
  6. Persistent Volume Claim Name 字段自动填充唯一名称,且无法编辑。记录分配给 PVC 的名称,以便以后根据需要指定它。
  7. Storage Class 列表中选择存储类。
  8. Size 字段中输入 PVC 的大小值。从下拉列表中选择对应的度量单位。

    警告

    PVC 大小必须大于未压缩的虚拟磁盘的大小。

  9. 选择与您选择的存储类匹配的 Access Mode
  10. Upload

10.22.8.4. 其他资源

10.22.9. 使用 virtctl 工具上传本地磁盘镜像

您可使用 virtctl 命令行实用程序将本地存储的磁盘镜像上传到新的或已有的数据卷中。

10.22.9.1. 先决条件

10.22.9.2. 关于数据卷

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。您可以将数据卷创建为独立资源,也可以使用虚拟机 (VM) 规格中的 dataVolumeTemplate 字段。

注意
  • 使用独立数据卷准备的虚拟机磁盘 PVC,维护虚拟机的独立生命周期。如果您使用虚拟机规格中的 dataVolumeTemplate 字段准备 PVC,PVC 会共享与虚拟机相同的生命周期。

10.22.9.3. 创建上传数据卷

您可以使用 upload 数据源手动创建数据源,用于上传本地磁盘镜像。

流程

  1. 创建指定 spec: source: upload{} 的数据卷配置:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: DataVolume
    metadata:
      name: <upload-datavolume> 1
    spec:
      source:
          upload: {}
      pvc:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi> 2
    1
    数据卷的名称。
    2
    数据卷的大小。请确定这个值大于或等于您要上传的磁盘的大小。
  2. 运行以下命令来创建数据卷:

    $ oc create -f <upload-datavolume>.yaml

10.22.9.4. 上传本地磁盘镜像至数据卷

您可使用 virtctl CLI 实用程序将客户端机器中的本地磁盘镜像上传到集群中的数据卷(DV)。您可以使用集群中已存在的 DV,也可以在此过程中创建新的 DV。

注意

上传本地磁盘镜像后,您可将其添加到虚拟机中。

先决条件

  • 您必须有以下之一:

    • 原始虚拟机镜像文件,可以是 ISO 或 IMG 格式。
    • 虚拟机镜像文件(QCOW2 格式)。
  • 要获得最佳结果,先根据以下方法压缩您的镜像文件:

    • 使用 xzgzip 压缩原始映像文件。

      注意

      使用压缩的原始镜像文件的上传效果最佳。

    • 使用为您的客户端推荐的方法压缩 QCOW2 镜像文件:

      • 如果使用 Linux 客户端,使用 virt-sparsify 工具对 QCOW2 文件进行 sparsify
      • 如果您使用 Windows 客户端。使用 xz 或者 gzip 压缩 QCOW2 文件。
  • kubevirt-virtctl 软件包必须安装在客户端机器上。
  • 客户端机器必须配置为信任 OpenShift Container Platform 路由器的证书。

流程

  1. 确定以下各项:

    • 要使用的上传数据卷的名称。如果这个数据卷不存在,则会自动创建。
    • 在上传过程中创建数据卷的大小。大小必须大于或等于磁盘镜像的大小。
    • 要上传的虚拟机磁盘镜像的文件位置。
  2. 运行 virtctl image-upload 命令上传磁盘镜像。指定您在上一步中获得的参数。例如:

    $ virtctl image-upload dv <datavolume_name> \ 1
    --size=<datavolume_size> \ 2
    --image-path=</path/to/image> \ 3
    1
    数据卷的名称。
    2
    数据卷的大小。例如: --size=500Mi, --size=1G
    3
    虚拟机磁盘镜像的文件路径。
    注意
    • 如果您不想创建新数据卷,请省略 --size 参数,并包含 --no-create 标志。
    • 将磁盘镜像上传到 PVC 时,PVC 大小必须大于未压缩的虚拟磁盘的大小。
    • 若要在使用 HTTPS 时允许不安全的服务器连接,请使用 --insecure 参数。注意,在使用 --insecure 标志时,不会验证上传端点的真实性。
  3. 可选。要验证数据卷是否已创建,运行以下命令来查看所有数据卷:

    $ oc get dvs

10.22.9.5. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt (QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

10.22.9.6. 其他资源

10.22.10. 上传本地磁盘镜像至块存储数据卷

您可以使用 virtctl 命令行实用程序将本地磁盘镜像上传到块数据卷中。

在此工作流中,您会创建一个本地块设备用作 PV,将此块卷与 upload 数据卷关联,并使用 virtctl 将本地磁盘镜像上传至数据卷中。

10.22.10.1. 先决条件

10.22.10.2. 关于数据卷

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。您可以将数据卷创建为独立资源,也可以使用虚拟机 (VM) 规格中的 dataVolumeTemplate 字段。

注意
  • 使用独立数据卷准备的虚拟机磁盘 PVC,维护虚拟机的独立生命周期。如果您使用虚拟机规格中的 dataVolumeTemplate 字段准备 PVC,PVC 会共享与虚拟机相同的生命周期。

10.22.10.3. 关于块持久性卷

块持久性卷(PV)是一个受原始块设备支持的 PV。这些卷没有文件系统,可以通过降低开销来为虚拟机提供性能优势。

原始块卷可以通过在 PV 和持久性卷声明(PVC)规格中指定 volumeMode: Block 来置备。

10.22.10.4. 创建本地块持久性卷

通过填充文件并将其挂载为循环设备,在节点上创建本地块持久性卷(PV)。然后,您可以在 PV 清单中将该循环设备作为 Block(块)卷引用,并将其用作虚拟机镜像的块设备。

流程

  1. root 身份登录节点,在其上创建本地 PV。本流程以 node01 为例。
  2. 创建一个文件并用空字符填充,以便可将其用作块设备。以下示例创建 loop10 文件,大小为 2Gb(20,100 Mb 块):

    $ dd if=/dev/zero of=<loop10> bs=100M count=20
  3. loop10 文件挂载为 loop 设备。

    $ losetup </dev/loop10>d3 <loop10> 1 2
    1
    挂载 loop 设备的文件路径。
    2
    上一步中创建的文件,挂载为 loop 设备。
  4. 创建引用所挂载 loop 设备的 PersistentVolume 清单。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <local-block-pv10>
      annotations:
    spec:
      local:
        path: </dev/loop10> 1
      capacity:
        storage: <2Gi>
      volumeMode: Block 2
      storageClassName: local 3
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - <node01> 4
    1
    节点上的 loop 设备路径。
    2
    将其指定为块 PV。
    3
    可选:为 PV 设置存储类。如果省略此项,将使用默认集群。
    4
    挂载块设备的节点。
  5. 创建块 PV。

    # oc create -f <local-block-pv10.yaml>1
    1
    上一步中创建的持久性卷的文件名。

10.22.10.5. 创建上传数据卷

您可以使用 upload 数据源手动创建数据源,用于上传本地磁盘镜像。

流程

  1. 创建指定 spec: source: upload{} 的数据卷配置:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: DataVolume
    metadata:
      name: <upload-datavolume> 1
    spec:
      source:
          upload: {}
      pvc:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi> 2
    1
    数据卷的名称。
    2
    数据卷的大小。请确定这个值大于或等于您要上传的磁盘的大小。
  2. 运行以下命令来创建数据卷:

    $ oc create -f <upload-datavolume>.yaml

10.22.10.6. 上传本地磁盘镜像至数据卷

您可使用 virtctl CLI 实用程序将客户端机器中的本地磁盘镜像上传到集群中的数据卷(DV)。您可以使用集群中已存在的 DV,也可以在此过程中创建新的 DV。

注意

上传本地磁盘镜像后,您可将其添加到虚拟机中。

先决条件

  • 您必须有以下之一:

    • 原始虚拟机镜像文件,可以是 ISO 或 IMG 格式。
    • 虚拟机镜像文件(QCOW2 格式)。
  • 要获得最佳结果,先根据以下方法压缩您的镜像文件:

    • 使用 xzgzip 压缩原始映像文件。

      注意

      使用压缩的原始镜像文件的上传效果最佳。

    • 使用为您的客户端推荐的方法压缩 QCOW2 镜像文件:

      • 如果使用 Linux 客户端,使用 virt-sparsify 工具对 QCOW2 文件进行 sparsify
      • 如果您使用 Windows 客户端。使用 xz 或者 gzip 压缩 QCOW2 文件。
  • kubevirt-virtctl 软件包必须安装在客户端机器上。
  • 客户端机器必须配置为信任 OpenShift Container Platform 路由器的证书。

流程

  1. 确定以下各项:

    • 要使用的上传数据卷的名称。如果这个数据卷不存在,则会自动创建。
    • 在上传过程中创建数据卷的大小。大小必须大于或等于磁盘镜像的大小。
    • 要上传的虚拟机磁盘镜像的文件位置。
  2. 运行 virtctl image-upload 命令上传磁盘镜像。指定您在上一步中获得的参数。例如:

    $ virtctl image-upload dv <datavolume_name> \ 1
    --size=<datavolume_size> \ 2
    --image-path=</path/to/image> \ 3
    1
    数据卷的名称。
    2
    数据卷的大小。例如: --size=500Mi, --size=1G
    3
    虚拟机磁盘镜像的文件路径。
    注意
    • 如果您不想创建新数据卷,请省略 --size 参数,并包含 --no-create 标志。
    • 将磁盘镜像上传到 PVC 时,PVC 大小必须大于未压缩的虚拟磁盘的大小。
    • 若要在使用 HTTPS 时允许不安全的服务器连接,请使用 --insecure 参数。注意,在使用 --insecure 标志时,不会验证上传端点的真实性。
  3. 可选。要验证数据卷是否已创建,运行以下命令来查看所有数据卷:

    $ oc get dvs

10.22.10.7. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt (QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

10.22.10.8. 其他资源

10.22.11. 管理虚拟机快照

您可以为虚拟机创建和删除虚拟机快照,无论是关闭(离线)还是(在线)虚拟机。您只能恢复到已关机(脱机)虚拟机。OpenShift Virtualization 支持以下虚拟机快照:

  • Red Hat OpenShift Data Foundation
  • 使用支持 Kubernetes 卷快照 API 的 Container Storage Interface(CSI)驱动程序的任何其他云存储供应商

在线快照的默认时间期限为五分钟(5m),可根据需要进行更改。

重要

具有热插虚拟磁盘的虚拟机支持在线快照。但是,没有在虚拟机规格中的热插磁盘不会包含在快照中。

注意

要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。

QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。

10.22.11.1. 关于虚拟机快照

快照 代表虚拟机(VM)在特定时间点的状态和数据。您可以使用快照将现有虚拟机恢复到以前的状态(由快照代表)进行备份和恢复,或者快速回滚到以前的开发版本。

虚拟机快照从关机(停止状态)或 powred on(Running 状态)上的虚拟机创建。

在为正在运行的虚拟机执行快照时,控制器将检查 QEMU 客户机代理是否已安装并在运行。如果是这样,它会在拍摄快照前冻结虚拟机文件系统,并在拍摄快照后修改文件系统。

快照存储附加到虚拟机的每个 Container Storage Interface(CSI)卷的副本以及虚拟机规格和元数据的副本。创建后无法更改快照。

借助 VM 快照功能,集群管理员和应用程序开发人员可以:

  • 创建新快照
  • 列出附加到特定虚拟机的所有快照
  • 从快照恢复虚拟机
  • 删除现有虚拟机快照
10.22.11.1.1. 虚拟机快照控制器和自定义资源定义(CRD)

VM 快照功能引入了三个新的 API 对象,定义为 CRD,用于管理快照:

  • VirtualMachineSnapshot:代表创建快照的用户请求。它包含有关虚拟机当前状态的信息。
  • VirtualMachineSnapshotContent:代表集群中置备的资源(快照)。它由虚拟机快照控制器创建,其中包含恢复虚拟机所需的所有资源的引用。
  • VirtualMachineRestore:代表从快照中恢复虚拟机的用户请求。

VM 快照控制器会把一个 VirtualMachineSnapshotContent 对象与创建它的 VirtualMachineSnapshotContent 对象绑定,并具有一对一的映射。

10.22.11.2. 在 Linux 虚拟机上安装 QEMU 客户机代理

qemu-guest-agent 广泛可用,默认在红帽虚拟机中可用。安装代理并启动服务。

要检查您的虚拟机 (VM) 是否已安装并运行 QEMU 客户机代理,请验证 AgentConnected 是否列在 VM spec 中。

注意

要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。

QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。

流程

  1. 通过其中一个控制台或通过 SSH 访问虚拟机命令行。
  2. 在虚拟机上安装 QEMU 客户机代理:

    $ yum install -y qemu-guest-agent
  3. 确保服务持久并启动它:

    $ systemctl enable --now qemu-guest-agent

10.22.11.3. 在 Windows 虚拟机上安装 QEMU 客户机代理

对于 Windows 虚拟机,QEMU 客户机代理包含在 VirtIO 驱动程序中。在现有或者新的 Windows 安装上安装驱动程序。

要检查您的虚拟机 (VM) 是否已安装并运行 QEMU 客户机代理,请验证 AgentConnected 是否列在 VM spec 中。

注意

要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。

QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。

10.22.11.3.1. 在现有 Windows 虚拟机上安装 VirtIO 驱动程序

从附加的 SATA CD 驱动器将 VirtIO 驱动程序安装到现有 Windows 虚拟机。

注意

该流程使用通用方法为 Windows 添加驱动。具体流程可能会因 Windows 版本而稍有差异。有关具体安装步骤,请参阅您的 Windows 版本安装文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 登录 Windows 用户会话。
  3. 打开 Device Manager 并展开 Other devices 以列出所有 Unknown device

    1. 打开 Device Properties 以识别未知设备。右击设备并选择 Properties
    2. 单击 Details 选项卡,并在 Property 列表中选择 Hardware Ids
    3. Hardware IdsValue 与受支持的 VirtIO 驱动程序相比较。
  4. 右击设备并选择 Update Driver Software
  5. 点击 Browse my computer for driver software 并浏览所附加的 VirtIO 驱动程序所在 SATA CD 驱动器。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 点击 Next 以安装驱动程序。
  7. 对所有必要 VirtIO 驱动程序重复这一过程。
  8. 安装完驱动程序后,点击 Close 关闭窗口。
  9. 重启虚拟机以完成驱动程序安装。
10.22.11.3.2. 在 Windows 安装过程中安装 VirtIO 驱动程序

在 Windows 安装过程中,从附加的 SATA CD 驱动程序安装 VirtIO 驱动程序。

注意

该流程使用通用方法安装 Windows,且安装方法可能因 Windows 版本而异。有关您要安装的 Windows 版本,请参阅相关文档。

步骤

  1. 启动虚拟机并连接至图形控制台。
  2. 开始 Windows 安装过程。
  3. 选择 Advanced 安装。
  4. 加载驱动程序前无法识别存储目的地。点击 Load driver
  5. 驱动程序将附加为 SATA CD 驱动器。点击 OK 并浏览 CD 驱动器以加载存储驱动程序。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 对所有所需驱动程序重复前面两步。
  7. 完成 Windows 安装。

10.22.11.4. 在 web 控制台中创建虚拟机快照

您可以使用 web 控制台创建虚拟机(VM)快照。

注意

要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。

QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。

VM 快照只包含满足以下要求的磁盘:

  • 必须是数据卷或持久性卷声明
  • 属于支持容器存储接口(CSI)卷快照的存储类

步骤

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. 如果虚拟机正在运行,点 ActionsStop 关闭它。
  4. Snapshots 标签页,然后点 Take Snapshot
  5. 填写 Snapshot Name 和可选的 Description 字段。
  6. 扩展 Disks included in this Snapshot 以查看快照中包含的存储卷。
  7. 如果您的虚拟机磁盘无法包含在快照中,并且您仍然希望继续,请选择 I am aware of this warning and wish to proceed 复选框。
  8. 点击 Save

10.22.11.5. 通过 CLI 创建虚拟机快照

您可以通过创建一个 VirtualMachineSnapshot 对象来为离线或在线虚拟机创建虚拟机快照。kubevirt 与 QEMU 客户机代理协调,以创建在线虚拟机的快照。

注意

要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。

QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。

先决条件

  • 确保持久性卷声明(PVC)位于支持 Container Storage Interface(CSI)卷快照的存储类中。
  • 安装 OpenShift CLI (oc) 。
  • 可选:关闭您要为其创建快照的虚拟机。

步骤

  1. 创建一个 YAML 文件来定义 VirtualMachineSnapshot 对象,以指定新 VirtualMachineSnapshot 的名称和源虚拟机的名称。

    例如:

    apiVersion: snapshot.kubevirt.io/v1alpha1
    kind: VirtualMachineSnapshot
    metadata:
      name: my-vmsnapshot 1
    spec:
      source:
        apiGroup: kubevirt.io
        kind: VirtualMachine
        name: my-vm 2
    1
    新的 VirtualMachineSnapshot 对象的名称。
    2
    源虚拟机的名称。
  2. 创建 VirtualMachineSnapshot 资源。快照控制器会创建一个 VirtualMachineSnapshotContent 对象,将其绑定到 VirtualMachineSnapshot 并更新 VirtualMachineSnapshot 对象的 statusreadyToUse 字段。

    $ oc create -f <my-vmsnapshot>.yaml
  3. 可选: 如果要执行在线快照,您可以使用 wait 命令并监控快照的状态:

    1. 输入以下命令:

      $ oc wait my-vm my-vmsnapshot --for condition=Ready
    2. 验证快照的状态:

      • InProgress - 在线快照操作仍在进行中。
      • succeeded - 在线快照操作成功完成。
      • Failed - 在线快照操作失败。

        注意

        在线快照的默认时间期限为五分钟(5m)。如果快照在五分钟内没有成功完成,其状态将设为 failed。之后,文件系统将被”解冻”,虚拟机将取消冻结,但状态会一直 failed,直到您删除失败的快照镜像。

        要更改默认时间期限,在 VM 快照 spec 中添加 FailureDeadline 属性,指定在快照超时前的时间,以分钟(m)或秒(s)为单位。

        要设置截止时间,您可以指定 0,但通常不建议这样做,因为它可能会导致虚拟机没有响应。

        如果您没有指定时间单位,如 ms,则默认为 秒(s)。

验证

  1. 验证 VirtualMachineSnapshot 对象是否已创建并绑定到 VirtualMachineSnapshotContentreadyToUse 标志必须设为 true

    $ oc describe vmsnapshot <my-vmsnapshot>

    输出示例

    apiVersion: snapshot.kubevirt.io/v1alpha1
    kind: VirtualMachineSnapshot
    metadata:
      creationTimestamp: "2020-09-30T14:41:51Z"
      finalizers:
      - snapshot.kubevirt.io/vmsnapshot-protection
      generation: 5
      name: mysnap
      namespace: default
      resourceVersion: "3897"
      selfLink: /apis/snapshot.kubevirt.io/v1alpha1/namespaces/default/virtualmachinesnapshots/my-vmsnapshot
      uid: 28eedf08-5d6a-42c1-969c-2eda58e2a78d
    spec:
      source:
        apiGroup: kubevirt.io
        kind: VirtualMachine
        name: my-vm
    status:
      conditions:
      - lastProbeTime: null
        lastTransitionTime: "2020-09-30T14:42:03Z"
        reason: Operation complete
        status: "False" 1
        type: Progressing
      - lastProbeTime: null
        lastTransitionTime: "2020-09-30T14:42:03Z"
        reason: Operation complete
        status: "True" 2
        type: Ready
      creationTime: "2020-09-30T14:42:03Z"
      readyToUse: true 3
      sourceUID: 355897f3-73a0-4ec4-83d3-3c2df9486f4f
      virtualMachineSnapshotContentName: vmsnapshot-content-28eedf08-5d6a-42c1-969c-2eda58e2a78d 4

    1
    Progressingstatus 字段指定快照是否仍然在创建。
    2
    Ready 条件的 status 字段指定快照创建过程是否完成。
    3
    指定快照是否准备就绪可用被使用。
    4
    指定快照被绑定到快照控制器创建的 VirtualMachineSnapshotContent 对象。
  2. 检查 VirtualMachineSnapshotContent 资源的 spec:volumeBackups 属性,以验证快照中包含了预期的 PVC。

10.22.11.6. 使用快照声明验证在线快照创建

快照表示是有关在线虚拟机 (VM) 快照操作的上下文信息。对于离线虚拟机 (VM) 快照操作,提示不可用。暗示有助于描述在线快照创建的详细信息。

先决条件

  • 要查看提示信息,您必须已尝试使用 CLI 或 Web 控制台创建在线虚拟机快照。

步骤

  1. 通过执行以下操作之一来显示快照的输出:

    • 对于使用 CLI 创建的快照,请查看 VirtualMachineSnapshot 对象 YAML 中的 status 字段中的指示器输出。
    • 对于使用 Web 控制台创建的快照,请点击 Snapshot details 屏幕中的 VirtualMachineSnapshot > Status
  2. 验证在线虚拟机快照的状态:

    • Online 代表虚拟机在在线快照创建期间运行。
    • NoGuestAgent 表示 QEMU 客户机代理在在线快照创建过程中没有运行。QEMU 客户机代理无法用于冻结和构建文件系统,要么因为 QEMU 客户机代理尚未安装或正在运行,要么是因为另一个错误。

10.22.11.7. 在 web 控制台中从快照中恢复虚拟机

您可以将虚拟机(VM)恢复到 web 控制台中由快照表示的以前的配置。

步骤

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. 如果虚拟机正在运行,点 ActionsStop 关闭它。
  4. Snapshots 标签页。该页面显示与虚拟机关联的快照列表。
  5. 选择以下方法之一恢复虚拟机快照:

    1. 对于您要用作恢复虚拟机的源的快照,点 Restore
    2. 选择快照以打开 Snapshot Details 屏幕,然后点 ActionsRestore VirtualMachineSnapshot
  6. 在确认弹出窗口中,点 Restore 可将虚拟机恢复到快照代表的以前的配置中。

10.22.11.8. 通过 CLI 从快照中恢复虚拟机

您可以使用虚拟机快照将现有虚拟机 (VM) 恢复到以前的配置。您只能从离线虚拟机快照中恢复。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 关闭您要恢复到之前状态的虚拟机。

流程

  1. 创建一个 YAML 文件来定义 VirtualMachineRestore 对象,它指定您要恢复的虚拟机的名称以及要用作源的快照名称。

    例如:

    apiVersion: snapshot.kubevirt.io/v1alpha1
    kind: VirtualMachineRestore
    metadata:
      name: my-vmrestore 1
    spec:
      target:
        apiGroup: kubevirt.io
        kind: VirtualMachine
        name: my-vm 2
      virtualMachineSnapshotName: my-vmsnapshot 3
    1
    VirtualMachineRestore 对象的名称。
    2
    要恢复的目标虚拟机的名称。
    3
    作为源的 VirtualMachineSnapshot 对象的名称。
  2. 创建 VirtualMachineRestore 资源。快照控制器更新了 VirtualMachineRestore 对象的 status 字段,并将现有虚拟机配置替换为快照内容。

    $ oc create -f <my-vmrestore>.yaml

验证

  • 验证虚拟机是否已恢复到快照代表的以前的状态。complete 标志需要被设置为 true

    $ oc get vmrestore <my-vmrestore>

    输出示例

    apiVersion: snapshot.kubevirt.io/v1alpha1
    kind: VirtualMachineRestore
    metadata:
    creationTimestamp: "2020-09-30T14:46:27Z"
    generation: 5
    name: my-vmrestore
    namespace: default
    ownerReferences:
    - apiVersion: kubevirt.io/v1
      blockOwnerDeletion: true
      controller: true
      kind: VirtualMachine
      name: my-vm
      uid: 355897f3-73a0-4ec4-83d3-3c2df9486f4f
      resourceVersion: "5512"
      selfLink: /apis/snapshot.kubevirt.io/v1alpha1/namespaces/default/virtualmachinerestores/my-vmrestore
      uid: 71c679a8-136e-46b0-b9b5-f57175a6a041
      spec:
        target:
          apiGroup: kubevirt.io
          kind: VirtualMachine
          name: my-vm
      virtualMachineSnapshotName: my-vmsnapshot
      status:
      complete: true 1
      conditions:
      - lastProbeTime: null
      lastTransitionTime: "2020-09-30T14:46:28Z"
      reason: Operation complete
      status: "False" 2
      type: Progressing
      - lastProbeTime: null
      lastTransitionTime: "2020-09-30T14:46:28Z"
      reason: Operation complete
      status: "True" 3
      type: Ready
      deletedDataVolumes:
      - test-dv1
      restoreTime: "2020-09-30T14:46:28Z"
      restores:
      - dataVolumeName: restore-71c679a8-136e-46b0-b9b5-f57175a6a041-datavolumedisk1
      persistentVolumeClaim: restore-71c679a8-136e-46b0-b9b5-f57175a6a041-datavolumedisk1
      volumeName: datavolumedisk1
      volumeSnapshotName: vmsnapshot-28eedf08-5d6a-42c1-969c-2eda58e2a78d-volume-datavolumedisk1

    1
    指定将虚拟机恢复到快照代表的状态的进程是否已完成。
    2
    Progressing 条件的 status 字段指定 VM 是否仍然被恢复。
    3
    Ready 条件的 status 字段指定 VM 恢复过程是否完成。

10.22.11.9. 删除 web 控制台中的虚拟机快照

您可以使用 web 控制台删除现有虚拟机快照。

步骤

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. Snapshots 标签页。该页面显示与虚拟机关联的快照列表。
  4. 点您要删除的虚拟机快照 kebab 的 Options 菜单,然后选择 Delete Virtual Machine Snapshot
  5. 在确认弹出窗口中点 Delete 删除快照。

10.22.11.10. 通过 CLI 删除虚拟机快照

您可以通过删除正确的 VirtualMachineSnapshot 对象来删除现有虚拟机(VM)快照。

先决条件

  • 安装 OpenShift CLI (oc) 。

流程

  • 删除 VirtualMachineSnapshot 对象。快照控制器会删除 VirtualMachineSnapshot 和关联的 VirtualMachineSnapshotContent 对象。

    $ oc delete vmsnapshot <my-vmsnapshot>

验证

  • 验证快照是否已删除,且不再附加到此虚拟机:

    $ oc get vmsnapshot

10.22.11.11. 其他资源

10.22.12. 将本地虚拟机磁盘移动到不同的节点中

使用本地卷存储的虚拟机可被移动,以便在特定节点中运行。

因为以下原因,您可能想要将该虚拟机移动到特定的节点上:

  • 当前节点对本地存储配置有限制。
  • 新节点对那个虚拟机的工作负载进行了更好的优化。

要移动使用本地存储的虚拟机,您必须使用数据卷克隆基础卷。克隆操作完成后,您可以 编辑虚拟机配置,以便使用新数据卷,或 将新数据卷添加到其他虚拟机

提示

当您全局启用预分配或单个数据卷时,Containerized Data Importer(CDI)会在克隆过程中预分配磁盘空间。预分配可提高写入性能。如需更多信息,请参阅对数据卷使用预分配

注意

没有 cluster-admin 角色的用户需要额外的用户权限才能在 命名空间间克隆卷。

10.22.12.1. 克隆本地卷到另一个节点

您可以通过克隆底层 PVC,移动虚拟机磁盘使其在特定节点上运行。

要确保虚拟机磁盘克隆到正确的节点,您必须创建新的持久性卷(PV)或在正确的节点上识别它。对 PV 应用一个唯一标签,以便数据卷可以引用它。

注意

目标 PV 的大小不得小于源 PVC。如果目标 PV 小于源 PVC,克隆操作会失败。

先决条件

  • 虚拟机不能正在运行。在克隆虚拟机磁盘前关闭虚拟机。

流程

  1. 在节点上创建新本地 PV,或使用已有的本地 PV:

    • 创建包含 nodeAffinity.nodeSelectorTerms 参数的本地 PV。以下 manifest 在 node01 上创建了一个 10Gi 的本地 PV。

      kind: PersistentVolume
      apiVersion: v1
      metadata:
        name: <destination-pv> 1
        annotations:
      spec:
        accessModes:
        - ReadWriteOnce
        capacity:
          storage: 10Gi 2
        local:
          path: /mnt/local-storage/local/disk1 3
        nodeAffinity:
          required:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - node01 4
        persistentVolumeReclaimPolicy: Delete
        storageClassName: local
        volumeMode: Filesystem
      1
      PV 的名称。
      2
      PV 的大小。您必须分配足够空间,否则克隆操作会失败。其大小不得低于源 PVC。
      3
      节点上的挂载路径。
      4
      要创建 PV 的节点的名称。
    • 已存在于节点上的一个 PV。您可以通过查看其配置中的 nodeAffinity 字段来标识置备 PV 的节点:

      $ oc get pv <destination-pv> -o yaml

      以下输出显示 PV 位于 node01:

      输出示例

      ...
      spec:
        nodeAffinity:
          required:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname 1
                operator: In
                values:
                - node01 2
      ...

      1
      Kubernetes.io/hostname 使用节点主机名来选择节点。
      2
      节点的主机名。
  2. 为 PV 添加唯一标签:

    $ oc label pv <destination-pv> node=node01
  3. 创建引用以下内容的数据卷清单:

    • 虚拟机的 PVC 名称和命名空间。
    • 应用上一步中的 PV 标签。
    • 目标 PV 的大小。

      apiVersion: cdi.kubevirt.io/v1beta1
      kind: DataVolume
      metadata:
        name: <clone-datavolume> 1
      spec:
        source:
          pvc:
            name: "<source-vm-disk>" 2
            namespace: "<source-namespace>" 3
        pvc:
          accessModes:
            - ReadWriteOnce
          selector:
            matchLabels:
              node: node01 4
          resources:
            requests:
              storage: <10Gi> 5
      1
      新数据卷的名称。
      2
      源 PVC 的名称。如果您不知道 PVC 名称,您可以在虚拟机配置中找到它: spec.volumes.persistentVolumeClaim.claimName
      3
      源 PVC 所在的命名空间。
      4
      应用于上一步中 PV 的标签。
      5
      目标 PV 的大小。
  4. 通过将数据卷清单应用到集群来开始克隆操作:

    $ oc apply -f <clone-datavolume.yaml>

数据卷将虚拟机的 PVC 克隆到特定节点上的 PV 中。

10.22.13. 通过添加空白磁盘镜像扩展虚拟存储

您可向 OpenShift Virtualization 添加空白磁盘镜像来提高存储容量或创建新数据分区。

10.22.13.1. 关于数据卷

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。您可以将数据卷创建为独立资源,也可以使用虚拟机 (VM) 规格中的 dataVolumeTemplate 字段。

注意
  • 使用独立数据卷准备的虚拟机磁盘 PVC,维护虚拟机的独立生命周期。如果您使用虚拟机规格中的 dataVolumeTemplate 字段准备 PVC,PVC 会共享与虚拟机相同的生命周期。

10.22.13.2. 使用数据卷创建空白磁盘镜像

您可以通过自定义和部署数据卷配置文件在持久性卷声明中创建新空白磁盘镜像。

先决条件

  • 至少一个可用持久性卷。
  • 安装 OpenShift CLI(oc)。

步骤

  1. 编辑 DataVolume 清单:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: DataVolume
    metadata:
      name: blank-image-datavolume
    spec:
      source:
          blank: {}
      pvc:
        # Optional: Set the storage class or omit to accept the default
        # storageClassName: "hostpath"
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 500Mi
  2. 运行以下命令,创建空白磁盘镜像:

    $ oc create -f <blank-image-datavolume>.yaml

10.22.13.3. 其他资源

10.22.14. 使用 smart-cloning(智能克隆) 克隆数据卷

Smart-cloning(智能克隆)是 Red Hat OpenShift Data Foundation 的内置功能。与主机辅助克隆相比,智能克隆速度更快、效率更高。

您不需要执行任何操作来启用智能克隆功能,但需要确保您的存储环境与智能克隆兼容。

使用持久性卷声明(PVC)源创建数据卷时,会自动启动克隆过程。如果您的环境支持智能克隆,则始终会收到数据卷的克隆。但是,只有存储供应商支持智能克隆时,才会获得智能克隆的性能优势。

10.22.14.1. 关于数据卷

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。您可以将数据卷创建为独立资源,也可以使用虚拟机 (VM) 规格中的 dataVolumeTemplate 字段。

注意
  • 使用独立数据卷准备的虚拟机磁盘 PVC,维护虚拟机的独立生命周期。如果您使用虚拟机规格中的 dataVolumeTemplate 字段准备 PVC,PVC 会共享与虚拟机相同的生命周期。

10.22.14.2. 关于智能克隆

当一个数据卷被智能克隆时,会出现以下情况:

  1. 创建源持久性卷声明(PVC)的快照。
  2. 从快照创建一个 PVC。
  3. 快照被删除。

10.22.14.3. 克隆数据卷

先决条件

要实现智能克隆,需要满足以下条件:

  • 您的存储供应商必须支持快照。
  • 源和目标 PVC 必须定义为相同的存储类。
  • 源和目标 PVC 共享相同的 volumeMode
  • VolumeSnapshotClass 对象必须引用定义为源和目标 PVC 的存储类。

步骤

启动数据卷克隆:

  1. DataVolume 对象创建一个 YAML 文件,用于指定新数据卷的名称以及源 PVC 的名称和命名空间。在这个示例中,因为指定了 storage API,因此不需要指定 accessModesvolumeMode。将自动为您计算最佳值。

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: DataVolume
    metadata:
      name: <cloner-datavolume> 1
    spec:
      source:
        pvc:
          namespace: "<source-namespace>" 2
          name: "<my-favorite-vm-disk>" 3
      storage: 4
        resources:
          requests:
            storage: <2Gi> 5
    1
    新数据卷的名称。
    2
    源 PVC 所在的命名空间。
    3
    源 PVC 的名称。
    4
    使用 storage API 指定分配
    5
    新数据卷的大小。
  2. 通过创建数据卷开始克隆 PVC:

    $ oc create -f <cloner-datavolume>.yaml
    注意

    在 PVC 就绪前,DataVolume 会阻止虚拟机启动,以便您可以在 PVC 克隆期间创建引用新数据卷的虚拟机。

10.22.14.4. 其他资源

10.22.15. 创建并使用引导源

引导源包含可引导操作系统(OS)以及操作系统的所有配置设置,如驱动程序。

您可以使用引导源创建带有特定配置的虚拟机模板。这些模板可用于创建任意数量的可用虚拟机。

OpenShift Container Platform Web 控制台提供了快速入门导览,可帮助您创建自定义引导源、上传引导源和其他任务。从 Help 菜单中选择 Quick Starts 以查看快速入门。

10.22.15.1. 关于虚拟机和引导源

虚拟机由虚拟机定义以及由数据卷支持的一个或多个磁盘组成。虚拟机模板允许您使用预定义的虚拟机规格创建虚拟机。

每个虚拟机模板都需要一个引导源,它是一个完全配置的虚拟机磁盘镜像,包括配置的驱动程序。每个虚拟机模板包含一个虚拟机定义,其中包含指向引导源的指针。每个引导源都有一个预定义的名称和命名空间。对于某些操作系统,会自动提供一个引导源。如果没有提供,管理员必须准备自定义引导源。

提供的引导源会自动更新至操作系统的最新版本。对于自动更新的引导源,持久性卷声明(PVC)使用集群的默认存储类创建。如果在配置后选择了不同的默认存储类,您必须删除使用之前的默认存储类配置的集群命名空间中的现有数据卷。

要使用引导源功能,请安装 OpenShift Virtualization 的最新版本。命名空间 openshift-virtualization-os-images 启用该功能,并安装 OpenShift Virtualization Operator。安装引导源功能后,您可以创建引导源,将它们附加到模板,并从模板创建虚拟机。

使用通过上传本地文件、克隆现有 PVC、从 registry 或 URL 导入的持久性卷声明(PVC)定义引导源。使用 web 控制台将引导源附加到虚拟机模板。在启动源附加到虚拟机模板后,您可从模板创建任意数量的已完全配置的可随时使用虚拟机。

10.22.15.2. 将 RHEL 镜像导入为引导源

您可以通过指定镜像的 URL 来导入 Red Hat Enterprise Linux(RHEL)镜像作为引导源。

先决条件

  • 您必须有权访问带有操作系统镜像的网页。例如:使用镜像下载 Red Hat Enterprise Linux 网页。

步骤

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationTemplates
  2. 找到您要为其配置引导源的 RHEL 模板并点 Add source
  3. Add boot source to template 窗口中,从 Boot source type 列表中选择 URL(creates PVC)
  4. 点击 RHEL 下载页面 访问红帽客户门户。下载 Red Hat Enterprise Linux 页面中显示可用安装程序和镜像的列表。
  5. 确定您要下载的 Red Hat Enterprise Linux KVM 客户机镜像。右键单击 Download Now,再复制镜像的 URL。
  6. Add boot source to template 窗口中,将 URL 粘贴到 Import URL 字段中,然后点 Save and import

验证

  1. 验证模板在 Templates 页面上的 Boot source 列中显示绿色勾号。

现在,您可以使用此模板创建 RHEL 虚拟机。

10.22.15.3. 为虚拟机模板添加引导源

对于您要用于创建虚拟机或自定义模板的任何虚拟机模板,可以配置引导源。当使用引导源配置虚拟机模板时,会在 Templates 页面中被标记为 Source。在向模板中添加引导源后,您可以使用该模板创建新虚拟机。

在 web 控制台中选择和添加引导源有四个方法:

  • 上传本地文件(创建 PVC)
  • URL(创建 PVC)
  • Clone(创建 PVC)
  • Registry(创建 PVC)

先决条件

  • 要添加引导源,您必须以具有 os-images.kubevirt.io:edit RBAC 角色或管理员的用户身份登录。您不需要特殊权限才能从附加了引导源的模板创建虚拟机。
  • 要上传本地文件,操作系统镜像文件必须存在于本地机器中。
  • 要通过 URL 导入,您需要访问带操作系统镜像的 web 服务器。例如:带有镜像的 Red Hat Enterprise Linux 网页。
  • 要克隆现有的 PVC,需要使用 PVC 访问项目。
  • 要通过 registry 导入,需要访问容器 registry。

步骤

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationTemplates
  2. 点模板旁边的选项菜单,然后选择 Edit boot source
  3. Add disk
  4. Add disk 窗口中,选择 Use this disk 作为引导源
  5. 输入磁盘名称并选择 Source,例如 Blank(creates PVC)使用现有 PVC
  6. 持久性卷声明大小 输入一个值,以指定适合未压缩镜像的 PVC 大小,以及任何需要的额外空间。
  7. 选择一个 Type,如 DiskCD-ROM
  8. 可选:点 Storage class 并选择用于创建磁盘的存储类。通常,这个存储类是创建供所有 PVC 使用的默认存储类。

    注意

    提供的引导源会自动更新至操作系统的最新版本。对于自动更新的引导源,持久性卷声明(PVC)使用集群的默认存储类创建。如果在配置后选择了不同的默认存储类,您必须删除使用之前的默认存储类配置的集群命名空间中的现有数据卷。

  9. 可选:清除 Apply optimized StorageProfile settings,以编辑访问模式或卷模式。
  10. 选择保存引导源的适当方法:

    1. 如果您上传一个本地文件,请点击 Save and upload
    2. 如果从 URL 或 registry 中导入内容,点 Save and import
    3. 如果克隆现有的 PVC,点 Save and clone

Catalog 页面中列出了带有引导源的自定义虚拟机模板。您可以使用此模板创建虚拟机。

10.22.15.4. 从带有附加引导源的模板创建虚拟机

将引导源添加到模板后,即可从模板创建虚拟机。

步骤

  1. 在 OpenShift Container Platform web 控制台中,在侧边菜单中点 VirtualizationCatalog
  2. 选择更新的模板并点 Quick create VirtualMachine

VirtualMachine 详情会显示状态为 Starting

10.22.15.5. 其他资源

10.22.16. 热插虚拟磁盘

您可以在不停止虚拟机(VM)或虚拟机实例(VMI)的情况下添加或删除虚拟磁盘。

10.22.16.1. 关于热插虚拟磁盘

当您热插拔虚拟磁盘时,可以在虚拟机运行时将虚拟磁盘附加到虚拟机实例中。

热拔虚拟磁盘时,您可以在虚拟机运行时从虚拟机实例分离虚拟磁盘。

只有数据卷和持久性卷声明(PVC)才能热插和热拔。您不能热插或热拔容器磁盘。

热插虚拟磁盘后,它会保持附加状态,直到分离它,即使您重启虚拟机。

10.22.16.2. 关于 virtio-scsi

在 OpenShift Virtualization 中,每个虚拟机 (VM) 都有一个 virtio-scsi 控制器,以便热插磁盘可以使用 scsi 总线。virtio-scsi 控制器克服了 virtio 的限制,同时保持其性能优势。它高度可扩展,支持超过 400 万个磁盘的热插拔。

常规 virtio 不适用于热插磁盘,因为它无法扩展:每个 virtio 磁盘使用虚拟机中的有限 PCI Express (PCIe) 插槽。PCIe 插槽也被其他设备使用,必须提前保留,因此插槽可能按需提供。

10.22.16.3. 使用 CLI 热插虚拟磁盘

在虚拟机运行时热插要附加到虚拟机实例(VMI)的虚拟磁盘。

先决条件

  • 您必须有一个正在运行的虚拟机才能热插虚拟磁盘。
  • 您必须至少有一个数据卷或持久性卷声明(PVC)可用于热插。

步骤

  • 运行以下命令来热插虚拟磁盘:

    $ virtctl addvolume <virtual-machine|virtual-machine-instance> --volume-name=<datavolume|PVC> \
    [--persist] [--serial=<label-name>]
    • 使用可选 --persist 标志,将热插磁盘作为永久挂载的虚拟磁盘添加到虚拟机规格中。停止、重新启动或重新启动虚拟机以永久挂载虚拟磁盘。指定 --persist 标志后,您无法再热插或热拔虚拟磁盘。Persist 标志适用于虚拟机,不适用于虚拟机实例。
    • 可选 --serial 标志允许您添加您选择的字母数字字符串标签。这有助于您识别客户机虚拟机中的热插磁盘。如果没有指定这个选项,则标签默认为热插数据卷或 PVC 的名称。

10.22.16.4. 使用 CLI 热拔虚拟磁盘

在虚拟机运行时,热拔您想要从虚拟机实例(VMI)断开的虚拟磁盘。

先决条件

  • 您的虚拟机必须正在运行。
  • 您必须至少有一个数据卷或持久性卷声明(PVC)可用并为热插。

步骤

  • 运行以下命令来热拔虚拟磁盘:

    $ virtctl removevolume <virtual-machine|virtual-machine-instance> --volume-name=<datavolume|PVC>

10.22.16.5. 使用 web 控制台热插虚拟磁盘

在虚拟机运行时热插要附加到虚拟机实例(VMI)的虚拟磁盘。当您热插虚拟磁盘时,它会一直附加到 VMI 中,直到您拔出为止。

先决条件

  • 您必须有一个正在运行的虚拟机才能热插虚拟磁盘。

步骤

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 选择您要热插虚拟磁盘的虚拟机。
  3. VirtualMachine 详情页,点 Disks 选项卡。
  4. Add disk
  5. Add disk(hot plugged) 窗口中,填写您要热插的虚拟磁盘的信息。
  6. 点击 Save

10.22.16.6. 使用 web 控制台热拔出虚拟磁盘

在虚拟机运行时,热拔您想要从虚拟机实例(VMI)断开的虚拟磁盘。

先决条件

  • 虚拟机必须在连接热插拔磁盘的情况下运行。

步骤

  1. 在侧边菜单中点 VirtualizationVirtualMachines
  2. 使用您要热拔的磁盘选择正在运行的虚拟机以打开 VirtualMachine 详情页面。
  3. Disks 选项卡中,点您要热拔的虚拟磁盘的 Options 菜单 kebab
  4. 单击 Detach

10.22.17. 将容器磁盘与虚拟机搭配使用

您可以将虚拟机镜像构建到容器磁盘中,并将其存储在容器 registry 中。然后,您可以将容器磁盘导入虚拟机的持久性存储中,或者将其直接附加到虚拟机临时存储。

重要

如果您使用大型容器磁盘,则 I/O 流量可能会增加,影响 worker 节点。这可能导致不可用的节点。您可以通过以下方法解决这个问题:

10.22.17.1. 关于容器磁盘

容器磁盘是一个虚拟机镜像,它作为容器镜像存储在容器镜像 registry 中。您可以使用容器磁盘将同一磁盘镜像传送到多个虚拟机,并创建大量虚拟机克隆。

容器磁盘可以使用附加到虚拟机的数据卷导入到持久性卷声明(PVC),也可以作为临时 containerDisk 卷直接附加到虚拟机。

10.22.17.1.1. 使用数据卷将容器磁盘导入到 PVC 中

通过 Containerized Data Importer(CDI)使用数据卷将容器磁盘导入到 PVC 中。然后,您可以将数据卷附加到虚拟机以获取持久性存储。

10.22.17.1.2. 将容器磁盘作为 containerDisk 卷附加到虚拟机

containerDisk 卷是临时的。将在虚拟机停止、重启或删除时丢弃。当一个带有 containerDisk 卷的虚拟机启动时,容器镜像从 registry 中拉取,并托管在托管虚拟机的节点上。

containerDisk 卷用于只读文件系统,如 CD-ROM 或可处理的虚拟机。

重要

不建议将 containerDisk 卷用于读写文件系统,因为数据是临时写入托管节点上的本地存储。这会减慢虚拟机的实时迁移速度,如节点维护,因为数据必须迁移到目标节点。另外,如果节点断电或者意外关闭,则所有数据都会丢失。

10.22.17.2. 为虚拟机准备容器磁盘

您必须使用虚拟机镜像构建容器磁盘,并将其推送到容器 registry,然后才能用于虚拟机。然后,您可以使用数据卷将容器磁盘导入到 PVC 中,并将其附加到虚拟机,或者将容器磁盘作为临时 containerDisk 卷直接附加到虚拟机。

容器磁盘中磁盘镜像的大小受托管容器磁盘的 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
    1
    其中,<vm_image> 是 QCOW2 或 RAW 格式的虚拟机镜像。
    要使用远程虚拟机镜像,将 <vm_image>.qcow2 替换为远程镜像的完整 url。
  2. 构建和标记容器:

    $ podman build -t <registry>/<container_disk_name>:latest .
  3. 将容器镜像推送到 registry:

    $ podman push <registry>/<container_disk_name>:latest

如果容器镜像敞开没有 TLS,您必须将其添加为一个不安全的容器镜像仓库,然后才能将容器磁盘导入持久性存储。

10.22.17.3. 禁用容器镜像仓库的 TLS,以用作不安全的容器镜像仓库

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

先决条件

  • 以具有 cluster-admin 角色的用户身份登录集群。

流程

  • 编辑 HyperConverged 自定义资源,将不安全 registry 列表添加到 spec.storageImport.insecureRegistries 字段中。

    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 主机名。

10.22.17.4. 后续步骤

10.22.18. 准备 CDI 涂销空间

10.22.18.1. 关于数据卷

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。您可以将数据卷创建为独立资源,也可以使用虚拟机 (VM) 规格中的 dataVolumeTemplate 字段。

注意
  • 使用独立数据卷准备的虚拟机磁盘 PVC,维护虚拟机的独立生命周期。如果您使用虚拟机规格中的 dataVolumeTemplate 字段准备 PVC,PVC 会共享与虚拟机相同的生命周期。

10.22.18.2. 关于涂销空间

Containerized Data Importer (CDI) 需要涂销空间(临时存储)来完成一些操作,如导入和上传虚拟机镜像。在此过程中,CDI 会提供一个与支持目标数据卷(DV)的 PVC 大小相等的涂销空间 PVC。该涂销空间 PVC 将在操作完成或中止后删除。

您可以在 HyperConverged 自定义资源的 spec.scratchSpaceStorageClass 字段中定义绑定涂销空间 PVC 的存储类。

如果定义的存储类与集群中的存储类不匹配,则会使用为集群定义的默认存储类。如果没有在集群中定义默认存储类,则会使用置备原始 DV 或 PVC 的存储类。

注意

CDI 需要通过 file 卷模式来请求涂销空间,与支持原始数据卷的 PVC 无关。如果 block 卷模式支持原始 PVC,则您必须定义一个能够置备 file 卷模式 PVC 的 StorageClass。

手动调配

如果没有存储类,CDI 将使用项目中与镜像的大小要求匹配的任何 PVC。如果没有与这些要求匹配的 PVC,则 CDI 导入 Pod 将保持 Pending 状态,直至有适当的 PVC 可用或直至超时功能关闭 Pod。

10.22.18.3. 需要涂销空间的 CDI 操作

类型原因

registry 导入

CDI 必须下载镜像至涂销空间,并对层进行提取,以查找镜像文件。然后镜像文件传递至 QEMU-IMG 以转换成原始磁盘。

上传镜像

QEMU-IMG 不接受来自 STDIN 的输入。相反,要上传的镜像保存到涂销空间中,然后才可传递至 QEMU-IMG 进行转换。

存档镜像的 HTTP 导入

QEMU-IMG 不知道如何处理 CDI 支持的存档格式。相反,镜像取消存档并保存到涂销空间中,然后再传递至 QEMU-IMG。

经过身份验证的镜像的 HTTP 导入

QEMU-IMG 未充分处理身份验证。相反,镜像保存到涂销空间中并进行身份验证,然后再传递至 QEMU-IMG。

自定义证书的 HTTP 导入

QEMU-IMG 未充分处理 HTTPS 端点的自定义证书。相反,CDI 下载镜像到涂销空间,然后再将文件传递至 QEMU-IMG。

10.22.18.4. 定义存储类

您可以通过将 spec.scratchSpaceStorageClass 字段添加到 HyperConverged 自定义资源(CR)来定义 Containerized Data Importer(CDI)在分配涂销空间时使用的存储类。

先决条件

  • 安装 OpenShift CLI (oc) 。

流程

  1. 运行以下命令来编辑 HyperConverged CR:

    $ oc edit hco -n openshift-cnv kubevirt-hyperconverged
  2. spec.scratchSpaceStorageClass 字段添加到 CR,将值设置为集群中存在的存储类的名称:

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
    spec:
      scratchSpaceStorageClass: "<storage_class>" 1
    1
    如果您没有指定存储类,CDI 将使用正在填充的持久性卷声明的存储类。
  3. 保存并退出默认编辑器以更新 HyperConverged CR。

10.22.18.5. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt (QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

10.22.18.6. 其他资源

10.22.19. 重新使用持久性卷

要重新使用静态置备的持久性卷(PV),,您必须首先重新声明该卷。这涉及删除 PV,以便重新使用存储配置。

10.22.19.1. 关于重新声明静态置备的持久性卷

当重新声明持久性卷(PV)时,您从持久性卷声明(PVC)中卸载 PV 并删除 PV。根据底层存储,您可能需要手动删除共享存储。

然后,您可以重新使用 PV 配置来创建具有不同名称的 PV。

静态置备的 PV 必须具有 Retain 的重新声明策略才能重新声明。如果没有,则当 PVC 取消和 PV 的绑定后,PV 将进入失败的状态。

重要

在 OpenShift Container Platform 4 中, Recycle 重新声明策略已被弃用。

10.22.19.2. 重新声明静态置备的持久性卷

通过取消绑定持久性卷声明(PVC)并删除 PV 重新声明静态置备的持久性卷(PV)。您可能还需要手动删除共享存储。

重新声明静态置备的 PV 依赖于底层存储。此流程提供一般方法,可能需要根据您的存储进行调整。

流程

  1. 确保 PV 的 reclaim 策略被设置为 Retain:

    1. 检查 PV 上的 reclaim 策略:

      $ oc get pv <pv_name> -o yaml | grep 'persistentVolumeReclaimPolicy'
    2. 如果 persistentVolumeReclaimPolicy 没有设置为 Retain,使用以下命令编辑 reclaim 策略:

      $ oc patch pv <pv_name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
  2. 确保没有资源在使用 PV:

    $ oc describe pvc <pvc_name> | grep 'Mounted By:'

    在继续操作前,删除所有使用 PVC 的资源。

  3. 删除 PVC 以释放 PV:

    $ oc delete pvc <pvc_name>
  4. 可选:将 PV 配置导出到 YAML 文件。如果在稍后手动删除共享存储,您可以参考此配置。您还可以使用该文件中的 spec 参数作为基础,在重新声明 PV 后创建具有相同存储配置的新 PV:

    $ oc get pv <pv_name> -o yaml > <file_name>.yaml
  5. 删除 PV:

    $ oc delete pv <pv_name>
  6. 可选:根据存储类型,您可能需要删除共享存储文件夹的内容:

    $ rm -rf <path_to_share_storage>
  7. 可选:创建一个使用与删除 PV 相同的存储配置的 PV。如果您之前导出了重新声明的 PV 配置,您可以使用该文件的 spec 参数作为新 PV 清单的基础:

    注意

    为了避免可能的冲突,最好为新 PV 对象赋予与您删除的名称不同的名称。

    $ oc create -f <new_pv_name>.yaml

其他资源

10.22.20. 扩展虚拟机磁盘

您可以通过调整磁盘持久性卷声明(PVC)大小来扩大虚拟机(VM)磁盘的大小,以提供更大的存储容量。

但是,您无法缩小虚拟机磁盘的大小。

10.22.20.1. 划分虚拟机磁盘

VM 磁盘扩大为虚拟机提供额外空间。但是,虚拟机所有者负责决定如何使用存储。

如果磁盘是一个 Filesystem PVC,则匹配的文件会扩展到剩余大小,同时为文件系统开销保留一些空间。

步骤

  1. 编辑您要扩展的虚拟机磁盘的 PersistentVolumeClaim 清单:

    $ oc edit pvc <pvc_name>
  2. spec.resource.requests.storage 属性的值更改为较大的大小。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
       name: vm-disk-expand
    spec:
      accessModes:
         - ReadWriteMany
      resources:
        requests:
           storage: 3Gi 1
    ...
    1
    可增加的 VM 磁盘大小

10.22.20.2. 其他资源