8.19. 虚拟机磁盘
8.19.1. 存储特性
使用下表来决定 OpenShift Virtualization 中的本地和共享持久性存储的功能可用性。
8.19.1.1. OpenShift Virtualization 存储功能列表
虚拟机实时迁移 | 主机辅助虚拟机磁盘克隆 | 存储辅助虚拟机磁盘克隆 | 虚拟机快照 | |
---|---|---|---|---|
OpenShift Data Foundation:RBD 块模式卷 | 是 | 是 | 是 | 是 |
OpenShift Virtualization hostpath 置备程序 | 不是 | 是 | 不是 | 不是 |
其他多节点可写入存储 | 是 [1] | 是 | 是 [2] | 是 [2] |
其他单节点可写入存储 | 不是 | 是 | 是 [2] | 是 [2] |
- PVC 必须请求 ReadWriteMany 访问模式。
- 存储供应商必须支持 Kubernetes 和 CSI 快照 API
您无法实时迁移使用以下配置的虚拟机:
- 具有 ReadWriteOnce(RWO)访问模式的存储类
- 透传功能,比如 GPU
对于这些虚拟机,不要将 evictionStrategy
字段设置为 LiveMigrate
。
8.19.2. 为虚拟机配置本地存储
您可以使用 hostpath 置备程序(HPP)为虚拟机配置本地存储。
8.19.2.1. 关于 hostpath 置备程序
安装 OpenShift Virtualization Operator 时,会自动安装 Hostpath Provisioner(HPP)Operator。HPP 是一个本地存储置备程序,用于由 Hostpath Provisioner Operator 创建的 OpenShift Virtualization。要使用 HPP,您必须创建一个 HPP 自定义资源(CR)。
在 OpenShift Virtualization 4.10 中,HPP Operator 配置 Kubernetes CSI 驱动程序。Operator 还识别 HPP CR 的现有(传统)格式。
对于多个发行版本,传统的 HPP 和 Container Storage Interface(CSI)驱动程序会被支持。然而,在某个时候,将不再支持旧的 HPP。如果使用 HPP,请计划作为迁移策略的一部分为 CSI 驱动程序创建存储类。
如果在现有集群中升级到 OpenShift Virtualization 版本 4.10,则 HPP Operator 会被升级,系统会执行以下操作:
- 已安装 CSI 驱动程序。
- CSI 驱动程序被配置为您的旧 HPP CR 的内容。
如果在新集群中安装 OpenShift Virtualization 版本 4.10,您必须执行以下操作:
- 使用基本存储池创建 HPP CR。
- 为 CSI 驱动程序创建存储类。
可选:您可以使用多个 HPP 卷的 PVC 模板创建一个存储池。
8.19.2.2. 使用基本存储池创建 hostpath 置备程序
您可以使用 storagePools
小节创建 HPP 自定义资源(CR),以使用基本存储池配置 hostpath 置备程序(HPP)。存储池指定 CSI 驱动程序使用的名称和路径。
先决条件
-
在
spec.storagePools.path
中指定的目录必须具有读/写访问权限。 - 存储池不能与操作系统位于同一个分区。否则,操作系统分区可能会被填充到容量中,这会影响性能或导致节点不稳定或不可用。
流程
使用
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
- 保存文件并退出。
运行以下命令来创建 HPP:
$ oc create -f hpp_cr.yaml
8.19.2.3. 关于创建存储类
当您创建存储类时,您将设置参数,它们会影响属于该存储类的持久性卷(PV)的动态置备。您不能在创建 StorageClass
对象后更新其参数。
要使用 hostpath 置备程序(HPP),您必须使用 storagePools
小节为 CSI 驱动程序创建关联的存储类。
虚拟机使用基于本地 PV 的数据卷。本地 PV 与特定节点绑定。虽然磁盘镜像准备供虚拟机消耗,但可能不会将虚拟机调度到之前固定本地存储 PV 的节点。
要解决这个问题,使用 Kubernetes pod 调度程序将持久性卷声明(PVC)绑定到正确的节点上的 PV。通过使用 volumeBindingMode
参数设置为 WaitForFirstConsumer
的 StorageClass
值,PV 的绑定和置备会延迟到 pod 使用 PVC。
8.19.2.3.1. 使用 storagePools 小节为 CSI 驱动程序创建存储类
您可以为 hostpath 置备程序(HPP)CSI 驱动程序创建存储类自定义资源(CR)。
先决条件
- 您必须具有 OpenShift Virtualization 4.10 或更高版本。
流程
创建
storageclass_csi.yaml
文件来定义存储类:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: hostpath-csi 1 provisioner: kubevirt.io.hostpath-provisioner reclaimPolicy: Delete 2 volumeBindingMode: WaitForFirstConsumer 3 parameters: storagePool: my-storage-pool 4
- 1
- 为存储类分配任何有意义的名称。在本例中,
csi
用于指定类使用 CSI 置备程序而不是旧的置备程序。根据传统或 CSI 驱动程序置备,为存储类选择描述性名称,可简化迁移策略的实现。 - 2
- 两个可能的
reclaimPolicy
值为Delete
和Retain
。如果没有指定值,则默认值为Delete
。 - 3
volumeBindingMode
参数决定何时发生动态置备和卷绑定。指定WaitForFirstConsumer
,将持久性卷(PV)的绑定和置备延迟到创建使用持久性卷声明(PVC)的 pod 后。这样可确保 PV 满足 pod 的调度要求。- 4
- 指定 HPP CR 中定义的存储池名称。
- 保存文件并退出。
运行以下命令来创建
StorageClass
对象:$ oc create -f storageclass_csi.yaml
8.19.2.3.2. 为旧的 hostpath 置备程序创建存储类
您可以通过创建一个没有 storagePool
参数的 StorageClass
对象,为旧的 hostpath 置备程序(HPP)创建存储类。
流程
创建
storageclass.yaml
文件来定义存储类:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: hostpath-provisioner provisioner: kubevirt.io/hostpath-provisioner reclaimPolicy: Delete 1 volumeBindingMode: WaitForFirstConsumer 2
- 保存文件并退出。
运行以下命令来创建
StorageClass
对象:$ oc create -f storageclass.yaml
其他资源
8.19.2.4. 关于使用 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 模板中创建的存储池合并。
8.19.2.4.1. 使用 PVC 模板创建存储池
您可以通过在 HPP 自定义资源(CR)中指定 PVC 模板,为多个 hostpath 置备程序(HPP)卷创建存储池。
先决条件
-
在
spec.storagePools.path
中指定的目录必须具有读/写访问权限。 - 存储池不能与操作系统位于同一个分区。否则,操作系统分区可能会被填充到容量中,这会影响性能或导致节点不稳定或不可用。
流程
为 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
参数可以是Block
或Filesystem
,只要它与置备的卷格式匹配。如果没有指定值,则默认为Filesystem
。如果volumeMode
是Block
,挂载 pod 会在挂载前在块卷中创建一个 XFS 文件系统。 - 4
- 如果省略
storageClassName
参数,则使用默认存储类来创建 PVC。如果省略storageClassName
,请确保 HPP 存储类不是默认存储类。 - 5
- 您可以指定静态或动态置备的存储。在这两种情况下,确保请求的存储大小适合您要虚拟分割的卷,或者 PVC 无法绑定到大型 PV。如果您使用的存储类使用动态置备的存储,请选择与典型请求大小匹配的分配大小。
- 保存文件并退出。
运行以下命令,使用存储池创建 HPP:
$ oc create -f hpp_pvc_template_pool.yaml
其他资源
8.19.3. 创建数据卷
当您创建数据卷时,Containerized Data Importer(CDI)会创建一个持久性卷声明(PVC),并使用您的数据填充 PVC。您可以将数据卷创建为独立资源,也可以使用虚拟机规格中的 dataVolumeTemplate
资源。您可以使用 PVC API 或存储 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 创建的值。但是,如果您自定义存储配置集,您可以为存储类配置自动设置。
8.19.3.1. 使用存储 API 创建数据卷
当您使用存储 API 创建数据卷时,Containerized Data Interface(CDI)会根据所选存储类支持的存储类型优化持久性卷声明(PVC)分配。您只需要指定数据卷名称、命名空间和要分配的存储量。
例如:
-
使用 Ceph RBD 时,
accessModes
会自动设置为ReadWriteMany
,这将启用实时迁移。volumeMode
设置为Block
以最大化性能。 -
当使用
volumeMode: Filesystem
时,如果需要满足文件系统开销,CDI 将自动请求更多空间。
在以下 YAML 中,使用存储 API 请求具有 2G 可用空间的数据卷。用户不需要知道 volumeMode
就可正确估算所需的持久性卷声明(PVC)大小。CDI 自动选择 accessModes
和 volumeMode
属性的最佳组合。这些最佳值基于存储类型或您在存储配置文件中定义的默认值。如果要提供自定义值,它们会覆盖系统计算的值。
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
8.19.3.2. 使用 PVC API 创建数据卷
当使用 PVC API 创建数据卷时,Containerized Data Interface(CDI)会根据您为以下字段指定的内容创建数据卷:
-
accessModes
(ReadWriteOnce
、ReadWriteMany
或ReadOnlyMany
) -
volumeMode
(Filesystem
或Block
) -
capacity
ofstorage
(例如,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
当您使用 PVC API 明确分配数据卷且没有使用 volumeMode: Block
时,请考虑文件系统开销。
文件系统开销是文件系统维护其元数据所需的空间量。文件系统元数据所需的空间量取决于文件系统。无法考虑存储容量请求中的文件系统开销会导致底层持久性卷声明(PVC)不足以容纳您的虚拟机磁盘。
如果您使用存储 API,CDI 将包含在文件系统开销中,并请求更大的持久性卷声明(PVC)以确保您的分配请求成功。
8.19.3.3. 自定义存储配置集
您可以通过编辑置备程序存储类的 StorageProfile
对象来指定默认参数。这些默认参数只有在 DataVolume
对象中没有配置持久性卷声明 (PVC) 时才适用。
先决条件
- 确保存储类及其供应商支持您计划的配置。在存储配置集中指定不兼容的配置会导致卷置备失败。
存储配置文件中的空 status
部分表示存储置备程序不被 Containerized Data Interface(CDI)识别。如果您有一个存储置备程序无法被 CDI 识别,则需要自定义存储配置集。在这种情况下,管理员在存储配置集中设置适当的值以确保分配成功。
如果您创建数据卷并省略 YAML 属性,且存储配置集中没有定义这些属性,则不会分配请求的存储,也不会创建底层持久性卷声明(PVC)。
流程
编辑存储配置文件。在本例中,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>
在存储配置集中提供所需的属性值:
存储配置集示例
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>
保存更改后,所选值将显示在存储配置集的
status
项中。
8.19.3.3.1. 使用存储配置集设置默认克隆策略
您可以使用存储配置集为存储类设置默认克隆方法,从而创建 克隆策略。例如,如果您的存储供应商只支持某些克隆方法,设置克隆策略会很有用。它还允许您选择一个限制资源使用或最大化性能的方法。
可以通过将存储配置集中的 cloneStrategy
属性设置为以下值之一来指定克隆策略:
-
snapshot
- 在配置快照时默认使用此方法。此克隆策略使用临时卷快照来克隆卷。存储置备程序必须支持 CSI 快照。 -
copy
- 此方法使用源 pod 和目标 pod 将数据从源卷复制到目标卷。主机辅助克隆是最有效的克隆方法。 -
csi-clone
- 此方法使用 CSI 克隆 API 高效地克隆现有卷,而无需使用临时卷快照。与snapshot
或copy
不同(它们在没有定义存储配置集时被默认使用),只有在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>
8.19.3.4. 其他资源
8.19.4. 配置 CDI 以使用具有计算资源配额的命名空间
您可以使用 Containerized Data Importer(CDI)将虚拟机磁盘导入、上传并克隆到命名空间中,这可能受 CPU 和内存资源限制。
8.19.4.1. 关于命名空间中的 CPU 和内存配额
资源配额 由 ResourceQuota
对象定义,对一个命名空间实施限制,该命名空间限制可被该命名空间中资源消耗的计算资源总量。
HyperConverged
自定义资源(CR)定义了 Containerized Data Importer(CDI)的用户配置。CPU 和内存请求和限制值设置为默认值 0
。这样可确保由 CDI 创建的无需计算资源要求的 Pod 具有默认值,并允许在使用配额限制的命名空间中运行。
8.19.4.2. 覆盖 CPU 和内存默认值
通过将 spec.resourceRequirements.storageWorkloads
小节添加到 HyperConverged
自定义资源(CR),为您的用例修改 CPU 和内存请求和限值的默认设置。
先决条件
-
安装 OpenShift CLI (
oc
) 。
流程
运行以下命令来编辑
HyperConverged
CR:$ oc edit hco -n openshift-cnv kubevirt-hyperconverged
将
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"
-
保存并退出编辑器以更新
HyperConverged
CR。
8.19.4.3. 其他资源
8.19.5. 管理数据卷注解
数据卷(DV)注解允许您管理 pod 行为。您可以将一个或多个注解添加到数据卷,然后将其传播到创建的导入程序 pod。
8.19.5.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 网络注解
8.19.6. 对数据卷使用预分配
Containerized Data Importer 可以预先分配磁盘空间,以便在创建数据卷时提高写入性能。
您可以为特定数据卷启用预分配。
8.19.6.1. 关于预分配
Containerized Data Importer(CDI)可以使用 QEMU 预先分配数据卷模式来提高写入性能。您可以使用预分配模式导入和上传操作,并在创建空白数据卷时使用。
如果启用了预分配,CDI 根据底层文件系统和设备类型使用更好的预分配方法:
fallocate
-
如果文件系统支持它,CDI 通过使用
posix_fallocate
功能(它分配块并将其标记为未初始化),来使用操作系统本身的(fallocate
调用来预分配空间。 full
-
如果无法使用
fallocate
模式,则会使用full
模式通过将数据写入底层存储来为镜像分配空间。根据存储位置,所有空分配的空间都可能会为零。
8.19.6.2. 为数据卷启用预分配
您可以通过在数据卷清单中包含 spec.preallocation
字段来为特定数据卷启用预分配。您可以在 web 控制台中或使用 OpenShift CLI (oc
) 启用预分配模式。
所有 CDI 源类型都支持 Preallocation 模式。
8.19.7. 使用 Web 控制台上传本地磁盘镜像
您可以使用 web 控制台上传本地存储的磁盘镜像文件。
8.19.7.1. 先决条件
- 您必须有 IMG、ISO 或 QCOW2 格式的虚拟机镜像文件。
- 如果您根据 CDI 支持的操作列表要求涂销空间,您必须首先定义一个 StorageClass 或准备 CDI 涂销空间才能成功完成此操作。
8.19.7.2. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间
8.19.7.3. 使用 Web 控制台上传镜像文件
使用 Web 控制台将镜像文件上传到新持久性卷声明(PVC)。之后,您可以使用此 PVC 将镜像附加到新虚拟机。
先决条件
您必须有以下之一:
- 原始虚拟机镜像文件,可以是 ISO 或 IMG 格式。
- 虚拟机镜像文件(QCOW2 格式)。
要获得最佳结果,先根据以下方法压缩您的镜像文件:
使用
xz
或gzip
压缩原始映像文件。注意使用压缩的原始镜像文件的上传效果最佳。
使用为您的客户端推荐的方法压缩 QCOW2 镜像文件:
- 如果使用 Linux 客户端,使用 virt-sparsify 工具对 QCOW2 文件进行 sparsify。
-
如果您使用 Windows 客户端。使用
xz
或者gzip
压缩 QCOW2 文件。
流程
-
在 web 控制台的侧边菜单中点击 Storage
Persistent Volume Claims。 - 点 Create Persistent Volume Claim 下拉列表展开它。
- 点 With Data Upload Form 打开 Upload Data to Persistent Volume Claim 页面。
- 点 Browse 打开文件管理器并选择要上传的镜像,或者将文件拖到 Drag a file here or browse to upload 项中。
可选:将此镜像设置为特定操作系统的默认镜像。
- 选择 Attach this data to a virtual machine operating system 复选框。
- 从列表中选择一个操作系统。
- Persistent Volume Claim Name 字段自动填充唯一名称,且无法编辑。记录分配给 PVC 的名称,以便以后根据需要指定它。
- 从 Storage Class 列表中选择存储类。
在 Size 字段中输入 PVC 的大小值。从下拉列表中选择对应的度量单位。
警告PVC 大小必须大于未压缩的虚拟磁盘的大小。
- 选择与您选择的存储类匹配的 Access Mode。
- 点 Upload。
8.19.7.4. 其他资源
- 配置预分配模式以提高数据卷操作的写入性能。
8.19.8. 使用 virtctl 工具上传本地磁盘镜像
您可使用 virtctl
命令行实用程序将本地存储的磁盘镜像上传到新的或已有的数据卷中。
8.19.8.1. 先决条件
-
启用
kubevirt-virtctl
软件包。 - 如果您根据 CDI 支持的操作列表要求涂销空间,您必须首先定义一个 StorageClass 或准备 CDI 涂销空间才能成功完成此操作。
8.19.8.2. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。
8.19.8.3. 创建上传数据卷
您可以使用 upload
数据源手动创建数据源,用于上传本地磁盘镜像。
流程
创建指定
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
运行以下命令来创建数据卷:
$ oc create -f <upload-datavolume>.yaml
8.19.8.4. 上传本地磁盘镜像至数据卷
您可使用 virtctl
CLI 实用程序将客户端机器中的本地磁盘镜像上传到集群中的数据卷(DV)。您可以使用集群中已存在的 DV,也可以在此过程中创建新的 DV。
上传本地磁盘镜像后,您可将其添加到虚拟机中。
先决条件
您必须有以下之一:
- 原始虚拟机镜像文件,可以是 ISO 或 IMG 格式。
- 虚拟机镜像文件(QCOW2 格式)。
要获得最佳结果,先根据以下方法压缩您的镜像文件:
使用
xz
或gzip
压缩原始映像文件。注意使用压缩的原始镜像文件的上传效果最佳。
使用为您的客户端推荐的方法压缩 QCOW2 镜像文件:
- 如果使用 Linux 客户端,使用 virt-sparsify 工具对 QCOW2 文件进行 sparsify。
-
如果您使用 Windows 客户端。使用
xz
或者gzip
压缩 QCOW2 文件。
-
kubevirt-virtctl
软件包必须安装在客户端机器上。 - 客户端机器必须配置为信任 OpenShift Container Platform 路由器的证书。
流程
确定以下各项:
- 要使用的上传数据卷的名称。如果这个数据卷不存在,则会自动创建。
- 在上传过程中创建数据卷的大小。大小必须大于或等于磁盘镜像的大小。
- 要上传的虚拟机磁盘镜像的文件位置。
运行
virtctl image-upload
命令上传磁盘镜像。指定您在上一步中获得的参数。例如:$ virtctl image-upload dv <datavolume_name> \ 1 --size=<datavolume_size> \ 2 --image-path=</path/to/image> \ 3
注意-
如果您不想创建新数据卷,请省略
--size
参数,并包含--no-create
标志。 - 将磁盘镜像上传到 PVC 时,PVC 大小必须大于未压缩的虚拟磁盘的大小。
-
若要在使用 HTTPS 时允许不安全的服务器连接,请使用
--insecure
参数。注意,在使用--insecure
标志时,不会验证上传端点的真实性。
-
如果您不想创建新数据卷,请省略
可选。要验证数据卷是否已创建,运行以下命令来查看所有数据卷:
$ oc get dvs
8.19.8.5. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间
8.19.8.6. 其他资源
- 配置预分配模式以提高数据卷操作的写入性能。
8.19.9. 上传本地磁盘镜像至块存储数据卷
您可以使用 virtctl
命令行实用程序将本地磁盘镜像上传到块数据卷中。
在此工作流中,您会创建一个本地块设备用作 PV,将此块卷与 upload
数据卷关联,并使用 virtctl
将本地磁盘镜像上传至数据卷中。
8.19.9.1. 先决条件
-
启用
kubevirt-virtctl
软件包。 - 如果您根据 CDI 支持的操作列表要求涂销空间,您必须首先定义一个 StorageClass 或准备 CDI 涂销空间才能成功完成此操作。
8.19.9.2. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。
8.19.9.3. 关于块持久性卷
块持久性卷(PV)是一个受原始块设备支持的 PV。这些卷没有文件系统,可以通过降低开销来为虚拟机提供性能优势。
原始块卷可以通过在 PV 和持久性卷声明(PVC)规格中指定 volumeMode: Block
来置备。
8.19.9.4. 创建本地块持久性卷
通过填充文件并将其挂载为循环设备,在节点上创建本地块持久性卷(PV)。然后,您可以在 PV 清单中将该循环设备作为 Block(块)
卷引用,并将其用作虚拟机镜像的块设备。
流程
-
以
root
身份登录节点,在其上创建本地 PV。本流程以node01
为例。 创建一个文件并用空字符填充,以便可将其用作块设备。以下示例创建
loop10
文件,大小为 2Gb(20,100 Mb 块):$ dd if=/dev/zero of=<loop10> bs=100M count=20
将
loop10
文件挂载为 loop 设备。$ losetup </dev/loop10>d3 <loop10> 1 2
创建引用所挂载 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
创建块 PV。
# oc create -f <local-block-pv10.yaml>1
- 1
- 上一步中创建的持久性卷的文件名。
8.19.9.5. 创建上传数据卷
您可以使用 upload
数据源手动创建数据源,用于上传本地磁盘镜像。
流程
创建指定
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
运行以下命令来创建数据卷:
$ oc create -f <upload-datavolume>.yaml
8.19.9.6. 上传本地磁盘镜像至数据卷
您可使用 virtctl
CLI 实用程序将客户端机器中的本地磁盘镜像上传到集群中的数据卷(DV)。您可以使用集群中已存在的 DV,也可以在此过程中创建新的 DV。
上传本地磁盘镜像后,您可将其添加到虚拟机中。
先决条件
您必须有以下之一:
- 原始虚拟机镜像文件,可以是 ISO 或 IMG 格式。
- 虚拟机镜像文件(QCOW2 格式)。
要获得最佳结果,先根据以下方法压缩您的镜像文件:
使用
xz
或gzip
压缩原始映像文件。注意使用压缩的原始镜像文件的上传效果最佳。
使用为您的客户端推荐的方法压缩 QCOW2 镜像文件:
- 如果使用 Linux 客户端,使用 virt-sparsify 工具对 QCOW2 文件进行 sparsify。
-
如果您使用 Windows 客户端。使用
xz
或者gzip
压缩 QCOW2 文件。
-
kubevirt-virtctl
软件包必须安装在客户端机器上。 - 客户端机器必须配置为信任 OpenShift Container Platform 路由器的证书。
流程
确定以下各项:
- 要使用的上传数据卷的名称。如果这个数据卷不存在,则会自动创建。
- 在上传过程中创建数据卷的大小。大小必须大于或等于磁盘镜像的大小。
- 要上传的虚拟机磁盘镜像的文件位置。
运行
virtctl image-upload
命令上传磁盘镜像。指定您在上一步中获得的参数。例如:$ virtctl image-upload dv <datavolume_name> \ 1 --size=<datavolume_size> \ 2 --image-path=</path/to/image> \ 3
注意-
如果您不想创建新数据卷,请省略
--size
参数,并包含--no-create
标志。 - 将磁盘镜像上传到 PVC 时,PVC 大小必须大于未压缩的虚拟磁盘的大小。
-
若要在使用 HTTPS 时允许不安全的服务器连接,请使用
--insecure
参数。注意,在使用--insecure
标志时,不会验证上传端点的真实性。
-
如果您不想创建新数据卷,请省略
可选。要验证数据卷是否已创建,运行以下命令来查看所有数据卷:
$ oc get dvs
8.19.9.7. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间
8.19.9.8. 其他资源
- 配置预分配模式以提高数据卷操作的写入性能。
8.19.10. 管理虚拟机快照
您可以为虚拟机创建和删除虚拟机快照,无论是关闭(离线)还是(在线)虚拟机。您只能恢复到已关机(脱机)虚拟机。OpenShift Virtualization 支持以下虚拟机快照:
- Red Hat OpenShift Data Foundation
- 使用支持 Kubernetes 卷快照 API 的 Container Storage Interface(CSI)驱动程序的任何其他云存储供应商
在线快照的默认时间期限为五分钟(5m
),可根据需要进行更改。
具有热插虚拟磁盘的虚拟机支持在线快照。但是,没有在虚拟机规格中的热插磁盘不会包含在快照中。
要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。
QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。
8.19.10.1. 关于虚拟机快照
快照 代表虚拟机(VM)在特定时间点的状态和数据。您可以使用快照将现有虚拟机恢复到以前的状态(由快照代表)进行备份和恢复,或者快速回滚到以前的开发版本。
虚拟机快照从关机(停止状态)或 powred on(Running 状态)上的虚拟机创建。
在为正在运行的虚拟机执行快照时,控制器将检查 QEMU 客户机代理是否已安装并在运行。如果是这样,它会在拍摄快照前冻结虚拟机文件系统,并在拍摄快照后修改文件系统。
快照存储附加到虚拟机的每个 Container Storage Interface(CSI)卷的副本以及虚拟机规格和元数据的副本。创建后无法更改快照。
借助 VM 快照功能,集群管理员和应用程序开发人员可以:
- 创建新快照
- 列出附加到特定虚拟机的所有快照
- 从快照恢复虚拟机
- 删除现有虚拟机快照
8.19.10.1.1. 虚拟机快照控制器和自定义资源定义(CRD)
VM 快照功能引入了三个新的 API 对象,定义为 CRD,用于管理快照:
-
VirtualMachineSnapshot
:代表创建快照的用户请求。它包含有关虚拟机当前状态的信息。 -
VirtualMachineSnapshotContent
:代表集群中置备的资源(快照)。它由虚拟机快照控制器创建,其中包含恢复虚拟机所需的所有资源的引用。 -
VirtualMachineRestore
:代表从快照中恢复虚拟机的用户请求。
VM 快照控制器会把一个 VirtualMachineSnapshotContent
对象与创建它的 VirtualMachineSnapshotContent
对象绑定,并具有一对一的映射。
8.19.10.2. 在 Linux 虚拟机上安装 QEMU 客户机代理
qemu-guest-agent
广泛可用,默认在红帽虚拟机中可用。安装代理并启动服务。
要检查您的虚拟机 (VM) 是否已安装并运行 QEMU 客户机代理,请验证 AgentConnected
是否列在 VM spec 中。
要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。
QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。
流程
- 通过其中一个控制台或通过 SSH 访问虚拟机命令行。
在虚拟机上安装 QEMU 客户机代理:
$ yum install -y qemu-guest-agent
确保服务持久并启动它:
$ systemctl enable --now qemu-guest-agent
8.19.10.3. 在 Windows 虚拟机上安装 QEMU 客户机代理
对于 Windows 虚拟机,QEMU 客户机代理包含在 VirtIO 驱动程序中。在现有或者新的 Windows 安装上安装驱动程序。
要检查您的虚拟机 (VM) 是否已安装并运行 QEMU 客户机代理,请验证 AgentConnected
是否列在 VM spec 中。
要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。
QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。
8.19.10.3.1. 在现有 Windows 虚拟机上安装 VirtIO 驱动程序
从附加的 SATA CD 驱动器将 VirtIO 驱动程序安装到现有 Windows 虚拟机。
该流程使用通用方法为 Windows 添加驱动。具体流程可能会因 Windows 版本而稍有差异。有关具体安装步骤,请参阅您的 Windows 版本安装文档。
流程
- 启动虚拟机并连接至图形控制台。
- 登录 Windows 用户会话。
打开 Device Manager 并展开 Other devices 以列出所有 Unknown device。
-
打开
Device Properties
以识别未知设备。右击设备并选择 Properties。 - 单击 Details 选项卡,并在 Property 列表中选择 Hardware Ids。
- 将 Hardware Ids 的 Value 与受支持的 VirtIO 驱动程序相比较。
-
打开
- 右击设备并选择 Update Driver Software。
- 点击 Browse my computer for driver software 并浏览所附加的 VirtIO 驱动程序所在 SATA CD 驱动器。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
- 点击 Next 以安装驱动程序。
- 对所有必要 VirtIO 驱动程序重复这一过程。
- 安装完驱动程序后,点击 Close 关闭窗口。
- 重启虚拟机以完成驱动程序安装。
8.19.10.3.2. 在 Windows 安装过程中安装 VirtIO 驱动程序
在 Windows 安装过程中,从附加的 SATA CD 驱动程序安装 VirtIO 驱动程序。
该流程使用通用方法安装 Windows,且安装方法可能因 Windows 版本而异。有关您要安装的 Windows 版本,请参阅相关文档。
流程
- 启动虚拟机并连接至图形控制台。
- 开始 Windows 安装过程。
- 选择 Advanced 安装。
-
加载驱动程序前无法识别存储目的地。点击
Load driver
。 - 驱动程序将附加为 SATA CD 驱动器。点击 OK 并浏览 CD 驱动器以加载存储驱动程序。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
- 对所有所需驱动程序重复前面两步。
- 完成 Windows 安装。
8.19.10.4. 在 web 控制台中创建虚拟机快照
您可以使用 web 控制台创建虚拟机(VM)快照。
要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。
QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。
VM 快照只包含满足以下要求的磁盘:
- 必须是数据卷或持久性卷声明
- 属于支持容器存储接口(CSI)卷快照的存储类
流程
-
在侧边菜单中点 Virtualization
VirtualMachines。 - 选择虚拟机以打开 VirtualMachine 详情页面。
-
如果虚拟机正在运行,点 Actions
Stop 关闭它。 - 点 Snapshots 标签页,然后点 Take Snapshot。
- 填写 Snapshot Name 和可选的 Description 字段。
- 扩展 Disks included in this Snapshot 以查看快照中包含的存储卷。
- 如果您的虚拟机磁盘无法包含在快照中,并且您仍然希望继续,请选择 I am aware of this warning and wish to proceed 复选框。
- 点击 Save。
8.19.10.5. 通过 CLI 创建虚拟机快照
您可以通过创建一个 VirtualMachineSnapshot
对象来为离线或在线虚拟机创建虚拟机快照。kubevirt 与 QEMU 客户机代理协调,以创建在线虚拟机的快照。
要为具有最高完整性的在线(Running 状态)虚拟机创建快照,请安装 QEMU 客户机代理。
QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。
先决条件
- 确保持久性卷声明(PVC)位于支持 Container Storage Interface(CSI)卷快照的存储类中。
-
安装 OpenShift CLI (
oc
) 。 - 可选:关闭您要为其创建快照的虚拟机。
流程
创建一个 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
创建
VirtualMachineSnapshot
资源。快照控制器会创建一个VirtualMachineSnapshotContent
对象,将其绑定到VirtualMachineSnapshot
并更新VirtualMachineSnapshot
对象的status
和readyToUse
字段。$ oc create -f <my-vmsnapshot>.yaml
可选: 如果要执行在线快照,您可以使用
wait
命令并监控快照的状态:输入以下命令:
$ oc wait my-vm my-vmsnapshot --for condition=Ready
验证快照的状态:
-
InProgress
- 在线快照操作仍在进行中。 -
succeeded
- 在线快照操作成功完成。 Failed
- 在线快照操作失败。注意在线快照的默认时间期限为五分钟(
5m
)。如果快照在五分钟内没有成功完成,其状态将设为failed
。之后,文件系统将被”解冻”,虚拟机将取消冻结,但状态会一直failed
,直到您删除失败的快照镜像。要更改默认时间期限,在 VM 快照 spec 中添加
FailureDeadline
属性,指定在快照超时前的时间,以分钟(m
)或秒(s
)为单位。要设置截止时间,您可以指定
0
,但通常不建议这样做,因为它可能会导致虚拟机没有响应。如果您没有指定时间单位,如
m
或s
,则默认为 秒(s
)。
-
验证
验证
VirtualMachineSnapshot
对象是否已创建并绑定到VirtualMachineSnapshotContent
。readyToUse
标志必须设为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
-
检查
VirtualMachineSnapshotContent
资源的spec:volumeBackups
属性,以验证快照中包含了预期的 PVC。
8.19.10.6. 使用快照声明验证在线快照创建
快照表示是有关在线虚拟机 (VM) 快照操作的上下文信息。对于离线虚拟机 (VM) 快照操作,提示不可用。暗示有助于描述在线快照创建的详细信息。
先决条件
- 要查看提示信息,您必须已尝试使用 CLI 或 Web 控制台创建在线虚拟机快照。
流程
通过执行以下操作之一来显示快照的输出:
-
对于使用 CLI 创建的快照,请查看
VirtualMachineSnapshot
对象 YAML 中的 status 字段中的指示器输出。 - 对于使用 Web 控制台创建的快照,请点击 Snapshot details 屏幕中的 VirtualMachineSnapshot > Status。
-
对于使用 CLI 创建的快照,请查看
验证在线虚拟机快照的状态:
-
Online
代表虚拟机在在线快照创建期间运行。 -
NoGuestAgent
表示 QEMU 客户机代理在在线快照创建过程中没有运行。QEMU 客户机代理无法用于冻结和构建文件系统,要么因为 QEMU 客户机代理尚未安装或正在运行,要么是因为另一个错误。
-
8.19.10.7. 在 web 控制台中从快照中恢复虚拟机
您可以将虚拟机(VM)恢复到 web 控制台中由快照表示的以前的配置。
流程
-
在侧边菜单中点 Virtualization
VirtualMachines。 - 选择虚拟机以打开 VirtualMachine 详情页面。
-
如果虚拟机正在运行,点 Actions
Stop 关闭它。 - 点 Snapshots 标签页。该页面显示与虚拟机关联的快照列表。
选择以下方法之一恢复虚拟机快照:
- 对于您要用作恢复虚拟机的源的快照,点 Restore。
-
选择快照以打开 Snapshot Details 屏幕,然后点 Actions
Restore VirtualMachineSnapshot。
- 在确认弹出窗口中,点 Restore 可将虚拟机恢复到快照代表的以前的配置中。
8.19.10.8. 通过 CLI 从快照中恢复虚拟机
您可以使用虚拟机快照将现有虚拟机 (VM) 恢复到以前的配置。您只能从离线虚拟机快照中恢复。
先决条件
-
安装 OpenShift CLI(
oc
)。 - 关闭您要恢复到之前状态的虚拟机。
流程
创建一个 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
创建
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
8.19.10.9. 删除 web 控制台中的虚拟机快照
您可以使用 web 控制台删除现有虚拟机快照。
流程
-
在侧边菜单中点 Virtualization
VirtualMachines。 - 选择虚拟机以打开 VirtualMachine 详情页面。
- 点 Snapshots 标签页。该页面显示与虚拟机关联的快照列表。
- 点您要删除的虚拟机快照 的 Options 菜单,然后选择 Delete Virtual Machine Snapshot。
- 在确认弹出窗口中点 Delete 删除快照。
8.19.10.10. 通过 CLI 删除虚拟机快照
您可以通过删除正确的 VirtualMachineSnapshot
对象来删除现有虚拟机(VM)快照。
先决条件
-
安装 OpenShift CLI (
oc
) 。
流程
删除
VirtualMachineSnapshot
对象。快照控制器会删除VirtualMachineSnapshot
和关联的VirtualMachineSnapshotContent
对象。$ oc delete vmsnapshot <my-vmsnapshot>
验证
验证快照是否已删除,且不再附加到此虚拟机:
$ oc get vmsnapshot
8.19.10.11. 其他资源
8.19.11. 将本地虚拟机磁盘移动到不同的节点中
使用本地卷存储的虚拟机可被移动,以便在特定节点中运行。
因为以下原因,您可能想要将该虚拟机移动到特定的节点上:
- 当前节点对本地存储配置有限制。
- 新节点对那个虚拟机的工作负载进行了更好的优化。
要移动使用本地存储的虚拟机,您必须使用数据卷克隆基础卷。克隆操作完成后,您可以 编辑虚拟机配置,以便使用新数据卷,或 将新数据卷添加到其他虚拟机。
当您全局启用预分配或单个数据卷时,Containerized Data Importer(CDI)会在克隆过程中预分配磁盘空间。预分配可提高写入性能。如需更多信息,请参阅对数据卷使用预分配。
没有 cluster-admin
角色的用户需要额外的用户权限才能在 命名空间间克隆卷。
8.19.11.1. 克隆本地卷到另一个节点
您可以通过克隆底层 PVC,移动虚拟机磁盘使其在特定节点上运行。
要确保虚拟机磁盘克隆到正确的节点,您必须创建新的持久性卷(PV)或在正确的节点上识别它。对 PV 应用一个唯一标签,以便数据卷可以引用它。
目标 PV 的大小不得小于源 PVC。如果目标 PV 小于源 PVC,克隆操作会失败。
先决条件
- 虚拟机不能正在运行。在克隆虚拟机磁盘前关闭虚拟机。
流程
在节点上创建新本地 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
已存在于节点上的一个 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 ...
为 PV 添加唯一标签:
$ oc label pv <destination-pv> node=node01
创建引用以下内容的数据卷清单:
- 虚拟机的 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
通过将数据卷清单应用到集群来开始克隆操作:
$ oc apply -f <clone-datavolume.yaml>
数据卷将虚拟机的 PVC 克隆到特定节点上的 PV 中。
8.19.12. 通过添加空白磁盘镜像扩展虚拟存储
您可向 OpenShift Virtualization 添加空白磁盘镜像来提高存储容量或创建新数据分区。
8.19.12.1. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。
8.19.12.2. 使用数据卷创建空白磁盘镜像
您可以通过自定义和部署数据卷配置文件在持久性卷声明中创建新空白磁盘镜像。
先决条件
- 至少一个可用持久性卷。
-
安装 OpenShift CLI(
oc
)。
流程
编辑
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
运行以下命令,创建空白磁盘镜像:
$ oc create -f <blank-image-datavolume>.yaml
8.19.12.3. 其他资源
- 配置预分配模式以提高数据卷操作的写入性能。
8.19.13. 使用 smart-cloning(智能克隆) 克隆数据卷
Smart-cloning(智能克隆)是 Red Hat OpenShift Data Foundation 的内置功能。与主机辅助克隆相比,智能克隆速度更快、效率更高。
您不需要执行任何操作来启用智能克隆功能,但需要确保您的存储环境与智能克隆兼容。
使用持久性卷声明(PVC)源创建数据卷时,会自动启动克隆过程。如果您的环境支持智能克隆,则始终会收到数据卷的克隆。但是,只有存储供应商支持智能克隆时,才会获得智能克隆的性能优势。
8.19.13.1. 关于智能克隆
当一个数据卷被智能克隆时,会出现以下情况:
- 创建源持久性卷声明(PVC)的快照。
- 从快照创建一个 PVC。
- 快照被删除。
8.19.13.2. 克隆数据卷
先决条件
要实现智能克隆,需要满足以下条件:
- 您的存储供应商必须支持快照。
- 源和目标 PVC 必须定义为相同的存储类。
- 源和目标 PVC 共享相同的 volumeMode。
-
VolumeSnapshotClass
对象必须引用定义为源和目标 PVC 的存储类。
流程
启动数据卷克隆:
为
DataVolume
对象创建一个 YAML 文件,用于指定新数据卷的名称以及源 PVC 的名称和命名空间。在这个示例中,因为指定了 storage API,因此不需要指定 accessModes 或 volumeMode。将自动为您计算最佳值。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
通过创建数据卷开始克隆 PVC:
$ oc create -f <cloner-datavolume>.yaml
注意在 PVC 就绪前,DataVolume 会阻止虚拟机启动,以便您可以在 PVC 克隆期间创建引用新数据卷的虚拟机。
8.19.13.3. 其他资源
- 将虚拟机磁盘的持久性卷声明克隆到新数据卷中
- 配置预分配模式以提高数据卷操作的写入性能。
- 自定义存储配置集
8.19.14. 创建并使用引导源
引导源包含可引导操作系统(OS)以及操作系统的所有配置设置,如驱动程序。
您可以使用引导源创建带有特定配置的虚拟机模板。这些模板可用于创建任意数量的可用虚拟机。
OpenShift Container Platform Web 控制台提供了快速入门导览,可帮助您创建自定义引导源、上传引导源和其他任务。从 Help 菜单中选择 Quick Starts 以查看快速入门。
8.19.14.1. 关于虚拟机和引导源
虚拟机由虚拟机定义以及由数据卷支持的一个或多个磁盘组成。虚拟机模板允许您使用预定义的虚拟机规格创建虚拟机。
每个虚拟机模板都需要一个引导源,它是一个完全配置的虚拟机磁盘镜像,包括配置的驱动程序。每个虚拟机模板包含一个虚拟机定义,其中包含指向引导源的指针。每个引导源都有一个预定义的名称和命名空间。对于某些操作系统,会自动提供一个引导源。如果没有提供,管理员必须准备自定义引导源。
提供的引导源会自动更新至操作系统的最新版本。对于自动更新的引导源,持久性卷声明(PVC)使用集群的默认存储类创建。如果在配置后选择了不同的默认存储类,您必须删除使用之前的默认存储类配置的集群命名空间中的现有数据卷。
要使用引导源功能,请安装 OpenShift Virtualization 的最新版本。命名空间 openshift-virtualization-os-images
启用该功能,并安装 OpenShift Virtualization Operator。安装引导源功能后,您可以创建引导源,将它们附加到模板,并从模板创建虚拟机。
使用通过上传本地文件、克隆现有 PVC、从 registry 或 URL 导入的持久性卷声明(PVC)定义引导源。使用 web 控制台将引导源附加到虚拟机模板。在启动源附加到虚拟机模板后,您可从模板创建任意数量的已完全配置的可随时使用虚拟机。
8.19.14.2. 将 RHEL 镜像导入为引导源
您可以通过指定镜像的 URL 来导入 Red Hat Enterprise Linux(RHEL)镜像作为引导源。
先决条件
- 您必须有权访问带有操作系统镜像的网页。例如:使用镜像下载 Red Hat Enterprise Linux 网页。
流程
-
在 OpenShift Container Platform 控制台中,从侧边菜单中点 Virtualization
Templates。 - 找到您要为其配置引导源的 RHEL 模板并点 Add source。
- 在 Add boot source to template 窗口中,从 Boot source type 列表中选择 URL(creates PVC)。
- 点击 RHEL 下载页面 访问红帽客户门户。下载 Red Hat Enterprise Linux 页面中显示可用安装程序和镜像的列表。
- 确定您要下载的 Red Hat Enterprise Linux KVM 客户机镜像。右键单击 Download Now,再复制镜像的 URL。
- 在 Add boot source to template 窗口中,将 URL 粘贴到 Import URL 字段中,然后点 Save and import。
验证
- 验证模板在 Templates 页面上的 Boot source 列中显示绿色勾号。
现在,您可以使用此模板创建 RHEL 虚拟机。
8.19.14.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。
流程
-
在 OpenShift Container Platform 控制台中,从侧边菜单中点 Virtualization
Templates。 - 点模板旁边的选项菜单,然后选择 Edit boot source。
- 点 Add disk。
- 在 Add disk 窗口中,选择 Use this disk 作为引导源。
- 输入磁盘名称并选择 Source,例如 Blank(creates PVC) 或 使用现有 PVC。
- 为 持久性卷声明大小 输入一个值,以指定适合未压缩镜像的 PVC 大小,以及任何需要的额外空间。
- 选择一个 Type,如 Disk 或 CD-ROM。
可选:点 Storage class 并选择用于创建磁盘的存储类。通常,这个存储类是创建供所有 PVC 使用的默认存储类。
注意提供的引导源会自动更新至操作系统的最新版本。对于自动更新的引导源,持久性卷声明(PVC)使用集群的默认存储类创建。如果在配置后选择了不同的默认存储类,您必须删除使用之前的默认存储类配置的集群命名空间中的现有数据卷。
- 可选:清除 Apply optimized StorageProfile settings,以编辑访问模式或卷模式。
选择保存引导源的适当方法:
- 如果您上传一个本地文件,请点击 Save and upload。
- 如果从 URL 或 registry 中导入内容,点 Save and import。
- 如果克隆现有的 PVC,点 Save and clone。
Catalog 页面中列出了带有引导源的自定义虚拟机模板。您可以使用此模板创建虚拟机。
8.19.14.4. 从带有附加引导源的模板创建虚拟机
将引导源添加到模板后,即可从模板创建虚拟机。
流程
-
在 OpenShift Container Platform web 控制台中,在侧边菜单中点 Virtualization
Catalog。 - 选择更新的模板并点 Quick create VirtualMachine。
VirtualMachine 详情会显示状态为 Starting。
8.19.14.5. 创建自定义引导源
您可以基于现有磁盘镜像准备自定义磁盘镜像,以用作引导源。
使用这个流程完成以下任务:
- 准备自定义磁盘镜像
- 从自定义磁盘镜像创建引导源
- 将引导源附加到自定义模板
流程
-
在 OpenShift Container Platform 控制台中,从侧边菜单中点 Virtualization
Templates。 - 点您要自定义的模板的 Boot source 列中的链接。此时将显示一个窗口,表明模板当前具有定义的源。
- 在窗口中,单击 Customize source 链接。
- 在阅读有关引导源自定义过程的信息后,单击 About boot source Custom 窗口中的 Continue 以继续自定义。
在 Prepare boot source Custom 页面中的 Define new template 部分:
- 选择 New template namespace 字段,然后选择项目。
- 在 New template name 字段中输入自定义模板的名称。
- 在 New template provider 字段中输入模板提供程序名称。
- 选择 New template support 字段,然后选择适当的值,指示您创建的自定义模板的支持联系人。
- 选择 New template flavor 字段,然后选择您创建的自定义镜像的适当 CPU 和内存值。
-
在 Prepare boot source for custom 部分中,根据需要自定义
cloud-init
YAML 脚本来定义登录凭据。否则,脚本会为您生成默认凭据。 - 单击 Start Customization。自定义过程开始并显示 Preparing boot source Custom 页面,然后显示 Customize boot source 页面。Customize boot source 页面显示正在运行的脚本的输出。脚本完成后,您的自定义镜像将可用。
- 在 VNC 控制台 中,单击 Guest login credentials 部分中的 show password。您的登录凭据显示。
- 镜像准备好登录时,通过提供 guest 登录凭证部分中显示的用户名和密码来登录 VNC 控制台。
- 验证自定义镜像按预期工作。如果存在,点 Make this boot source available。
- 在 Finish custom and make template available 窗口中,选择 I have sealed the boot source,以便它用作模板,然后单击 Apply。
- 在 Finishing boot source Custom 页面上,等待模板创建过程完成。点 Navigate to template details 或 Navigate to template list 查看从自定义引导源创建的自定义模板。
8.19.14.6. 其他资源
8.19.15. 热插拔虚拟磁盘
希望在不停止虚拟机或虚拟机实例的情况下添加或删除热插拔和热插拔虚拟磁盘。当您需要在不发生停机时间的情况下向正在运行的虚拟机添加存储时,此功能非常有用。
当您热插拔虚拟磁盘时,可以在虚拟机运行时将虚拟磁盘附加到虚拟机实例中。
当热拔虚拟磁盘时,您可以在虚拟机运行时从虚拟机实例分离虚拟磁盘。
只有数据卷和持久性卷声明(PVC)才能热插和热拔。您不能热插或热拔容器磁盘。
8.19.15.1. 使用 CLI 热插虚拟磁盘
在虚拟机运行时热插要附加到虚拟机实例(VMI)的虚拟磁盘。
先决条件
- 您必须有一个正在运行的虚拟机才能热插虚拟磁盘。
- 您必须至少有一个数据卷或持久性卷声明(PVC)可用于热插。
流程
运行以下命令进行虚拟磁盘热插:
$ virtctl addvolume <virtual-machine|virtual-machine-instance> --volume-name=<datavolume|PVC> \ [--persist] [--serial=<label-name>]
-
使用可选
--persist
标志,将热插磁盘作为永久挂载的虚拟磁盘添加到虚拟机规格中。停止、重新启动或重新启动虚拟机以永久挂载虚拟磁盘。指定--persist
标志后,您无法再热插或热拔虚拟磁盘。Persist
标志适用于虚拟机,不适用于虚拟机实例。 -
可选
--serial
标志允许您添加您选择的字母数字字符串标签。这有助于您识别客户机虚拟机中的热插磁盘。如果没有指定这个选项,则标签默认为热插数据卷或 PVC 的名称。
-
使用可选
8.19.15.2. 使用 CLI 热拔虚拟磁盘
在虚拟机运行时,热拔您想要从虚拟机实例(VMI)断开的虚拟磁盘。
先决条件
- 您的虚拟机必须正在运行。
- 您必须至少有一个数据卷或持久性卷声明(PVC)可用并为热插。
流程
运行以下命令来热拔虚拟磁盘:
$ virtctl removevolume <virtual-machine|virtual-machine-instance> --volume-name=<datavolume|PVC>
8.19.15.3. 使用 web 控制台热插虚拟磁盘
在虚拟机运行时热插要附加到虚拟机实例(VMI)的虚拟磁盘。
先决条件
- 您必须有一个正在运行的虚拟机才能热插虚拟磁盘。
流程
-
在侧边菜单中点 Virtualization
VirtualMachines。 - 选择一个正在运行的虚拟机以打开 VirtualMachine 详情页面。
- 在 Disks 选项卡上,点 Add disk。
- 在 Add disk 窗口中,填写您要热插的虚拟磁盘的信息。
- 点击 Add。
8.19.15.4. 使用 web 控制台热拔出虚拟磁盘
在虚拟机运行时热拔要附加到虚拟机实例(VMI)的虚拟磁盘。
先决条件
- 虚拟机必须在连接热插拔磁盘的情况下运行。
流程
-
在侧边菜单中点 Virtualization
VirtualMachines。 - 使用您要热拔的磁盘选择正在运行的虚拟机以打开 VirtualMachine 详情页面。
- 在 Disks 选项卡中,点您要热拔的虚拟磁盘的 Options 菜单 。
- 点击 Delete。
8.19.16. 将容器磁盘与虚拟机搭配使用
您可以将虚拟机镜像构建到容器磁盘中,并将其存储在容器 registry 中。然后,您可以将容器磁盘导入虚拟机的持久性存储中,或者将其直接附加到虚拟机临时存储。
如果您使用大型容器磁盘,则 I/O 流量可能会增加,影响 worker 节点。这可能导致不可用的节点。您可以通过以下方法解决这个问题:
8.19.16.1. 关于容器磁盘
容器磁盘是一个虚拟机镜像,它作为容器镜像存储在容器镜像 registry 中。您可以使用容器磁盘将同一磁盘镜像传送到多个虚拟机,并创建大量虚拟机克隆。
容器磁盘可以使用附加到虚拟机的数据卷导入到持久性卷声明(PVC),也可以作为临时 containerDisk
卷直接附加到虚拟机。
8.19.16.1.1. 使用数据卷将容器磁盘导入到 PVC 中
通过 Containerized Data Importer(CDI)使用数据卷将容器磁盘导入到 PVC 中。然后,您可以将数据卷附加到虚拟机以获取持久性存储。
8.19.16.1.2. 将容器磁盘作为 containerDisk
卷附加到虚拟机
containerDisk
卷是临时的。将在虚拟机停止、重启或删除时丢弃。当一个带有 containerDisk
卷的虚拟机启动时,容器镜像从 registry 中拉取,并托管在托管虚拟机的节点上。
将 containerDisk
卷用于只读文件系统,如 CD-ROM 或可处理的虚拟机。
不建议将 containerDisk
卷用于读写文件系统,因为数据是临时写入托管节点上的本地存储。这会减慢虚拟机的实时迁移速度,如节点维护,因为数据必须迁移到目标节点。另外,如果节点断电或者意外关闭,则所有数据都会丢失。
8.19.16.2. 为虚拟机准备容器磁盘
您必须使用虚拟机镜像构建容器磁盘,并将其推送到容器 registry,然后才能用于虚拟机。然后,您可以使用数据卷将容器磁盘导入到 PVC 中,并将其附加到虚拟机,或者将容器磁盘作为临时 containerDisk
卷直接附加到虚拟机。
容器磁盘中磁盘镜像的大小受托管容器磁盘的 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
如果容器镜像敞开没有 TLS,您必须将其添加为一个不安全的容器镜像仓库,然后才能将容器磁盘导入持久性存储。
8.19.16.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 主机名。
8.19.16.4. 后续步骤
- 将容器磁盘导入虚拟机的持久性存储中。
-
创建一个虚拟机,它使用一个
containerDisk
卷作为临时存储。
8.19.17. 准备 CDI 涂销空间
8.19.17.1. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。
8.19.17.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。
8.19.17.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。 |
8.19.17.4. 定义存储类
您可以通过将 spec.scratchSpaceStorageClass
字段添加到 HyperConverged
自定义资源(CR)来定义 Containerized Data Importer(CDI)在分配涂销空间时使用的存储类。
先决条件
-
安装 OpenShift CLI (
oc
) 。
流程
运行以下命令来编辑
HyperConverged
CR:$ oc edit hco -n openshift-cnv kubevirt-hyperconverged
将
spec.scratchSpaceStorageClass
字段添加到 CR,将值设置为集群中存在的存储类的名称:apiVersion: hco.kubevirt.io/v1beta1 kind: HyperConverged metadata: name: kubevirt-hyperconverged spec: scratchSpaceStorageClass: "<storage_class>" 1
- 1
- 如果您没有指定存储类,CDI 将使用正在填充的持久性卷声明的存储类。
-
保存并退出默认编辑器以更新
HyperConverged
CR。
8.19.17.5. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间
8.19.17.6. 其他资源
8.19.18. 重新使用持久性卷
要重新使用静态置备的持久性卷(PV),,您必须首先重新声明该卷。这涉及删除 PV,以便重新使用存储配置。
8.19.18.1. 关于重新声明静态置备的持久性卷
当重新声明持久性卷(PV)时,您从持久性卷声明(PVC)中卸载 PV 并删除 PV。根据底层存储,您可能需要手动删除共享存储。
然后,您可以重新使用 PV 配置来创建具有不同名称的 PV。
静态置备的 PV 必须具有 Retain
的重新声明策略才能重新声明。如果没有,则当 PVC 取消和 PV 的绑定后,PV 将进入失败的状态。
在 OpenShift Container Platform 4 中, Recycle
重新声明策略已被弃用。
8.19.18.2. 重新声明静态置备的持久性卷
通过取消绑定持久性卷声明(PVC)并删除 PV 重新声明静态置备的持久性卷(PV)。您可能还需要手动删除共享存储。
重新声明静态置备的 PV 依赖于底层存储。此流程提供一般方法,可能需要根据您的存储进行调整。
流程
确保 PV 的 reclaim 策略被设置为
Retain
:检查 PV 上的 reclaim 策略:
$ oc get pv <pv_name> -o yaml | grep 'persistentVolumeReclaimPolicy'
如果
persistentVolumeReclaimPolicy
没有设置为Retain
,使用以下命令编辑 reclaim 策略:$ oc patch pv <pv_name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
确保没有资源在使用 PV:
$ oc describe pvc <pvc_name> | grep 'Mounted By:'
在继续操作前,删除所有使用 PVC 的资源。
删除 PVC 以释放 PV:
$ oc delete pvc <pvc_name>
可选:将 PV 配置导出到 YAML 文件。如果在稍后手动删除共享存储,您可以参考此配置。您还可以使用该文件中的
spec
参数作为基础,在重新声明 PV 后创建具有相同存储配置的新 PV:$ oc get pv <pv_name> -o yaml > <file_name>.yaml
删除 PV:
$ oc delete pv <pv_name>
可选:根据存储类型,您可能需要删除共享存储文件夹的内容:
$ rm -rf <path_to_share_storage>
可选:创建一个使用与删除 PV 相同的存储配置的 PV。如果您之前导出了重新声明的 PV 配置,您可以使用该文件的
spec
参数作为新 PV 清单的基础:注意为了避免可能的冲突,最好为新 PV 对象赋予与您删除的名称不同的名称。
$ oc create -f <new_pv_name>.yaml
其他资源
- 为虚拟机配置本地存储
- OpenShift Container Platform Storage 文档包含更多有关持久性存储的信息。
8.19.19. 扩展虚拟机磁盘
您可以通过调整磁盘持久性卷声明(PVC)大小来扩大虚拟机(VM)磁盘的大小,以提供更大的存储容量。
但是,您无法缩小虚拟机磁盘的大小。
8.19.19.1. 划分虚拟机磁盘
VM 磁盘扩大为虚拟机提供额外空间。但是,虚拟机所有者负责决定如何使用存储。
如果磁盘是一个 Filesystem
PVC,则匹配的文件会扩展到剩余大小,同时为文件系统开销保留一些空间。
流程
编辑您要扩展的虚拟机磁盘的
PersistentVolumeClaim
清单:$ oc edit pvc <pvc_name>
将
spec.resource.requests.storage
属性的值更改为较大的大小。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: vm-disk-expand spec: accessModes: - ReadWriteMany resources: requests: storage: 3Gi 1 ...
- 1
- 可增加的 VM 磁盘大小
8.19.19.2. 其他资源
8.19.20. 删除数据卷
您可以使用 oc
CLI 手动删除数据卷。
当您删除虚拟机时,其使用的数据卷会被自动删除。
8.19.20.1. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。
8.19.20.2. 列出所有数据卷
您可以使用 oc
CLI 列出集群中的数据卷。
流程
运行以下命令列出所有数据卷:
$ oc get dvs
8.19.20.3. 删除数据卷
您可以使用 oc
CLI 删除数据卷。
先决条件
- 找出您要删除的数据卷的名称。
流程
运行以下命令来删除数据卷:
$ oc delete dv <datavolume_name>
注意此命令只删除当前项目中存在的对象。如果您要删除其他项目或命名空间中的对象,请使用
-n <project_name>
选项。