OpenShift Virtualization - 虚机存储的相关概念 DataVolume、CDI 和 StorageProfile
《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在 OpenShift 4.18 环境中验证
文章目录
- DataVolume 和 Containerized Data Importer (CDI)
- DataVolume 和 PVC 的关系
- DataVolume 和 CDI 的关系
- PVC 和 CDI 的关系
- StorageProfile 和 StorageClass 的关系
- 参考
为给虚机提供存储,KubeVirt 在 Kubernetes 的基础上增加了一些存储对象和概念,它们主要包括 DataVolume、CDI、StorageProfile 等。
DataVolume 和 Containerized Data Importer (CDI)
DataVolume 和 CDI 是两个紧密协作的组件,它们共同构成了 KubeVirt 虚拟机磁盘管理的核心机制。DataVolume 是声明式 API 用来定义虚机使用的磁盘存储,虚机除了可以直接使用 PVC 作为磁盘存储外,还可使用 DataVolume 作为磁盘存储(因为 DataVolume 其实是自动关联一个对应 PVC 的)。而 CDI 是运行引擎,它可根据 DataVolume 的定义将数据从源自动填充到 DataVolume 所关联的 PVC 中。
- DataVolume 是一个 Kubernetes 自定义资源(CRD),用来定义虚机用到的一个存储以及如何从各种外部源将已有数据自动导入到 PVC 中(导入过程由 CDI 环境执行)。
- CDI 负责将来自各种源头的磁盘文件数据导入到由 DataVolume 声明的 PVC 中。它使用 StorageProfile 中定义的优选配置与各种存储提供商进行交互。
DataVolume 和 PVC 的关系
我们可以把 DataVolume 看成一个高阶的 PVC,因为在创建一个 DataVolume 的时候除了会创建一个同名的 PVC 以外,CDI 还可将外部数据导入到该 PVC 中。
- 创建一个 DataVolume 对象。指定使用 ocs-external-storagecluster-cephfs 存储类(说明将是 FileSystem 类型)分配存储空间,存储空间分配 1Gi,且不用向存储复制任何附加内容。
$ oc apply -f - << EOF
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:name: blank-fs-dv
spec:source:blank: {}storage:resources:requests:storage: 1GistorageClassName: ocs-external-storagecluster-cephfs
EOF
- 查看有同名的 PVC 被创建。注意:PVC 的实际容量为 2Gi,多占用的空间可能是为构建文件系统所需。
$ oc get pvc blank-fs-dv
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
blank-fs-dv Bound pvc-0d870dff-d21c-418f-b8ef-59faaa70c43d 2Gi RWX ocs-external-storagecluster-cephfs <unset> 25s
- 删除 DV 对象,确认对应的同名 PVC 也被自动删除。
$ oc delete dv blank-fs-dv
$ oc get pvc blank-fs-dv
DataVolume 和 CDI 的关系
DataVolume 用来声明虚机使用的存储,以及定义如何从各种外部源将数据导入到 PVC 中,而导入过程是由 CDI 环境执行的。
- 在 3 个窗口中各执行以下一条命令,跟踪 CDI 导入数据过程、DataVolume 状态变化和 PVC 的变化情况。
$ oc get pod -w
$ oc get dv -w
$ oc get pvc -w
- 再次创建 DataVolume 对象。
$ oc apply -f - << EOF
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:name: blank-fs-dv
spec:source:blank: {}storage:resources:requests:storage: 1GistorageClassName: ocs-external-storagecluster-cephfs
EOF
- 可以看到执行 CDI 导入操作的 pod 运行情况、DataVolume 的状态变化和 PVC 的变化情况。注意:该过程除了创建名为 blank-fs-dv 的 PVC 外还有一个辅助 PVC。
$ oc get pod -w
NAME READY STATUS RESTARTS AGE
importer-prime-bbb324ed-0073-47c0-8dba-418813d5524f 0/1 Pending 0 0s
importer-prime-bbb324ed-0073-47c0-8dba-418813d5524f 0/1 Pending 0 0s
importer-prime-bbb324ed-0073-47c0-8dba-418813d5524f 0/1 Pending 0 1s
importer-prime-bbb324ed-0073-47c0-8dba-418813d5524f 0/1 Pending 0 1s
importer-prime-bbb324ed-0073-47c0-8dba-418813d5524f 0/1 ContainerCreating 0 1s
importer-prime-bbb324ed-0073-47c0-8dba-418813d5524f 0/1 ContainerCreating 0 7s
importer-prime-bbb324ed-0073-47c0-8dba-418813d5524f 0/1 Completed 0 7s
importer-prime-bbb324ed-0073-47c0-8dba-418813d5524f 0/1 Completed 0 9s$ oc get dv -w
NAME PHASE PROGRESS RESTARTS AGE
blank-fs-dv 0s
blank-fs-dv 0s
blank-fs-dv Pending 0s
blank-fs-dv Pending N/A 0s
blank-fs-dv ImportScheduled N/A 1s
blank-fs-dv ImportScheduled N/A 7s
blank-fs-dv Succeeded 100.0% 9s
blank-fs-dv Succeeded 100.0% 9s$ oc get pvc -w
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
blank-fs-dv Pending ocs-external-storagecluster-cephfs <unset> 0s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Pending ocs-external-storagecluster-cephfs <unset> 0s
blank-fs-dv Pending ocs-external-storagecluster-cephfs <unset> 0s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Pending ocs-external-storagecluster-cephfs <unset> 0s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Pending ocs-external-storagecluster-cephfs <unset> 0s
blank-fs-dv Pending ocs-external-storagecluster-cephfs <unset> 0s
blank-fs-dv Pending ocs-external-storagecluster-cephfs <unset> 5s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Pending ocs-external-storagecluster-cephfs <unset> 5s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Pending pvc-89a3b968-3d86-4c62-ac7c-97d3cbb20a77 0 ocs-external-storagecluster-cephfs <unset> 5s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Bound pvc-89a3b968-3d86-4c62-ac7c-97d3cbb20a77 2Gi RWX ocs-external-storagecluster-cephfs <unset> 5s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Bound pvc-89a3b968-3d86-4c62-ac7c-97d3cbb20a77 2Gi RWX ocs-external-storagecluster-cephfs <unset> 10s
blank-fs-dv Pending ocs-external-storagecluster-cephfs <unset> 10s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Bound pvc-89a3b968-3d86-4c62-ac7c-97d3cbb20a77 2Gi RWX ocs-external-storagecluster-cephfs <unset> 15s
blank-fs-dv Pending ocs-external-storagecluster-cephfs <unset> 15s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Bound pvc-89a3b968-3d86-4c62-ac7c-97d3cbb20a77 2Gi RWX ocs-external-storagecluster-cephfs <unset> 16s
blank-fs-dv Pending ocs-external-storagecluster-cephfs <unset> 16s
blank-fs-dv Pending pvc-89a3b968-3d86-4c62-ac7c-97d3cbb20a77 0 ocs-external-storagecluster-cephfs <unset> 16s
blank-fs-dv Bound pvc-89a3b968-3d86-4c62-ac7c-97d3cbb20a77 2Gi RWX ocs-external-storagecluster-cephfs <unset> 16s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Lost pvc-89a3b968-3d86-4c62-ac7c-97d3cbb20a77 0 ocs-external-storagecluster-cephfs <unset> 20s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Terminating pvc-89a3b968-3d86-4c62-ac7c-97d3cbb20a77 0 ocs-external-storagecluster-cephfs <unset> 20s
prime-bd250c74-5649-4d56-b990-bea277a13fb2 Terminating pvc-89a3b968-3d86-4c62-ac7c-97d3cbb20a77 0 ocs-external-storagecluster-cephfs <unset> 20s
- 删除 DV 对象,对应的同名 PVC 也被自动删除。
$ oc delete dv blank-fs-dv
PVC 和 CDI 的关系
除了在前面
- 各执行以下命令,跟踪 CDI 导入数据过程和 PVC 的变化情况。
$ oc get pod -w
- 直接通过 YAML 创建 PVC。注意:YAML 中包含
app: containerized-data-importer
标签和cdi.kubevirt.io/storage.import.source: "none"
注释。CDI 在检查到有该注释后也会自动将 source 的数据导入到 PVC 中。
$ oc apply -f - << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: bland-fs-pvclabels:app: containerized-data-importerannotations:cdi.kubevirt.io/storage.import.source: "none"
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: ocs-external-storagecluster-cephfsvolumeMode: Filesystem
EOF
- 确认有 CDI 的 pod 运行。
$ oc get pod -w
NAME READY STATUS RESTARTS AGE
importer-bland-fs-pvc 0/1 Pending 0 0s
importer-bland-fs-pvc 0/1 Pending 0 0s
importer-bland-fs-pvc 0/1 ContainerCreating 0 0s
importer-bland-fs-pvc 0/1 ContainerCreating 0 2s
importer-bland-fs-pvc 1/1 Running 0 2s
importer-bland-fs-pvc 0/1 Completed 0 4s
StorageProfile 和 StorageClass 的关系
KubeVirt 的 StorageProfile 可看成是 StorageClass 的"虚拟机专用增强版"。它是为虚拟机优化使用存储而用,主要作用有:
- 引用关联一个特定的 StorageClass,通常 StorageProfile 和 StorageClass 名称一样
- 根据所关联的 StorageClass 提供相应的存储设置建议和默认值
- 指导 CDI 组件如何处理虚拟机磁盘操作
- 查看系统已有的 StorageProfile 和 StorageClass,确认他们的名称是一样的。
$ oc get storageprofiles
NAME AGE
ocs-external-storagecluster-ceph-rbd 9d
ocs-external-storagecluster-ceph-rbd-immediate 9d
ocs-external-storagecluster-cephfs 9d
openshift-storage.noobaa.io 9d$ oc get storageclasses
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
ocs-external-storagecluster-ceph-rbd (default) openshift-storage.rbd.csi.ceph.com Delete WaitForFirstConsumer true 9d
ocs-external-storagecluster-ceph-rbd-immediate openshift-storage.rbd.csi.ceph.com Delete Immediate true 9d
ocs-external-storagecluster-cephfs openshift-storage.cephfs.csi.ceph.com Delete Immediate true 9d
openshift-storage.noobaa.io openshift-storage.noobaa.io/obc Delete Immediate false 9d
- 查看一个系统已有的 StorageProfile。注意:accessModes、cloneStrategy、volumeMode 等都是它的默认配置。
$ oc get storageprofile ocs-external-storagecluster-cephfs -oyaml
apiVersion: cdi.kubevirt.io/v1beta1
kind: StorageProfile
metadata:creationTimestamp: "2025-09-06T11:14:52Z"generation: 1labels:app: containerized-data-importerapp.kubernetes.io/component: storageapp.kubernetes.io/managed-by: cdi-controllerapp.kubernetes.io/part-of: hyperconverged-clusterapp.kubernetes.io/version: 4.18.0cdi.kubevirt.io: ""name: ocs-external-storagecluster-cephfsownerReferences:- apiVersion: cdi.kubevirt.io/v1beta1blockOwnerDeletion: truecontroller: truekind: CDIname: cdi-kubevirt-hyperconvergeduid: cee16ca6-f0d6-45e0-8da0-1612df3110aeresourceVersion: "54916"uid: a764e23a-7912-46f7-a895-e5d2f48cde3f
spec: {}
status:claimPropertySets:- accessModes:- ReadWriteManyvolumeMode: FilesystemcloneStrategy: csi-clonedataImportCronSourceFormat: pvcprovisioner: openshift-storage.cephfs.csi.ceph.comsnapshotClass: ocs-external-storagecluster-cephfsplugin-snapclassstorageClass: ocs-external-storagecluster-cephfs
参考
https://github.com/kubevirt/containerized-data-importer/blob/main/doc/datavolumes.md
https://kubevirt.io/2018/containerized-data-importer.html
https://kubevirt.io/2018/CDI-DataVolumes.html
https://docs.redhat.com/en/documentation/openshift_container_platform/3.11/html/container-native_virtualization_users_guide/container-native-virtualization-users-guide#cnv_userguide_adding_storage