5.跨名称空间传输PVC
名称空间之间对象传输¶
对象传输ObjectTransfer允许在名称空间之间逻辑地 移动 persistentvolumeclclaims和DataVolumes。
ObjectTransfer通过处理Kubernetes API资源来实现这一点,并且 不移动卷上的任何物理数据。
该API由CDI控制器在内部使用,以促进DataVolumes的高效跨名称空间克隆。集群管理员可以直接使用Object Transfer API。
使用ObjectTransfer,会 删除源DV或者PVC。如果指定的源是PVC,但该PVC是关联着DV(源实际是一个DV),则在移动后,源PVC会重建出来(因为该PVC是关联DV的,DV未被删除),会造成源PVC未被删除的错觉。
- 测试示例1,移动DV
--- # DV apiVersion: cdi.kubevirt.io/v1beta1 kind: DataVolume metadata: name: img-cirros01 namespace: default spec: source: http: url: http://images.demo.com:10800/images/cirros-0.5.1-x86_64-disk.img pvc: storageClassName: "ceph-hdd-block" accessModes: - ReadWriteMany resources: requests: storage: 1Gi volumeMode: Block --- ## 源为DV apiVersion: cdi.kubevirt.io/v1beta1 kind: ObjectTransfer metadata: name: t1 spec: source: kind: DataVolume namespace: default name: img-cirros01 target: namespace: test name: img-cirros01上述示例的结果是:将名为img-cirros01的dv从
default名称空间移动到了test名称空间。 -
测试示例2,移动PVC
## 模拟创建一个带有镜像的PVC cat > cirros02.sh <<EOF virtctl image-upload pvc pvc-image-cirros01 \ --size 2Gi \ --access-mode=ReadWriteMany \ --volume-mode=block \ --insecure \ --uploadproxy-url=https://12.107.65.150 \ --image-path=./cirros-0.5.1-x86_64-disk.img EOF # sh cirros02.sh # kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE img-cirros02 Bound pvc-100ebaa4-0d26-4fb7-b296-d6c547aa93a0 954Mi RWO ceph-hdd-block 25s## 源为PVC apiVersion: cdi.kubevirt.io/v1beta1 kind: ObjectTransfer metadata: name: t2 spec: source: kind: PersistentVolumeClaim namespace: default name: pvc-image-cirros01 target: namespace: test name: pvc-image-cirros01上述示例的结果是:将名为img-cirros02的pvc从
default名称空间移动到了test名称空间。 -
测试示例3,移动PVC,但源实际是DV
--- # DV apiVersion: cdi.kubevirt.io/v1beta1 kind: DataVolume metadata: name: img-cirros03 namespace: default spec: source: http: url: http://images.demo.com:10800/images/cirros-0.5.1-x86_64-disk.img pvc: storageClassName: "ceph-hdd-block" accessModes: - ReadWriteMany resources: requests: storage: 1Gi volumeMode: Block --- ## 源为PVC,但该PVC有关联DV apiVersion: cdi.kubevirt.io/v1beta1 kind: ObjectTransfer metadata: name: t3 spec: source: kind: PersistentVolumeClaim namespace: default name: img-cirros03 target: namespace: test name: img-cirros03上述示例结果是:将名为img-cirros03的pvc从
default名称空间移动到了test名称空间。但因为img-cirros03是关联着DV的,所以在删除后pvc又重建出来了。 给人的错觉是源PVC没有删除,但可以从创建时间上看出来。# kubectl get dv NAME PHASE PROGRESS RESTARTS AGE img-cirros03 Succeeded 100.0% 1 72s [root@ceph01 images]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE img-cirros03 Bound pvc-7a45b449-4e8c-4801-913e-ea22e6737e0c 1Gi RWX ceph-hdd-block 50s [root@ceph01 images]# kubectl get pvc -n test NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE img-cirros03 Bound pvc-ff8287e8-88ed-4883-864c-472b00e8baaf 1Gi RWX ceph-hdd-block 53s
说明:当源PVC的Finalizers中有
provisioner.storage.kubernetes.io/cloning-protection时,传输会一直处于pending状态。provisioner.storage.kubernetes.io/cloning-protection是一个 Kubernetes Finalizer,它被用于保护在克隆过程中创建的PVC。 这个 Finalizer 确保在克隆操作完成之前,源PVC不会被删除。在Kubernetes中,
Finalizers是一种机制,允许在删除资源之前执行一些清理操作。 当试图删除一个带有Finalizers的资源时,Kubernetes 会先将该资源标记为 "正在删除",然后运行与 Finalizer 关联的清理操作。只有当所有的Finalizer都被移除后,资源才会真正被删除。 在KubeVirt和CDI的上下文中,provisioner.storage.kubernetes.io/cloning-protection Finalizer 用于保护克隆操作。当创建一个新的 VM 并从现有的PVC克隆数据时, 这个 Finalizer 会防止你意外删除源PVC导致克隆失败。 然而,这个 Finalizer 可能会阻止 CDI 的 Namespace Transfer 功能,因为它阻止了 PVC 的删除。在这种情况下,你可能需要手动从 PVC 的 Finalizers 列表中删除它。但请注意,这可能会增加数据丢失的风险,因此你应该只在明确知道你在做什么的情况下这样做。