跳转至

5.跨名称空间传输PVC

名称空间之间对象传输

参考官档

对象传输ObjectTransfer允许在名称空间之间逻辑地 移动 persistentvolumeclclaimsDataVolumesObjectTransfer通过处理Kubernetes API资源来实现这一点,并且 不移动卷上的任何物理数据。 该API由CDI控制器在内部使用,以促进DataVolumes的高效跨名称空间克隆。集群管理员可以直接使用Object Transfer API。

使用ObjectTransfer,会 删除源DV或者PVC。如果指定的源是PVC,但该PVC是关联着DV(源实际是一个DV),则在移动后,源PVC会重建出来(因为该PVC是关联DV的,DV未被删除),会造成源PVC未被删除的错觉。

  1. 测试示例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. 测试示例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名称空间。

    # kubectl get pvc
    No resources found in default namespace.
    
    # kubectl get pvc -n test
    NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
    img-cirros02   Bound    pvc-100ebaa4-0d26-4fb7-b296-d6c547aa93a0   954Mi      RWO            ceph-hdd-block   82s
    

  3. 测试示例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 都被移除后,资源才会真正被删除。 在KubeVirtCDI 的上下文中,provisioner.storage.kubernetes.io/cloning-protection Finalizer 用于保护克隆操作。当创建一个新的 VM 并从现有的PVC克隆数据时, 这个 Finalizer 会防止你意外删除源PVC导致克隆失败。 然而,这个 Finalizer 可能会阻止 CDI 的 Namespace Transfer 功能,因为它阻止了 PVC 的删除。在这种情况下,你可能需要手动从 PVC 的 Finalizers 列表中删除它。但请注意,这可能会增加数据丢失的风险,因此你应该只在明确知道你在做什么的情况下这样做。