8.18. 虚拟机磁盘
8.18.1. 存储特性
使用下表来决定 OpenShift Virtualization 中的本地和共享持久性存储的功能可用性。
8.18.1.1. OpenShift Virtualization 存储功能列表
虚拟机实时迁移 | 主机辅助虚拟机磁盘克隆 | 存储辅助虚拟机磁盘克隆 | 虚拟机快照 | |
---|---|---|---|---|
OpenShift Container Storage: RBD 块模式卷 | 是 | 是 | 是 | 是 |
OpenShift Virtualization hostpath 置备程序 | 不是 | 是 | 否 | 否 |
其他多节点可写入存储 | 是 [1] | 是 | 是 [2] | 是 [2] |
其他单节点可写入存储 | 否 | 是 | 是 [2] | 是 [2] |
- PVC 必须请求 ReadWriteMany 访问模式。
- 存储供应商必须支持 Kubernetes 和 CSI 快照 API
您无法实时迁移使用以下配置的虚拟机:
- 具有 ReadWriteOnce(RWO)访问模式的存储类
-
透传功能(如 GPU 或 SR-IOV 网络接口)带有
sriovLiveMigration
功能被禁用。
对于这些虚拟机,不要将 evictionStrategy
字段设置为 LiveMigrate
。
8.18.2. 为虚拟机配置本地存储
您可以使用 hostpath 置备程序功能为您的虚拟机配置本地存储。
8.18.2.1. 关于 hostpath 置备程序
hostpath 置备程序是设计用于 OpenShift Virtualization 的本地存储置备程序。如果要为虚拟机配置本地存储,您必须首先启用 hostpath 置备程序。
安装 OpenShift Virtualization Operator 时,会自动安装 hostpath 置备程序 Operator。要使用它,您必须:
配置 SELinux:
-
如果使用 Red Hat Enterprise Linux CoreOS(RHCOS)8 worker,您必须在每个节点上创建一个
MachineConfig
对象。 -
否则,将 SELinux 标签
container_file_t
应用到每个节点上的由持久性卷(PV)支持的目录中。
-
如果使用 Red Hat Enterprise Linux CoreOS(RHCOS)8 worker,您必须在每个节点上创建一个
-
创建
HostPathProvisioner
自定义资源。 -
为 hostpath 置备程序创建
StorageClass
对象。
在创建自定义资源时,hostpath 置备程序 Operator 将部署置备程序作为每个节点上的 DaemonSet。在自定义资源文件中,您将指定 hostpath 置备程序创建的持久性卷的后端目录。
8.18.2.2. 在 Red Hat Enterprise Linux CoreOS(RHCOS)8 上为 hostpath 置备程序配置 SELinux
在创建 HostPathProvisioner
自定义资源前,您必须配置 SELinux。要在 Red Hat Enterprise Linux CoreOS(RHCOS)8 worker 上配置 SELinux,您必须在每个节点上创建一个 MachineConfig
对象。
先决条件
在每个节点上为 hostpath 置备程序创建的持久性卷(PV)创建后端目录。
重要后备目录不得位于文件系统的根目录中,因为
/
分区在 RHCOS 中是只读的。例如,您可以使用/var/<directory_name>
而不是/<directory_name>
。警告如果您选择了与您的操作系统共享空间的目录,则可能会耗尽该分区中的空间,且节点可能会无法正常工作。创建单独的分区,并将 hostpath 置备程序指向单独的分区,以避免干扰您的操作系统。
流程
创建
MachineConfig
文件。例如:$ touch machineconfig.yaml
编辑该文件,确保包含希望 hostpath 置备程序在其中创建 PV 的目录。例如:
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: name: 50-set-selinux-for-hostpath-provisioner labels: machineconfiguration.openshift.io/role: worker spec: config: ignition: version: 3.2.0 systemd: units: - contents: | [Unit] Description=Set SELinux chcon for hostpath provisioner Before=kubelet.service [Service] ExecStart=/usr/bin/chcon -Rt container_file_t <backing_directory_path> 1 [Install] WantedBy=multi-user.target enabled: true name: hostpath-provisioner.service
- 1
- 指定希望置备程序在其中创建 PV 的后备目录。该目录不能位于文件系统的根目录(
/
)中。
创建
MachineConfig
对象:$ oc create -f machineconfig.yaml -n <namespace>
8.18.2.3. 使用 hostpath 置备程序启用本地存储
要部署 hostpath 置备程序并使虚拟机能够使用本地存储,请首先创建一个 HostPathProvisioner
自定义资源。
先决条件
在每个节点上为 hostpath 置备程序创建的持久性卷(PV)创建后端目录。
重要后备目录不得位于文件系统的根目录中,因为
/
分区在 Red Hat Enterprise Linux CoreOS(RHCOS)中是只读的。例如,您可以使用/var/<directory_name>
而不是/<directory_name>
。警告如果您选择了与您的操作系统共享空间的目录,则可能会耗尽该分区中的空间,且节点可能会无法正常工作。创建单独的分区,并将 hostpath 置备程序指向单独的分区,以避免干扰您的操作系统。
将 SELinux 上下文
container_file_t
应用到每个节点上的 PV 后备目录。例如:$ sudo chcon -t container_file_t -R <backing_directory_path>
注意如果使用 Red Hat Enterprise Linux CoreOS(RHCOS)8 worker,则必须使用
MachineConfig
清单配置 SELinux。
流程
创建
HostPathProvisioner
自定义资源文件。例如:$ touch hostpathprovisioner_cr.yaml
编辑该文件,确保
spec.pathConfig.path
值是您希望 hostpath 置备程序在其中创建 PV 的目录。例如:apiVersion: hostpathprovisioner.kubevirt.io/v1beta1 kind: HostPathProvisioner metadata: name: hostpath-provisioner spec: imagePullPolicy: IfNotPresent pathConfig: path: "<backing_directory_path>" 1 useNamingPrefix: false 2 workload: 3
注意如果您没有创建后备目录,则置备程序会尝试为您创建该目录。如果您没有应用
container_file_t
SELinux 上下文,这会导致Permission denied
。在
openshift-cnv
命名空间中创建自定义资源:$ oc create -f hostpathprovisioner_cr.yaml -n openshift-cnv
其他资源
8.18.2.4. 创建存储类
当您创建存储类时,您将设置参数,它们会影响属于该存储类的持久性卷(PV)的动态置备。您不能在创建 StorageClass
对象后更新其参数。
在 OpenShift Container Platform Container Storage 中使用 OpenShift Virtualization 时,指定创建虚拟机磁盘时 RBD 块模式持久性卷声明(PVC)。使用虚拟机磁盘时,RBD 块模式卷更高效,并且比 Ceph FS 或 RBD 文件系统模式 PVC 提供更好的性能。
要指定 RBD 块模式 PVC,请使用 'ocs-storagecluster-ceph-rbd' 存储类和 VolumeMode: Block
。
流程
创建用于定义存储类的 YAML 文件。例如:
$ touch storageclass.yaml
编辑该文件。例如:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: hostpath-provisioner 1 provisioner: kubevirt.io/hostpath-provisioner reclaimPolicy: Delete 2 volumeBindingMode: WaitForFirstConsumer 3
注意虚拟机使用基于本地 PV 的数据卷。本地 PV 与特定节点绑定。虽然磁盘镜像准备供虚拟机消耗,但可能不会将虚拟机调度到之前固定本地存储 PV 的节点。
要解决这个问题,使用 Kubernetes pod 调度程序将 PVC 绑定到正确的节点上的 PV。通过使用
volumeBindingMode
设置为WaitForFirstConsumer
的StorageClass
,PV 的绑定和置备会延迟到Pod
创建前。创建
StorageClass
对象:$ oc create -f storageclass.yaml
其他资源
8.18.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.18.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.18.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.18.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: <some_unknown_provisioner_class> # ... spec: {} status: provisioner: <some_unknown_provisioner> storageClass: <some_unknown_provisioner_class>
在存储配置集中提供所需的属性值:
存储配置集示例
apiVersion: cdi.kubevirt.io/v1beta1 kind: StorageProfile metadata: name: <some_unknown_provisioner_class> # ... spec: claimPropertySets: - accessModes: - ReadWriteOnce 1 volumeMode: Filesystem 2 status: provisioner: <some_unknown_provisioner> storageClass: <some_unknown_provisioner_class>
保存更改后,所选值将显示在存储配置集的
status
项中。
8.18.3.4. 其他资源
8.18.4. 为文件系统开销保留 PVC 空间
默认情况下,Containerized Data Importer(CDI)会在使用 Filesystem
卷模式的持久性卷声明(PVC)中为文件系统的开销数据预留空间。您可以在全局范围内设置 CDI 保留的百分比,并用于特定存储类。
8.18.4.1. 文件系统的开销对虚拟机磁盘空间的影响
当您向使用 Filesystem
卷模式的持久性卷声明(PVC)添加虚拟机磁盘时,必须确保 PVC 中有足够的空间用于:
- 虚拟机磁盘。
- 用于文件系统开销(如元数据)的 Containerized Data Importer(CDI)保留空间。
默认情况下,CDI 为开销保留 5.5% 的 PVC 空间,从而减少了虚拟机磁盘的可用空间。
您可以编辑 CDI
对象来配置使用不同的开销值。您可以在全局范围内更改值,也可以为特定存储类指定值。
8.18.4.2. 覆盖默认文件系统开销值
通过编辑 CDI
对象的 spec.config.filesystemOverhead
属性来更改 Containerized Data Importer(CDI)为文件系统开销保留的持久性卷声明(PVC)空间大小。
先决条件
-
安装 OpenShift CLI (
oc
) 。
流程
运行以下命令打开
CDI
对象进行编辑:$ oc edit cdi
编辑
spec.config.filesystemOverhead
字段,使用您选择的值填充它们:... spec: config: filesystemOverhead: global: "<new_global_value>" 1 storageClass: <storage_class_name>: "<new_value_for_this_storage_class>" 2
-
保存并退出编辑器以更新
CDI
对象。
验证
运行以下命令来查看
CDI
状态并验证您的更改:$ oc get cdi -o yaml
8.18.5. 配置 CDI 以使用具有计算资源配额的命名空间
您可以使用 Containerized Data Importer(CDI)将虚拟机磁盘导入、上传并克隆到命名空间中,这可能受 CPU 和内存资源限制。
8.18.5.1. 关于命名空间中的 CPU 和内存配额
资源配额 由 ResourceQuota
对象定义,对一个命名空间实施限制,该命名空间限制可被该命名空间中资源消耗的计算资源总量。
HyperConverged
自定义资源(CR)定义了 Containerized Data Importer(CDI)的用户配置。CPU 和内存请求和限制值设置为默认值 0
。这样可确保由 CDI 创建的无需计算资源要求的 Pod 具有默认值,并允许在使用配额限制的命名空间中运行。
8.18.5.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.18.5.3. 其他资源
8.18.6. 管理数据卷注解
数据卷(DV)注解允许您管理 pod 行为。您可以将一个或多个注解添加到数据卷,然后将其传播到创建的导入程序 pod。
8.18.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 网络注解
8.18.7. 对数据卷使用预分配
Containerized Data Importer 可以预先分配磁盘空间,以便在创建数据卷时提高写入性能。
您可以为特定数据卷启用预分配。
8.18.7.1. 关于预分配
Containerized Data Importer(CDI)可以使用 QEMU 预先分配数据卷模式来提高写入性能。您可以使用预分配模式导入和上传操作,并在创建空白数据卷时使用。
如果启用了预分配,CDI 根据底层文件系统和设备类型使用更好的预分配方法:
fallocate
-
如果文件系统支持它,CDI 通过使用
posix_fallocate
功能(它分配块并将其标记为未初始化),来使用操作系统本身的(fallocate
调用来预分配空间。 full
-
如果无法使用
fallocate
模式,则会使用full
模式通过将数据写入底层存储来为镜像分配空间。根据存储位置,所有空分配的空间都可能会为零。
8.18.7.2. 为数据卷启用预分配
您可以通过在数据卷清单中包含 spec.preallocation
字段来为特定数据卷启用预分配。您可以在 web 控制台中或使用 OpenShift CLI (oc
) 启用预分配模式。
所有 CDI 源类型都支持 Preallocation 模式。
8.18.8. 使用 Web 控制台上传本地磁盘镜像
您可以使用 web 控制台上传本地存储的磁盘镜像文件。
8.18.8.1. 先决条件
- 您必须有 IMG、ISO 或 QCOW2 格式的虚拟机镜像文件。
- 如果您根据 CDI 支持的操作列表要求涂销空间,您必须首先定义一个 StorageClass 或准备 CDI 涂销空间才能成功完成此操作。
8.18.8.2. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间
8.18.8.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.18.8.4. 其他资源
- 配置预分配模式以提高数据卷操作的写入性能。
8.18.9. 使用 virtctl 工具上传本地磁盘镜像
您可使用 virtctl
命令行实用程序将本地存储的磁盘镜像上传到新的或已有的数据卷中。
8.18.9.1. 先决条件
-
安装
kubevirt-virtctl
软件包。 - 如果您根据 CDI 支持的操作列表要求涂销空间,您必须首先定义一个 StorageClass 或准备 CDI 涂销空间才能成功完成此操作。
8.18.9.2. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。
8.18.9.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.18.9.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.18.9.5. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间
8.18.9.6. 其他资源
- 配置预分配模式以提高数据卷操作的写入性能。
8.18.10. 上传本地磁盘镜像至块存储数据卷
您可以使用 virtctl
命令行实用程序将本地磁盘镜像上传到块数据卷中。
在此工作流中,您会创建一个本地块设备用作 PV,将此块卷与 upload
数据卷关联,并使用 virtctl
将本地磁盘镜像上传至数据卷中。
8.18.10.1. 先决条件
-
安装
kubevirt-virtctl
软件包。 - 如果您根据 CDI 支持的操作列表要求涂销空间,您必须首先定义一个 StorageClass 或准备 CDI 涂销空间才能成功完成此操作。
8.18.10.2. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。
8.18.10.3. 关于块持久性卷
块持久性卷(PV)是一个受原始块设备支持的 PV。这些卷没有文件系统,可以通过降低开销来为虚拟机提供性能优势。
原始块卷可以通过在 PV 和持久性卷声明(PVC)规格中指定 volumeMode: Block
来置备。
8.18.10.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.18.10.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.18.10.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.18.10.7. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间
8.18.10.8. 其他资源
- 配置预分配模式以提高数据卷操作的写入性能。
8.18.11. 管理离线虚拟机快照
您可以为关闭(离线)的虚拟机创建、恢复和删除虚拟机快照。OpenShift Virtualization 支持以下离线虚拟机快照:
- OpenShift Container Storage
- 使用支持 Kubernetes 卷快照 API 的 Container Storage Interface(CSI)驱动程序的任何其他存储供应商
8.18.11.1. 关于虚拟机快照
快照 代表虚拟机(VM)在特定时间点的状态和数据。您可以使用快照将现有虚拟机恢复到以前的状态(由快照代表)进行备份和恢复,或者快速回滚到以前的开发版本。
从关闭(停止状态)的虚拟机创建离线虚拟机快照。快照存储附加到虚拟机的每个 Container Storage Interface(CSI)卷的副本以及虚拟机规格和元数据的副本。创建后无法更改快照。
通过离线虚拟机快照功能,集群管理员和应用程序开发人员可以:
- 创建新快照
- 列出附加到特定虚拟机的所有快照
- 从快照恢复虚拟机
- 删除现有虚拟机快照
8.18.11.1.1. 虚拟机快照控制器和自定义资源定义(CRD)
VM 快照功能引入了三个新的 API 对象,定义为 CRD,用于管理快照:
-
VirtualMachineSnapshot
:代表创建快照的用户请求。它包含有关虚拟机当前状态的信息。 -
VirtualMachineSnapshotContent
:代表集群中置备的资源(快照)。它由虚拟机快照控制器创建,其中包含恢复虚拟机所需的所有资源的引用。 -
VirtualMachineRestore
:代表从快照中恢复虚拟机的用户请求。
VM 快照控制器会把一个 VirtualMachineSnapshotContent
对象与创建它的 VirtualMachineSnapshotContent
对象绑定,并具有一对一的映射。
8.18.11.2. 在 web 控制台中创建离线虚拟机快照
您可以使用 web 控制台创建虚拟机(VM)快照。
VM 快照只包含满足以下要求的磁盘:
- 必须是数据卷或持久性卷声明
- 属于支持容器存储接口(CSI)卷快照的存储类
如果您的虚拟机存储包含不支持快照的磁盘,您可以编辑它们或联系集群管理员。
流程
-
从侧边菜单中点 Workloads
Virtualization。 - 点 Virtual Machines 标签页。
- 选择虚拟机以打开 Virtual Machine Overview 屏幕。
-
如果虚拟机正在运行,请点 Actions
Stop Virtual Machine 关闭它。 - 点 Snapshots 标签页,然后点 Take Snapshot。
- 填写 Snapshot Name 和可选的 Description 字段。
- 扩展 Disks included in this Snapshot 以查看快照中包含的存储卷。
- 如果您的虚拟机磁盘无法包含在快照中,并且您仍然希望继续,请选择 I am aware of this warning and wish to proceed 复选框。
- 点 Save。
8.18.11.3. 通过 CLI 创建离线虚拟机快照
您可以通过创建一个 VirtualMachineSnapshot
对象来为离线虚拟机创建虚拟机快照。
先决条件
- 确保持久性卷声明(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
验证
验证
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.18.11.4. 在 web 控制台中从快照中恢复虚拟机
您可以将虚拟机(VM)恢复到 web 控制台中由快照表示的以前的配置。
流程
-
从侧边菜单中点 Workloads
Virtualization。 - 点 Virtual Machines 标签页。
- 选择虚拟机以打开 Virtual Machine Overview 屏幕。
-
如果虚拟机正在运行,请点 Actions
Stop Virtual Machine 关闭它。 - 点 Snapshots 标签页。该页面显示与虚拟机关联的快照列表。
选择以下方法之一恢复虚拟机快照:
- 对于您要用作恢复虚拟机的源的快照,点 Restore。
-
选择快照以打开 Snapshot Details 屏幕,然后点 Actions
Restore Virtual Machine Snapshot。
- 在确认弹出窗口中,点 Restore 可将虚拟机恢复到快照代表的以前的配置中。
8.18.11.5. 通过 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.18.11.6. 删除 web 控制台中的虚拟机快照
您可以使用 web 控制台删除现有虚拟机快照。
流程
-
从侧边菜单中点 Workloads
Virtualization。 - 点 Virtual Machines 标签页。
- 选择虚拟机以打开 Virtual Machine Overview 屏幕。
- 点 Snapshots 标签页。该页面显示与虚拟机关联的快照列表。
选择以下方法之一删除虚拟机快照:
- 点您要删除的虚拟机快照 的 Options 菜单,然后选择 Delete Virtual Machine Snapshot。
-
选择快照以打开 Snapshot Details 屏幕,然后点 Actions
Delete Virtual Machine Snapshot。
- 在确认弹出窗口中点 Delete 删除快照。
8.18.11.7. 通过 CLI 删除虚拟机快照
您可以通过删除正确的 VirtualMachineSnapshot
对象来删除现有虚拟机(VM)快照。
先决条件
-
安装 OpenShift CLI (
oc
) 。
流程
删除
VirtualMachineSnapshot
对象。快照控制器会删除VirtualMachineSnapshot
和关联的VirtualMachineSnapshotContent
对象。$ oc delete vmsnapshot <my-vmsnapshot>
验证
验证快照是否已删除,且不再附加到此虚拟机:
$ oc get vmsnapshot
8.18.11.8. 其他资源
8.18.12. 将本地虚拟机磁盘移动到不同的节点中
使用本地卷存储的虚拟机可被移动,以便在特定节点中运行。
因为以下原因,您可能想要将该虚拟机移动到特定的节点上:
- 当前节点对本地存储配置有限制。
- 新节点对那个虚拟机的工作负载进行了更好的优化。
要移动使用本地存储的虚拟机,您必须使用数据卷克隆基础卷。克隆操作完成后,您可以 编辑虚拟机配置,以便使用新数据卷,或 将新数据卷添加到其他虚拟机。
当您全局启用预分配或单个数据卷时,Containerized Data Importer(CDI)会在克隆过程中预分配磁盘空间。预分配可提高写入性能。如需更多信息,请参阅对数据卷使用预分配。
没有 cluster-admin
角色的用户需要 额外的用户权限 才能在命名空间间克隆卷。
8.18.12.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.18.13. 通过添加空白磁盘镜像扩展虚拟存储
您可向 OpenShift Virtualization 添加空白磁盘镜像来提高存储容量或创建新数据分区。
8.18.13.1. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。
8.18.13.2. 使用数据卷创建空白磁盘镜像
您可以通过自定义和部署数据卷配置文件在持久性卷声明中创建新空白磁盘镜像。
先决条件
- 至少一个可用持久性卷。
-
安装 OpenShift CLI(
oc
)。
流程
编辑数据卷配置文件:
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.18.13.3. 模板:空白磁盘镜像的数据卷配置文件
blank-image-datavolume.yaml
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
8.18.13.4. 其他资源
- 配置预分配模式以提高数据卷操作的写入性能。
8.18.14. 使用 smart-cloning(智能克隆) 克隆数据卷
Smart-cloning(智能克隆)是 OpenShift Container Platform Storage(OCS)的内置功能,旨在提高克隆过程的性能。使用智能克隆进行克隆比主机辅助克隆更快、效率更高。
您不需要执行任何操作来启用智能克隆功能,但需要确保您的存储环境与智能克隆兼容。
使用持久性卷声明(PVC)源创建数据卷时,会自动启动克隆过程。如果您的环境支持智能克隆,则始终会收到数据卷的克隆。但是,只有存储供应商支持智能克隆时,才会获得智能克隆的性能优势。
8.18.14.1. 了解智能克隆
当一个数据卷被智能克隆时,会出现以下情况:
- 创建源持久性卷声明(PVC)的快照。
- 从快照创建一个 PVC。
- 快照被删除。
8.18.14.2. 克隆数据卷
先决条件
要实现智能克隆,需要满足以下条件:
- 您的存储供应商必须支持快照。
- 源和目标 PVC 必须定义为相同的存储类。
-
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.18.14.3. 其他资源
- 将虚拟机磁盘的持久性卷声明克隆到新数据卷中
- 配置预分配模式以提高数据卷操作的写入性能。
8.18.15. 创建并使用引导源
引导源包含可引导操作系统(OS)以及操作系统的所有配置设置,如驱动程序。
您可以使用引导源创建带有特定配置的虚拟机模板。这些模板可用于创建任意数量的可用虚拟机。
OpenShift Container Platform Web 控制台提供了快速入门导览,可帮助您创建自定义引导源、上传引导源和其他任务。从 Help 菜单中选择 Quick Starts 以查看快速入门。
8.18.15.1. 关于虚拟机和引导源
虚拟机由虚拟机定义以及由数据卷支持的一个或多个磁盘组成。虚拟机模板允许您使用预定义的虚拟机规格创建虚拟机。
每个虚拟机模板都需要一个引导源,它是一个完全配置的虚拟机磁盘镜像,包括配置的驱动程序。每个虚拟机模板包含一个虚拟机定义,其中包含指向引导源的指针。每个引导源都有一个预定义的名称和命名空间。对于某些操作系统,会自动提供一个引导源。如果没有提供,管理员必须准备自定义引导源。
提供的引导源会自动更新至操作系统的最新版本。对于自动更新的引导源,持久性卷声明(PVC)使用集群的默认存储类创建。如果在配置后选择了不同的默认存储类,您必须删除使用之前的默认存储类配置的集群命名空间中的现有数据卷。
要使用引导源功能,请安装 OpenShift Virtualization 的最新版本。命名空间 openshift-virtualization-os-images
启用该功能,并安装 OpenShift Virtualization Operator。安装引导源功能后,您可以创建引导源,将它们附加到模板,并从模板创建虚拟机。
使用通过上传本地文件、克隆现有 PVC、从 registry 或 URL 导入的持久性卷声明(PVC)定义引导源。使用 web 控制台将引导源附加到虚拟机模板。在启动源附加到虚拟机模板后,您可从模板创建任意数量的已完全配置的可随时使用虚拟机。
8.18.15.2. 将 Red Hat Enterprise Linux 镜像导入为引导源
您可以通过指定镜像的 URL 地址,导入 Red Hat Enterprise Linux(RHEL)镜像作为引导源。
先决条件
- 您必须有权访问带有操作系统镜像的 Web 服务器。例如:带有镜像的 Red Hat Enterprise Linux 网页。
流程
-
在 OpenShift Virtualization 控制台中,从侧边菜单中点击 Workloads
Virtualization。 - 点 Templates 选项卡。
- 找到您要为其配置引导源的 RHEL 模板并点 Add source。
- 在 Add boot source to template 窗口中,从 Boot source type 列表中选择 Import via URL(creates PVC)。
- 点击 RHEL 下载页面 访问红帽客户门户。下载 Red Hat Enterprise Linux 页面中显示可用安装程序和镜像的列表。
- 确定您要下载的 Red Hat Enterprise Linux KVM 客户机镜像。右键单击 Download Now,再复制镜像的 URL。
- 在 Add boot source to template 窗口中,将 guest 镜像的复制 URL 粘贴到 Import URL 字段中,然后单击 Save and import。
验证
验证引导源是否已添加到模板中:
- 点 Templates 选项卡。
- 确认此模板的标题显示绿色勾号。
现在,您可以使用此模板创建 RHEL 虚拟机。
8.18.15.3. 为虚拟机模板添加引导源
对于您要用于创建虚拟机或自定义模板的任何虚拟机模板,可以配置引导源。当使用引导源配置虚拟机模板时,会在 Templates 选项卡中被标记为 Available。在向模板中添加引导源后,您可以使用该模板创建新虚拟机。
在 web 控制台中选择和添加引导源有四个方法:
- 上传本地文件(创建 PVC)
- 通过 URL 导入(创建 PVC)
- 克隆现有的 PVC(创建 PVC)
- 通过 Registry 导入(创建 PVC)
先决条件
-
要添加引导源,您必须以具有
os-images.kubevirt.io:edit
RBAC 角色或管理员的用户身份登录。您不需要特殊权限才能从附加了引导源的模板创建虚拟机。 - 要上传本地文件,操作系统镜像文件必须存在于本地机器中。
- 要通过 URL 导入,您需要访问带操作系统镜像的 web 服务器。例如:带有镜像的 Red Hat Enterprise Linux 网页。
- 要克隆现有的 PVC,需要使用 PVC 访问项目。
- 要通过 registry 导入,需要访问容器 registry。
流程
-
在 OpenShift Virtualization 控制台中,从侧边菜单中点击 Workloads
Virtualization。 - 点 Templates 选项卡。
- 找到您要配置引导源的虚拟机模板并点击 Add source。
- 在 Add boot source to template 窗口中,点 Select boot source,选择创建持久性卷声明(PVC)的方法: Upload local file、Import via URL、Clone existing PVC 或 Import via Registry。
- 可选:点 This is a CD-ROM boot source 来挂载 CD-ROM,并使用它将操作系统安装到空磁盘。OpenShift Virtualization 会自动创建并挂载额外的空磁盘。如果不需要额外磁盘,您可以在创建虚拟机时将其删除。
为 持久性卷声明大小 输入一个值,以指定适合未压缩镜像的 PVC 大小,以及任何需要的额外空间。
- 可选:输入 Source 供应商 名称以将名称与此模板关联。
可选 :高级存储设置:点 Storage class 并选择用于创建磁盘的存储类。通常,这个存储类是创建供所有 PVC 使用的默认存储类。
注意提供的引导源会自动更新至操作系统的最新版本。对于自动更新的引导源,持久性卷声明(PVC)使用集群的默认存储类创建。如果在配置后选择了不同的默认存储类,您必须删除使用之前的默认存储类配置的集群命名空间中的现有数据卷。
可选:高级存储设置:点 Access 模式,并为持久性卷选择访问模式:
- 单用户(RWO) 将卷由单一节点以读写模式挂载。
- 共享访问(RWX) 将卷挂载为许多节点以读写模式。
- 只读(ROX) 将卷挂载为多个节点只读。
- 可选:高级存储设置:如果您需要选择 Block 而不是默认的值 Filesystem,点 Volume mode。OpenShift Virtualization 可以静态置备原始块卷。这些卷没有文件系统。对于可以直接写入磁盘或者实现其自己的存储服务的应用程序来说,使用它可以获得性能优势。
选择保存引导源的适当方法:
- 如果您上传一个本地文件,请点击 Save and upload。
- 如果从 URL 或 registry 中导入内容,点 Save and import。
- 如果克隆现有的 PVC,点 Save and clone。
Templates 选项卡中列出了带有引导源的自定义虚拟机模板,您可以使用此模板创建虚拟机。
8.18.15.4. 从带有附加引导源的模板创建虚拟机
在向模板中添加引导源后,您可以使用该模板创建新虚拟机。
流程
- 在 OpenShift Container Platform web 控制台中,在侧边单中点 Workloads > Virtualization。
- 在 Virtual Machines 选项卡或 Templates 选项卡中点 Create 并选择 Virtual Machine with Wizard。
- 在 Select a template 步骤中,从 Operating System 列表中选择一个操作系统,它具有 OS 和版本名称旁的 (Source available) 标签。(Source available) 标签表示这个操作系统可以使用引导源。
- 点 Review and Confirm。
- 检查您的虚拟机设置,并根据需要编辑它们。
- 点 Create Virtual Machine 创建您的虚拟机。此时会显示 Successfully created virtual machine 页面。
8.18.15.5. 创建自定义引导源
您可以基于现有磁盘镜像准备自定义磁盘镜像,以用作引导源。
使用这个流程完成以下任务:
- 准备自定义磁盘镜像
- 从自定义磁盘镜像创建引导源
- 将引导源附加到自定义模板
流程
- 在 OpenShift Virtualization 控制台中,从侧边菜单中点击 Workloads > Virtualization。
- 点 Templates 选项卡。
- 单击您要自定义的模板的 Source provider 列中的链接。此时将显示一个窗口,表明模板当前具有定义的源。
- 在窗口中,单击 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.18.15.6. 其他资源
8.18.16. 热插拔虚拟磁盘
热插拔虚拟磁盘只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的详情,请参考 https://access.redhat.com/support/offerings/techpreview/。
希望在不停止虚拟机或虚拟机实例的情况下添加或删除热插拔和热插拔虚拟磁盘。当您需要在不发生停机时间的情况下向正在运行的虚拟机添加存储时,此功能非常有用。
当您热插拔虚拟磁盘时,可以在虚拟机运行时将虚拟磁盘附加到虚拟机实例中。
当热拔虚拟磁盘时,您可以在虚拟机运行时从虚拟机实例分离虚拟磁盘。
只有数据卷和持久性卷声明(PVC)才能热插和热拔。您不能热插或热拔容器磁盘。
将热插虚拟磁盘附加到虚拟机时,无法在虚拟机上执行实时迁移。如果您试图在附加有热插磁盘的虚拟机上执行实时迁移,实时迁移会失败。
8.18.16.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.18.16.2. 使用 CLI 热拔虚拟磁盘
在虚拟机运行时,热拔您想要从虚拟机实例(VMI)断开的虚拟磁盘。
先决条件
- 您的虚拟机必须正在运行。
- 您必须至少有一个数据卷或持久性卷声明(PVC)可用并为热插。
流程
运行以下命令来热拔虚拟磁盘:
$ virtctl removevolume <virtual-machine|virtual-machine-instance> --volume-name=<datavolume|PVC>
8.18.17. 将容器磁盘与虚拟机搭配使用
您可以将虚拟机镜像构建到容器磁盘中,并将其存储在容器 registry 中。然后,您可以将容器磁盘导入虚拟机的持久性存储中,或者将其直接附加到虚拟机临时存储。
如果您使用大型容器磁盘,则 I/O 流量可能会增加,影响 worker 节点。这可能导致不可用的节点。您可以通过以下方法解决这个问题:
8.18.17.1. 关于容器磁盘
容器磁盘是一个虚拟机镜像,它作为容器镜像存储在容器镜像 registry 中。您可以使用容器磁盘将同一磁盘镜像传送到多个虚拟机,并创建大量虚拟机克隆。
容器磁盘可以使用附加到虚拟机的数据卷导入到持久性卷声明(PVC),也可以作为临时 containerDisk
卷直接附加到虚拟机。
8.18.17.1.1. 使用数据卷将容器磁盘导入到 PVC 中
通过 Containerized Data Importer(CDI)使用数据卷将容器磁盘导入到 PVC 中。然后,您可以将数据卷附加到虚拟机以获取持久性存储。
8.18.17.1.2. 将容器磁盘作为 containerDisk
卷附加到虚拟机
containerDisk
卷是临时的。将在虚拟机停止、重启或删除时丢弃。当一个带有 containerDisk
卷的虚拟机启动时,容器镜像从 registry 中拉取,并托管在托管虚拟机的节点上。
将 containerDisk
卷用于只读文件系统,如 CD-ROM 或可处理的虚拟机。
不建议将 containerDisk
卷用于读写文件系统,因为数据是临时写入托管节点上的本地存储。这会减慢虚拟机的实时迁移速度,如节点维护,因为数据必须迁移到目标节点。另外,如果节点断电或者意外关闭,则所有数据都会丢失。
8.18.17.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.18.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 主机名。
8.18.17.4. 后续步骤
- 将容器磁盘导入虚拟机的持久性存储中。
-
创建一个虚拟机,它使用一个
containerDisk
卷作为临时存储。
8.18.18. 准备 CDI 涂销空间
8.18.18.1. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。
8.18.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。
8.18.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。 |
8.18.18.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.18.18.5. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间
8.18.18.6. 其他资源
8.18.19. 重新使用持久性卷
要重新使用静态置备的持久性卷(PV),,您必须首先重新声明该卷。这涉及删除 PV,以便重新使用存储配置。
8.18.19.1. 关于重新声明静态置备的持久性卷
当重新声明持久性卷(PV)时,您从持久性卷声明(PVC)中卸载 PV 并删除 PV。根据底层存储,您可能需要手动删除共享存储。
然后,您可以重新使用 PV 配置来创建具有不同名称的 PV。
静态置备的 PV 必须具有 Retain
的重新声明策略才能重新声明。如果没有,则当 PVC 取消和 PV 的绑定后,PV 将进入失败的状态。
在 OpenShift Container Platform 4 中, Recycle
重新声明策略已被弃用。
8.18.19.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.18.20. 删除数据卷
您可以使用 oc
CLI 手动删除数据卷。
当您删除虚拟机时,其使用的数据卷会被自动删除。
8.18.20.1. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。数据卷与 OpenShift Virtualization 集成,它们可在 PVC 准备好前阻止虚拟机启动。
8.18.20.2. 列出所有数据卷
您可以使用 oc
CLI 列出集群中的数据卷。
流程
运行以下命令列出所有数据卷:
$ oc get dvs
8.18.20.3. 删除数据卷
您可以使用 oc
CLI 删除数据卷。
先决条件
- 找出您要删除的数据卷的名称。
流程
运行以下命令来删除数据卷:
$ oc delete dv <datavolume_name>
注意此命令只删除当前项目中存在的对象。如果您要删除其他项目或命名空间中的对象,请使用
-n <project_name>
选项。